You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:45:46