Matlab 如何在二值3D图像中找到簇?

Matlab 如何在二值3D图像中找到簇?,matlab,image-processing,multidimensional-array,3d,cluster-analysis,Matlab,Image Processing,Multidimensional Array,3d,Cluster Analysis,我有一个二进制3D图像,即它只包含0和1。现在我想找到所有1的簇(即仅包含值1的体素簇)。最后,对于每个簇,我应该知道属于该簇的体素的坐标 如何做到这一点?当然,我可以迭代所有体素,但困难在于检测簇并提取簇内的所有体素 我想在Matlab中实现这一点。这称为连通分量分析 一种简单的方法是种子填充:系统地扫描整个域;遇到“1”时,请递归访问所有“1”邻居并将其设置为“0”(以避免访问他们更多次)。顶级访问枚举簇中的所有体素。清除群集后,继续搜索其他“1” 请注意,这将是堆栈密集型的,因此最好实现一

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

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


我想在Matlab中实现这一点。

这称为连通分量分析

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


请注意,这将是堆栈密集型的,因此最好实现一个显式堆栈。

使用带有
'PixelIdxList'
属性的
regionprops
。默认情况下,这将使用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
您还可以使用
“像素列表”
获取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是如何表现的。 它是点云,还是使用颜色表示深度的二维位图,还是 3D阵列,或者什么

您可以尝试根据平面或在三维空间内的小三维云中对它们进行聚类。 首先,将三维空间切片为平面,并在平面上使用二维聚类算法。 然后,将为每个深度平面创建簇(如果存在)。 如果是第二种情况,请修改2D搜索聚类算法,以使用空间立方体而不是平面的正方形作为帧。 甚至可以在切片平面上使用二维算法,然后检查周围的平面,以查看簇是否在三维空间中走得更远。 但这将是低效的。我不是matlab专家,所以在实现方面我帮不了你多少忙, 但也许已经有了一些工具箱来做你想做的事情。 当然,你会怎么做很大程度上取决于你的形象在记忆中的表现。 也许您必须更改格式,以便轻松有效地提取集群。 给谷歌一些事情做

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

如果我理解的很好,您希望在3D案例中使用适当的连接级别(即6、18或26)。谢谢。8路连通区域是什么意思?在您的示例中,只有具有一个体素的簇。它还会返回包含多个体素的簇的体素坐标吗?通常,当您想要查找连续区域时,必须指定连接性。它可以是4路或8路连续。4路连接意味着它将从左上到右下搜索,而8路将搜索一个点周围的所有8个像素这是一幅描述它的好照片。顺便说一句,这是2D案例。但正如你所说,这是2D案例。人们不应该使用16路3D或类似的东西吗?是的,我的观点只是要知道,相邻区域有不同类型的连接。因此,您需要确保默认设置适用于您的应用程序。我认为jucistains解决方案就可以了。