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

时间:2017-02-20 17:26:59

标签: numpy image-segmentation scikit-image

我正在使用显示hereskimage.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类似,但他们正在尝试删除小对象,而不是大对象。

1 个答案:

答案 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>