能否用morphology.remove_small_objects移除大目标?如何设置范围阈值?
针对
morphology.remove_small_objects的范围过滤问题解答 核心结论
skimage.morphology.remove_small_objects仅支持移除面积小于指定阈值的对象,无法直接通过设置30-200的范围阈值同时过滤小对象和大对象。要实现保留30-200面积范围的目标,需要结合其他工具处理。
解决方案1:结合区域标记实现范围过滤
通过skimage.measure.label和regionprops统计连通区域的面积,筛选出30-200之间的区域:
from skimage import morphology, measure import numpy as np # 第一步:移除面积小于30的小对象 mask_filtered_small = morphology.remove_small_objects(mask, min_size=30) # 标记所有连通区域 labeled_mask = measure.label(mask_filtered_small) # 获取每个区域的属性(包含面积) region_props = measure.regionprops(labeled_mask) # 构建最终mask,只保留面积在30-200之间的区域 final_mask = np.zeros_like(mask_filtered_small) for prop in region_props: if 30 <= prop.area <= 200: final_mask[labeled_mask == prop.label] = 1
解决方案2:移除面积最大的目标(适配你的场景)
如果你的需求只是移除左侧的大红色区域(即面积最大的对象),可以直接统计区域面积并排除最大项,再结合小对象过滤:
from skimage import morphology, measure import numpy as np # 标记连通区域 labeled_mask = measure.label(mask) region_props = measure.regionprops(labeled_mask) # 找到面积最大的区域 max_area = max(prop.area for prop in region_props) # 先排除最大区域,再移除小对象 temp_mask = np.zeros_like(mask) for prop in region_props: if prop.area != max_area: temp_mask[labeled_mask == prop.label] = 1 final_mask = morphology.remove_small_objects(temp_mask, min_size=30)
内容的提问来源于stack exchange,提问作者Dude Rar
相关产品推荐
相关产品推荐

