如何在Python中删除某些连通组件?

3 投票
1 回答
2320 浏览
提问于 2025-04-18 08:07

假设我们有一张二值化的图片,我用 scipy.ndimage.label() 这个工具处理它,然后对结果使用 find_objects()

现在我得到了一个包含 N 个元组的列表,每个元组里有两个切片,像这样:

index  value
 0   (slice(0, 21, None) slice(0, 12, None)) 
 1   (slice(0, 42, None) slice(7, 31, None))
 .   (...., ....)

这些切片描述了连接区域的 x-y 边界坐标。

以第一个元组为例:

slice(0, 21, None) 表示行号从 0 到 21,

slice(0, 12, None) 表示列号从 0 到 12。

所以我们可以知道这个连接区域的面积是 21 * 12 = 252

现在我想去掉那些面积小于 300 的连接区域。

我已经知道可以通过遍历所有的连接区域来实现这个目标,但我想找一个更高效的方法;有没有人知道该怎么做?

1 个回答

3

使用这段代码可以解决我的问题:

def CC(Map):
    label_img, cc_num = ndimage.label(Map)
    CC = ndimage.find_objects(label_img)
    cc_areas = ndimage.sum(Map, label_img, range(cc_num+1))
    area_mask = (cc_areas < 1500)
    label_img[area_mask[label_img]] = 0
return label_img, CC

在我看来,area_mask[label_img] 是最重要的遮罩技巧。

撰写回答