2012-11-05 173 views
5

我具有0和1的邏輯圓形掩模在我的矩陣看起來如下方式。獲取圓圈邊界

Mask

什麼是讓剛剛在另一個矩陣外邊界的最快方法?

基本上,我必須掃描每行的左邊第一個1和右邊的第一個1,如果行中有重複的1(在最上面,最下面的點上只有一個1).... Can有人幫我找到一個快速的方法來做到這一點?

+1

HTTP:/ /blogs.mathworks.com/steve/2012/09/04/detecting-circular-objects-in-images/ – chaohuang

回答

4

其他的答案是良好的圖像中發現一般圈,但因爲你知道你正在尋找一個二進制掩碼了一圈,bwmorph可能是你最好的選擇。

I=imread('0ateM.png'); 
BW=im2bw(I); 
BW2=bwmorph(BW,'endpoints'); 

image after bwmorph 編輯: 正如我在評論中提到,爲了擴大的圓圈,使你得到0像素只是原來的圓形面具設置爲1,其他一切設置爲0以外,你可以反原來的面具,然後用bwmorph:

WB=-(BW-1); 
WB2=bwmorph(WB,'endpoints'); 

這具有圖像的邊界變爲1的不幸的副作用。當然你可以很容易地改變這一點。對於一個m×n個圖像:

WB2(1,:)=0; WB2(:,1)=0; WB2(:,n)=0; WB2(m,:)=0; 

的另一種方法是直接使用的過濾器在原始圖像上:

f=[1 1 1; 1 -9 1; 1 1 1]; 
G=filter2(f,BW); 
BW2=im2bw(G); 

這將實現相同的結果如上述WB2沒有白色邊界問題。因爲過濾器的價值不再僅僅是0或1,它們的範圍-8與8之間的某處後需要im2bw電話,我們希望負值爲0,正值爲1

+0

嘿,關於上述圖片的一個問題......是否有一種簡單的方法可以將上面的圓圈擴大1像素? – anon

+0

就像猜測一樣,反轉圖像,並在結果上使用bwmorph。 – beaker

+0

是的,反轉的作品,但它有附加的效果,它會在1像素寬的圖像周圍放置一個白色的邊框。 – beaker

6

您可以使用regionprops的是,這裏是識別圈的幾個例子:

,或者如果你確定,只有一個圓,無噪音,我想你能夠找到從底部/頂/左/右邊緣與工作:

m = loadcirclefunction(); 
pix_left = find(any(m,1),1,'first'); 
pix_right = find(any(m,1),1,'last'); 
pix_top = find(any(m,2),1,'first'); 
pix_bottom= find(any(m,2),1,'last'); 
+0

嘿,當我使用繪圖功能繪製以上幾點我讓他們正確的,但是當我繪製圓使用viscircles確定中心和半徑我得到一些違規行爲。既然我需要以同心圓的方式從圓圈外面得到數值,我可以假設viscircles略微偏離? – anon

+0

哪'上面點'?什麼違規行爲?我不知道你在說什麼..更好地問一個新問題或編輯你的問題[特別詳細說明你的問題是什麼,你已經嘗試過什麼,結果是什麼,...](http:// mattgemmell.com/2008/12/08/what-have-you-tried/) –

0

蠻力是圖像,的大小呈線性關係,並因爲你需要複製圖像這是我認爲你不能提高你的方法獲益良多。儘管如此,它應該非常快,並且適用於圖像上任意數量的圓圈。

function bound = find_bound(circle) 

[sy sx] = size(circle); 
bound = circle; 

for i = 2:sy-1 
    for j = 2:sx-1 
     if (~circle(i,j)) 
      bound(i,j) = any((circle(i-1:i+1,j-1:j+1)-circle(i,j))(:)); 
     end 
    end 
end