我正在使用显示here的skimage.segmentation.felzenszwalb
,这很棒。
我尽可能地调整了参数,但它仍然检测到一些我不想要的大段。如何在之后删除超过一定大小的段?我知道您可以使用skimage.measure.regionprops
来获取每个细分的区域,但我不知道如何从segments_fz
移除细分,让数组保持mark_boundaries
。< / p>
import numpy as np
import skimage.io
from skimage.util import img_as_float
from skimage.segmentation import felzenszwalb
from skimage.segmentation import mark_boundaries
img = img_as_float(astronaut()[::2, ::2])
segments_fz = felzenszwalb(img, scale=100, sigma=0.5, min_size=50)
print("Felzenszwalb number of segments: {}".format(len(np.unique(segments_fz))))
segmented_img = mark_boundaries(img, segments_fz)
skimage.io.imsave('img_labeled.png', segmented_img)
这与this post类似,但他们正在尝试删除小对象,而不是大对象。
答案 0 :(得分:1)
查看skimage.morphology.remove_small_objects
的{{3}}。有很多预处理/输入清理,但业务端非常简单。假设segments
是带有分段标签的输入图像,这里是函数的作用:
out = np.copy(segments)
component_sizes = np.bincount(segments.ravel())
too_small = component_sizes < min_size
too_small_mask = too_small[segments]
out[too_small_mask] = 0
return out
您可以将too_small
更改为too_big
,或者您想要的任何条件!关键是要在该行生成一个数组,当你想要将标签i归零时,在{i}位置包含True
,在其他地方False
。{/ p>