使用skimage去除二值图内部0值小斑点时函数无效怎么办
问题根源
你调用的函数和要实现的需求完全不匹配,这是处理没效果的核心原因:
morphology.remove_small_objects()的作用是删除二值图中像素值为1的前景区域里,面积低于阈值的小连通块,它不会对像素值为0的背景区域做任何处理,自然没法清除前景内部像素值为0的小斑点(也就是前景包裹的孔洞)。- 额外注意:这个函数要求输入的二值图为布尔(bool)类型,如果你的
img_test是uint8格式的0/1数值数组,哪怕是要删除前景小碎块,也可能出现调参完全没效果的情况。
正确实现方式
要去除前景(值为1)内部值为0的小斑点,需要调用专门处理孔洞的remove_small_holes函数,操作步骤如下:
- 先把输入图像转为bool类型(如果已经是bool格式可以跳过这步)
from skimage import morphology import numpy as np img_bool = img_test.astype(bool)
- 调用小孔洞移除函数,
area_threshold参数设置为你要过滤的0值小斑点的最大面积,连通性参数connectivity根据需求选1(4连通)或2(8连通)即可:
# 示例为过滤面积小于500的内部0值斑点 im1 = morphology.remove_small_holes(img_bool, area_threshold=500, connectivity=1) # 如果后续需要使用0/1数值格式的图像,转回对应类型即可 im1 = im1.astype(np.uint8)
补充
如果同时需要清除前景外的零散小碎块、填充前景内的小斑点,两个函数按顺序配合使用就行:先调用remove_small_objects清理前景碎块,再调用remove_small_holes填充内部孔洞。

内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

