2014-02-24 65 views
0

通過關注這篇文章Using ismember with the output of regionprops我能夠選擇性地隔離我想要的連接組件。例如使用我的代碼如下:如何圍繞ismember選擇的對象創建邊界框?

img = rgb2gray(imread('W1\Writer1_01_02.jpg')); 
bw_normal2 = im2bw(img, graythresh(img)); 
bw22 = imcomplement(bw_normal2); 
bw3 = bwmorph(bw22, 'dilate'); 
[label2,n2] = bwlabel(bw3); 
stats2 = regionprops(label2, {'Area', 'BoundingBox'}); 
area2 = [stats2.Area]; 

idx = find((28 <= area2) & (area2 <= 40)); 
    BW2 = ismember(label2,idx); 
figure, imshow(BW2) 

我可以很容易地顯示僅包含所連接的組件,其面積爲28和40。所以

之間

enter image description here

但我代替可以使輸出原始圖像中此連接組件周圍的邊界框。我的意思是如果這是原始圖像: enter image description here

我可以在原始圖像上圍繞我所需的組件製作邊框嗎?我知道,這是使周圍的一切我連成分

imshow(img); 
for j=1:n2 

    hold on 
    rectangle('Position',[stats(j).BoundingBox(1),stats(j).BoundingBox(2),stats(j).BoundingBox(3),stats(j).BoundingBox(4)],... 
'EdgeColor','r','LineWidth',2); 
end 

的邊界框的代碼,但我怎麼只會使邊框僅約28和40之間的區域爲元素?如上所示,而不是製作完全不同的圖像。

+0

我可能沒有正確的理解這個問題。但是看起來你有下面這段代碼:「對於j = 1:n2」,這意味着你正在遍歷圖像上的每個組件。找到表示感興趣對象的數字並繪製邊界框。 –

+0

這將是相當困難和耗時。假設我只想要面積爲40的對象,然後打開工作區中的''stats2.Area'',找到它,然後將其應用於我的代碼。我只是添加了第二個代碼,以顯示我知道如何在所有組件上繪製邊界框,但是如何在由「ismember」選擇的元素的原始圖像上繪製? – StuckInPhD

+1

呃,'stats2(idx).BoundingBox'有什麼困難?如果您不清楚代碼的工作原理,請嘗試在調試器中逐步查看值,以及它們是如何逐行更改的(使用「跳過」而不是「跳入」以避免內存所有功能) – Notlikethat

回答

1

保持,如果條件在你的代碼的下半年...

imshow(img); 
for j=1:n2 
hold on 
area2 = stats2(j).Area; 
if((28 <= area2) & (area2 <= 40)) 
    rectangle('Position',[stats2(j).BoundingBox(1),stats2(j).BoundingBox(2),stats2(j).BoundingBox(3),stats2(j).BoundingBox(4)],...'EdgeColor','r','LineWidth',2); 
end 
end