3

我有一個二進制3D圖像,即它只包含0和1.現在我想找到所有的1的聚類(即只包含值1的體素聚類)。最後,對於每個羣集,我應該知道屬於該羣集的體素的座標。如何在二進制3D圖像中查找集羣?

這怎麼辦?當然,我可以遍歷所有體素,但難點是檢測羣集並提取羣集內的所有體素。

我想在Matlab中做到這一點。

+0

如果我理解的很好,您想使用[bwconncomp](http://www.mathworks.com/help/images/ref/bwconncomp.html)以及適當的連接級別(即6,18或26)來連接3D案例。 –

回答

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] 
+0

謝謝。 8路連接區域是什麼意思?在你的例子中,你只有一個體素的集羣。它是否也會返回具有多個體素的體素的體素座標? – machinery

+0

通常,當您想要查找連續區域時,必須指定連接。它可以是4路或8路連續的。 4路連接意味着它將搜索左上,右下,而8路將搜索點周圍的所有8個像素。 [這裏](https://www.cs.auckland.ac.nz/courses/compsci773s1c/lectures/ImageProcessing-html/neighbourhoods.gif)是描述它的好圖片。這是2D的情況下順便說一句。 – Justin

+0

但是這是2D的,就像你說的那樣。應該不使用16路的3D或類似的東西? – machinery

0

這被稱爲連接組件分析。

一個簡單的方法是種子填充:系統地掃描整個域;當你遇到'1'時,遞歸地訪問所有的'1'鄰居並將它們設置爲'0'(以避免再次訪問它們)。頂級訪問枚舉集羣中的所有體素。羣集清除後,繼續搜索其他'1'。

請注意,這將是堆棧密集型的,並且爲此目的實現顯式堆棧會更好。

0

這取決於你希望使用的規則。以及你的3D代表如何。 它是一個點雲,或使用顏色來表示深度的2D位圖,或 3D陣列,或者是什麼......

你可以試試聚類他們根據平面或三維空間內的小3D雲。如果首先將三維空間切分爲平面,並在其上使用二維聚類算法。 然後,您將爲每個深度平面(如果存在)提供羣集。 如果其次,修改二維搜索聚類算法以使用空間立方體代替平面的平方作爲框架。 您甚至可以在切片平面上使用2D算法,然後檢查周圍的平面以查看集羣是否在3D空間中更遠。 但是這樣做效率不高。我不是一個matlab專家,所以我不能幫你實現, ,但也許有一些工具箱已經完成你想要的。 而且,當然,你如何做到這一點很大程度上取決於你的形象在內存中的表現如何。 也許你將不得不改變格式,以便輕鬆高效地提取羣集。 給Google做點什麼。

編輯: 剛剛有一個想法。 使用適當的格式並對數據進行排序。 你應該得到所有相鄰點的列表。 合併輸入數據中的座標信息。排序通常比連接快。

+0

我認爲jucistains解決方案會做。 – Dalen