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_objects
的 source 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
在其他任何地方。
我正在使用 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_objects
的 source 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
在其他任何地方。