• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
图像分割 3D-Box-Segment-Anything(4)如何对建筑物检测提升

 

 

您说得对!SAM模型对地面建筑物检测确实存在一些问题,特别是对于无人机视角的建筑。我来为您提供几种优化方案:

​​1. 提示优化策略​​

​​改进点提示选择​

import numpy as np
from segment_anything import SamPredictor

def optimize_building_segmentation(image, predictor):
    """优化建筑物分割的提示策略"""
    
    # 策略1:多点提示(建筑物通常有角点特征)
    building_points = [
        [x1, y1],  # 左上角
        [x2, y2],  # 右上角  
        [x3, y3],  # 左下角
        [x4, y4]   # 右下角
    ]
    
    # 策略2:边界框 + 内部点
    input_box = np.array([x_min, y_min, x_max, y_max])
    interior_point = np.array([[x_center, y_center]])
    
    # 组合提示
    masks, scores, _ = predictor.predict(
        point_coords=np.array(building_points),
        point_labels=np.array([1, 1, 1, 1]),  # 全是前景点
        box=input_box[None, :],
        multimask_output=True
    )
    
    return masks, scores

# 使用示例
predictor.set_image(drone_image)
optimized_masks, scores = optimize_building_segmentation(drone_image, predictor)

  

2. 后处理优化​​

​​建筑物特定的后处理​

 

import cv2
import numpy as np
from scipy import ndimage

def building_specific_postprocess(mask, image):
    """建筑物专用的后处理"""
    
    # 1. 形态学操作 - 填补空洞,平滑边界
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
    mask_processed = cv2.morphologyEx(mask.astype(np.uint8), cv2.MORPH_CLOSE, kernel)
    mask_processed = cv2.morphologyEx(mask_processed, cv2.MORPH_OPEN, kernel)
    
    # 2. 轮廓优化 - 建筑物通常有直线边界
    contours, _ = cv2.findContours(mask_processed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    optimized_contours = []
    for contour in contours:
        # 多边形近似 - 适合建筑物的几何形状
        epsilon = 0.02 * cv2.arcLength(contour, True)
        approx = cv2.approxPolyDP(contour, epsilon, True)
        optimized_contours.append(approx)
    
    # 3. 创建优化后的掩码
    optimized_mask = np.zeros_like(mask_processed)
    cv2.drawContours(optimized_mask, optimized_contours, -1, 1, -1)
    
    # 4. 面积过滤 - 移除太小的区域
    labeled_mask, num_features = ndimage.label(optimized_mask)
    for i in range(1, num_features + 1):
        component = (labeled_mask == i)
        if np.sum(component) < 1000:  # 最小面积阈值
            optimized_mask[component] = 0
    
    return optimized_mask.astype(bool)

  

posted on 2025-10-22 05:51  MKT-porter  阅读(5)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3