2012-11-05 125 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