2012-01-30 118 views
4

我使用連接組件標記算法(bwconncomp)來標記二進制圖像(MATLAB)的不同部分。現在我需要計算不同標籤的面積並刪除面積較小的標籤。我可以使用默認的區域發現的命令或有任何特定命令的,在MATLAB ...幫助..查找圖像的區域

+0

此[鏈接](HTTP ://blogs.mathworks.com/steve/2009/02/27/using-ismember-with-the-output-of-regionprops/)是我真正在尋找..感謝條例草案 – meena 2012-02-02 07:41:32

回答

9

documentation

CC = bwconncomp(BW)返回連接的組件CC發現在BW。 二進制圖像BW可以具有任何維度。 CC是與 四個字段的結構...

在CC的最後字段是PixelIdxList,它是:

並[a] 1 * NumObjects細胞陣列,其中在第k個元素單元陣列是包含第k個對象中像素的線性索引的向量。

您可以通過查看單元格數組中相應條目的長度來找到每個標籤的區域。喜歡的東西:

areas_in_pixels = cellfun(@length, CC.PixelIdxList); 

的PixelIdxList是一個單元陣列,其中每個部分包含存在於連接的組件中的像素的線性索引。上面的代碼行找出單元陣列中每個單元的長度 - 即每個連接的單元中的像素數量。我使用cellfun來保持代碼簡潔高效。寫同樣的事情,不同的方式會是這樣的:

areas_in_pixels = nan(1, length(CC.PixelIdxList); 
for i = 1:length(CC.PixelIdxList) 
    areas_in_pixels(i) = length(CC.PixelIdxList{i}); 
end 

對於每個連接的組件,你就可以找到該組件的大小以像素爲單位通過訪問areas_in_pixels元素:

areas_in_pixels(34) %# area of connected component number 34 
+0

你能否詳細說一下功能? – meena 2012-01-31 14:21:04

+0

我已經提供了一些更多的細節。這是你的意思的功能? – 2012-01-31 14:43:24

4

如果你不想寫很多像上面這樣的代碼,只需使用MATLAB的內置函數來檢測區域。標記您的組件並從組件的屬性中找出該組件的區域。假設BW是二進制圖像:

[B,L] = bwboundaries(Bw,'noholes'); 
stats = regionprops(L,'Area','perimeter'); 

for k = 1:length(B) 
    area(k)=stats.Area; 
end 
+0

感謝您的回答.. :) – meena 2012-02-04 18:44:04

+0

+1好吧,公平這是你應該怎麼做... – 2012-02-08 18:33:47

2

您可以通過避免for循環具有以下使這更好:

[B,L] = bwboundaries(Bw,'noholes'); 
stats = regionprops(L,'Area','perimeter'); 
area = [stats.Area]; 

最佳, - 將會