如何在Python中删除某些连通组件?
假设我们有一张二值化的图片,我用 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] 是最重要的遮罩技巧。