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

时间:2015-07-10 17:51:19

标签: matlab image-processing multidimensional-array 3d cluster-analysis

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

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

我想在Matlab中这样做。

3 个答案:

答案 0 :(得分:3)

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]

答案 1 :(得分:0)

这称为连通成分分析。

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

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

答案 2 :(得分:0)

这取决于您希望采用的规则。以及你的3D代表如何。 它是点云,还是使用颜色来表示深度的2D位图,或者是 3D数组,或者......

您可以尝试根据平面或3D空间内的小3D云将它们聚类。 首先,将3D空间切割成平面并对其使用2D聚类算法。 然后,您将拥有每个深度平面的聚类(如果存在)。 如果为秒,则修改2D搜索聚类算法以使用空间立方体而不是平面的正方形作为帧。 您甚至可以在切片平面上使用2D算法,然后检查周围的平面以查看群集是否在3D空间中更进一步。 但这样效率低下。我不是matlab专家,所以我无法帮助你实现, 但也许有一些工具箱已经完全按照你想要的方式做了。 当然,你将如何做到这一点取决于你的图像在记忆中的表现方式。 也许您必须更改格式才能轻松高效地提取群集。 给谷歌做点什么。

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