我有一个二进制图像。二进制图像具有一些隔离区域,例如噪声。我知道预期区域比这些孤立区域大得多。因此,我使用连接的组件通过找到最大的连接区域来删除隔离区域。我必须使用scipy软件包。我发现它具有某些功能。但是,我仍然遥遥无期。如何使用函数来获取可以忽略孤立区域的二进制图像?谢谢
from scipy import ndimage
label_im, nb_labels = ndimage.label(binary_img)
# Find the largest connected component
sizes = ndimage.sum(binary_img, label_im, range(nb_labels + 1))
mask_size = sizes < 1000
remove_pixel = mask_size[label_im]
label_im[remove_pixel] = 0
labels = np.unique(label_im)
binary_img= np.searchsorted(labels, label_im)
#Select the biggest connected component
binary_img[binary_img < binary_img.max()]=0
binary_img[binary_img >= binary_img.max()]=1
答案 0 :(得分:2)
您可以使用ndimage.sum
查找每个标记区域的大小。
从那里,您可以使用sizes
(或从中派生的东西)作为查找表:
from scipy import ndimage
label_im, nb_labels = ndimage.label(binary_img)
sizes = ndimage.sum(binary_img, label_im, range(nb_labels + 1))
mask = sizes > 1000
binary_img = mask[label_im]
这将创建一个查找表mask
,该查找表是true
,用于与较大区域的标签相对应的索引,false
在其他位置。使用标记的图像索引到查找表中会生成所需的二进制图像。
请注意,sizes[label_im]
是每个区域都按其大小绘制的图像。即,区域#1中的每个像素都获得区域#1的大小的值。您可以将此图像设置为阈值以删除较小的区域:
size_img = sizes[label_im]
binary_img = size_img > 1000
(这两行等效于上一代码段的最后两行。)