方法 1:连通域过滤(最干净、最有效)
适合去掉“小白点”、碎片、小块噪声。
def remove_small_regions(mask, min_area=100):
"""
mask: float32, 0~1
返回清理后的 mask (float32)
"""
# 转为 uint8
mask_u8 = (mask * 255).astype(np.uint8)
# 连通域分析
num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(mask_u8)
# stats[:, cv2.CC_STAT_AREA] 是每个连通域面积
cleaned = np.zeros_like(mask_u8)
for i in range(1, num_labels): # 0 是背景
area = stats[i, cv2.CC_STAT_AREA]
if area >= min_area:
cleaned[labels == i] = 255
return (cleaned / 255.0).astype(np.float32)
使用:
clean_mask = remove_small_regions(mask, min_area=150)
✅ 方法 2:形态学开运算(去孤立白点,非常快)
-
腐蚀 + 膨胀
-
小白点直接被去掉
def remove_small_dots(mask, ksize=3):
mask_u8 = (mask * 255).astype(np.uint8)
kernel = np.ones((ksize, ksize), np.uint8)
opened = cv2.morphologyEx(mask_u8, cv2.MORPH_OPEN, kernel)
return (opened / 255.0).astype(np.float32)
✅ 方法 3:开运算 + 连通域(最强组合)
先去小 dot
再把残留小块区域过滤掉
clean = remove_small_dots(mask, ksize=3) clean = remove_small_regions(clean, min_area=150)
1846

被折叠的 条评论
为什么被折叠?



