您可以使用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)
其他答案非常适合在图像中查找一般圆圈,但由于您知道您正在寻找二进制掩码中的圆圈,因此 bwmorph 可能是您最好的选择。
I=imread('0ateM.png');
BW=im2bw(I);
BW2=bwmorph(BW,'endpoints');
Run Code Online (Sandbox Code Playgroud)
编辑:正如我在评论中提到的,为了放大圆圈,以便将原始圆圈蒙版之外的 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。
| 归档时间: |
|
| 查看次数: |
2674 次 |
| 最近记录: |