我具有0和1的邏輯圓形掩模在我的矩陣看起來如下方式。獲取圓圈邊界
什麼是讓剛剛在另一個矩陣外邊界的最快方法?
基本上,我必須掃描每行的左邊第一個1和右邊的第一個1,如果行中有重複的1(在最上面,最下面的點上只有一個1).... Can有人幫我找到一個快速的方法來做到這一點?
我具有0和1的邏輯圓形掩模在我的矩陣看起來如下方式。獲取圓圈邊界
什麼是讓剛剛在另一個矩陣外邊界的最快方法?
基本上,我必須掃描每行的左邊第一個1和右邊的第一個1,如果行中有重複的1(在最上面,最下面的點上只有一個1).... Can有人幫我找到一個快速的方法來做到這一點?
其他的答案是良好的圖像中發現一般圈,但因爲你知道你正在尋找一個二進制掩碼了一圈,bwmorph可能是你最好的選擇。
I=imread('0ateM.png');
BW=im2bw(I);
BW2=bwmorph(BW,'endpoints');
編輯: 正如我在評論中提到,爲了擴大的圓圈,使你得到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
您可以使用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');
嘿,當我使用繪圖功能繪製以上幾點我讓他們正確的,但是當我繪製圓使用viscircles確定中心和半徑我得到一些違規行爲。既然我需要以同心圓的方式從圓圈外面得到數值,我可以假設viscircles略微偏離? – anon
哪'上面點'?什麼違規行爲?我不知道你在說什麼..更好地問一個新問題或編輯你的問題[特別詳細說明你的問題是什麼,你已經嘗試過什麼,結果是什麼,...](http:// mattgemmell.com/2008/12/08/what-have-you-tried/) –
蠻力是圖像,的大小呈線性關係,並因爲你需要複製圖像這是我認爲你不能提高你的方法獲益良多。儘管如此,它應該非常快,並且適用於圖像上任意數量的圓圈。
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
HTTP:/ /blogs.mathworks.com/steve/2012/09/04/detecting-circular-objects-in-images/ – chaohuang