Numpy scikit图像-felzenszwalb分割:删除大片段
如图所示,我正在使用Numpy scikit图像-felzenszwalb分割:删除大片段,numpy,image-segmentation,scikit-image,Numpy,Image Segmentation,Scikit Image,如图所示,我正在使用skimage.segmentation.felzenszwalb,这很好 我已经尽可能地调整了参数,但它仍然检测到一些我不希望它检测到的大片段。之后如何删除超过特定大小的段?我知道您可以使用skimage.measure.regionprops来获取每个段的面积,但我不知道如何从段fz中删除段,让数组保持与标记边界的接触 import numpy as np import skimage.io from skimage.util import img_as_float fr
skimage.segmentation.felzenszwalb
,这很好
我已经尽可能地调整了参数,但它仍然检测到一些我不希望它检测到的大片段。之后如何删除超过特定大小的段?我知道您可以使用skimage.measure.regionprops
来获取每个段的面积,但我不知道如何从段fz
中删除段,让数组保持与标记边界的接触
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)
这与类似,但他们正在尝试删除小对象,而不是大对象。请查看forskimage.morphology.remove_small_objects
。有很多预处理/输入清理,但业务端非常简单。假设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
out=np.copy(段)
组件大小=np.bincount(segments.ravel())
太小=部件尺寸<最小尺寸
太小的遮罩=太小的[段]
out[太小的遮罩]=0
返回
您可以将太小
更改为太大
,或者任何您想要的条件!关键是要在该行生成一个数组,该数组包含位置i处的True
,无论何时您要将标签i归零,以及False
任何其他位置