获得圆圈边界

ano*_*non 5 matlab

我的矩阵中有一个0和1的逻辑圆形掩码,它看起来如下.

面具

在另一个矩阵中获得外边界的最快方法是什么?

基本上我必须从左边开始扫描前1,如果行中有重复的1,则必须从右边开始扫描第一个1(在最顶部,最底部的点中只有一个)....有人可以帮助我找到一个快速的方法来做到这一点?

Gun*_*uyf 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');
Run Code Online (Sandbox Code Playgroud)


bea*_*ker 4

其他答案非常适合在图像中查找一般圆圈,但由于您知道您正在寻找二进制掩码中的圆圈,因此 bwmorph 可能是您最好的选择。

I=imread('0ateM.png');
BW=im2bw(I);
BW2=bwmorph(BW,'endpoints');
Run Code Online (Sandbox Code Playgroud)

bwmorph 后的图像 编辑:正如我在评论中提到的,为了放大圆圈,以便将原始圆圈蒙版之外的 0 像素设置为 1,并将其他所有内容设置为 0,您可以反转原始蒙版,然后使用 bwmorph :

WB=-(BW-1);
WB2=bwmorph(WB,'endpoints');
Run Code Online (Sandbox Code Playgroud)

这有一个不幸的副作用,即图像的边框更改为 1。当然,您可以轻松更改此设置。对于 mxn 图像:

WB2(1,:)=0; WB2(:,1)=0; WB2(:,n)=0; WB2(m,:)=0;
Run Code Online (Sandbox Code Playgroud)

另一种方法是直接在原始图像上使用滤镜:

f=[1 1 1; 1 -9 1; 1 1 1];
G=filter2(f,BW);
BW2=im2bw(G);
Run Code Online (Sandbox Code Playgroud)

这将达到与上面WB2相同的结果,并且没有白边问题。之所以im2bw需要调用,是因为在过滤器之后,值不再只是 0 或 1,它们的范围介于 -8 和 8 之间,并且我们希望负值为 0,正值为 1。