我具有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