如何在二进制 3D 图像中找到簇?

How to find clusters in binary 3D image?

我有一个二进制 3D 图像,即它只包含 0 和 1。现在我想找到所有 1 的簇(即仅包含值 1 的体素簇)。最后,对于每个集群,我应该知道属于该集群的体素的坐标。

如何做到这一点?当然,我可以遍历所有体素,但困难在于检测簇并提取簇内的所有体素。

我想在 Matlab 中做这个。

这称为连通分量分析。

一个简单的方法是种子填充:系统地扫描整个域;当您遇到“1”时,递归访问所有“1”邻居并将它们设置为“0”(以避免多次访问它们)。顶级访问枚举了集群中的所有体素。清除一个簇后,继续搜索其他“1”。

请注意,这将是堆栈密集型的,为此目的实现显式堆栈会更好。

使用 regionprops'PixelIdxList' 属性。这默认使用 8 向连接区域。它还获得了对计算有用的线性索引。

示例:

A = false(4,4,3);
A(1,1,1) = true;
A(3,3,3) = true;
rp = regionprops(A,'PixelIdxList');

EDU>> A(rp(1).PixelIdxList)

ans =

     1

EDU>> A(rp(2).PixelIdxList)

ans =

     1

您还可以使用 'PixelList' 获取 3D 坐标:

EDU>> rp = regionprops(A,'PixelList');
EDU>> rp

rp = 

2x1 struct array with fields:
    PixelList

EDU>> rp(1)

ans = 

    PixelList: [1 1 1]

EDU>> rp(2)

ans = 

    PixelList: [3 3 3]

这取决于您希望采用的规则。以及如何表示您的 3D。 它是点云,还是使用颜色表示深度的 2D 位图,还是 3D 阵列,或什么...

您可以尝试根据平面或 3D 中的小 3D 云对它们进行聚类 Space。 如果首先,将 3D space 切成平面并在其上使用 2D 聚类算法。 如果存在的话,您将为每个深度平面创建集群。 如果是第二个,修改 2D 搜索聚类算法以使用 space 的立方体而不是平面的正方形作为框架。 您甚至可以在切片平面上使用 2D 算法,然后检查周围的平面以查看集群是否在 3D 中走得更远 space。 但这将是低效的。我不是 matlab 专家,所以我不能帮助你实施, 但也许已经有一些工具箱可以做你想做的事。 而且,当然,您将如何做很大程度上取决于您的图像在内存中的表示方式。 也许您必须更改格式才能轻松高效地提取集群。 给 Google 一些事情做。

编辑: 刚想到一个主意。 使用正确的格式并对数据进行排序。 您应该得到所有相邻点的列表。 将有关坐标的信息合并到输入数据中。排序通常比连接更快。