2014-04-10 30 views
-3

我正在尋找一種獲取連接組件(CC)方面的鄰居(給定半徑的圓)的方法。連接組件的鄰域

我想根據連接組件的數量計算給定連接組件的數量。

在這個例子中,目標是將綠色CC分類爲紅色,因爲紅色的鄰居數量很大。

enter image description here

在此先感謝。

+2

你的問題不是關於編程。花點時間研究一下理論,回過頭來看看關於你的代碼的問題。 –

回答

1

用Matlab的簡單方法是使用findregionprops。 計算所有CC的在二值圖像BW邊界框:

CC_stats = regionprops(BW, 'BoundingBox'); 

然後,假設在[x0,y0]和半徑r0的中心的圓,發現在圈中的所有CC是(部分地):

BB_CC = reshape([CC_stats.BoundingBox],4,[]); 
idxCC_close = find((sqrt((BB_CC(2,:)-x0).^2+(BB_CC(1,:)-y0).^2)<r0) ... 
| (sqrt(((BB_CC(2,:)+BB_CC(4,:)-x0).^2+(BB_CC(1,:)-y0).^2)<r0) ... 
| (sqrt((BB_CC(2,:)-x0).^2+(BB_CC(1,:)+BB_CC(3,:)-y0).^2)<r0) ... 
| (sqrt(((BB_CC(2,:)+BB_CC(4,:)-x0).^2+(BB_CC(1,:)+BB_CC(3,:)-y0).^2)<r0)); 

(編輯:)你必須重塑CC_stats.BoundingBox的元素,因爲這個變量是所有邊界框的裸露元素,一個接一個地放置。

相當長的寫作,但基本上你想要的是在圈內至少有一個角落的CC的索引,因此4個測試。

最後,關閉CC的數量只是length(idxCC_close)

+0

這是一個有趣的想法,當我嘗試訪問CC_stats.BoundingBox(2)時,它顯示我: 「多個結構元素的字段引用是 後跟更多引用塊是錯誤」。 即使使用此統計(:,1).BoundingBox(2) 我得到「這種類型的多級索引所需的標量索引」。 –

+0

@BrainMarker對不起,我編輯我的答案。事實上,它會產生錯誤,因爲'CC_stats.BoundingBox'是邊界框本身的元素。我忘記了這一點... – Bentoy13

1

您可以獲取每個組的質心,並計算與所需組件的歐幾里德距離小於或等於半徑的連通組件的數量。

CC = regionprops(BW, 'Centroid'); 
dist = squareform(pdist(cell2mat({CC(:).Centroid}'))); 

dist將是一個NxN矩陣,其中N是連接部件的數量。 dist(a,b)給出組件a到組件b的距離(請注意,dist(a,a)始終爲零)。現在

,你可以得到這樣的最近的組件數量:

componentIndex = 14; % Example 
numberOfNearest = nnz(dist(componentIndex ,:) <= radius) - 1; 

哪裏radius是您圓半徑,以及-1是爲了避免計數的電流分量。

+0

這是偉大的,謝謝 –