scikit-image - felzenszwalb 分割:删除大段

scikit-image - felzenszwalb segmentation: remove large segments

我正在使用 skimage.segmentation.felzenszwalb,如图 here 所示,它很棒。

我已经尽可能地调整了参数,但它仍然检测到一些我不希望它检测到的大片段。之后如何删除超过一定大小的段?我知道您可以使用 skimage.measure.regionprops 来获取每个段的面积,但我不确定如何从 segments_fz 中删除一个段,让数组保持完整 mark_boundaries.

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 类似,但他们试图移除小对象,而不是大对象。

查看 skimage.morphology.remove_small_objectssource code。有很多预处理/输入清理,但业务端很简单。假设 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 包含 True 每当你想将标签 i 归零,而 False 在其他任何地方。