Image processing 如何使用scipy.ndimage查找最大连接区域?

Image processing 如何使用scipy.ndimage查找最大连接区域?,image-processing,scipy,ndimage,Image Processing,Scipy,Ndimage,我有一个二值图像。二值图像有一些像噪声这样的孤立区域。我知道预期区域比这些孤立区域大得多。因此,我使用连接的组件通过查找最大的连接区域来删除隔离区域。我必须使用scipy软件包。我发现它有一些功能。然而,我离结果还很远。如何使用这些函数获得可以忽略孤立区域的二值图像?谢谢 from scipy import ndimage label_im, nb_labels = ndimage.label(binary_img) # Find the largest connected component

我有一个二值图像。二值图像有一些像噪声这样的孤立区域。我知道预期区域比这些孤立区域大得多。因此,我使用连接的组件通过查找最大的连接区域来删除隔离区域。我必须使用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
从scipy导入ndimage
label\u im,nb\u labels=ndimage.label(二进制\u img)
#查找最大的连接组件
大小=ndimage.sum(二进制图像、标签图像、范围(nb标签+1))
遮罩尺寸=尺寸<1000
移除\u像素=遮罩大小[标签\u im]
标签\u im[移除\u像素]=0
标签=np.唯一(标签\u im)
二进制\u img=np.searchsorted(标签,标签\u im)
#选择最大的连接组件
二进制\u img[二进制\u img=二进制\u img.max()]=1

您有了一个良好的开端,使用
ndimage.sum
查找每个标记区域的大小

从那里,您可以使用
大小
(或从中派生的内容)作为查找表:

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
。使用带标签的图像索引到查找表会生成所需的二进制图像

请注意,
size[label\u im]
是一个图像,其中每个区域都绘制有其大小。也就是说,区域#1中的每个像素获得区域#1大小的值。您可以设置此图像的阈值以删除小区域:

size_img = sizes[label_im]
binary_img = size_img > 1000

(这两行相当于前面代码段的最后两行。)

我想找到一个具有最大连接组件的区域。那么,解决方案如何
mask=max(size)
?因为我不知道值
1000
。在某些图像中,隔离区域的大小可能大于1000@Jame:这将是
mask=size==max(size)
或类似的内容,仅适用于与最大元素一样大的元素。这可能是多个对象,如果它们的大小完全相同。