二进制图像圆拟合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二进制图像圆拟合相关的知识,希望对你有一定的参考价值。

我是MATLAB的新手,我正在尝试将圆拟合技术应用于下图。

图片

enter image description here

预期产出

enter image description here

我使用以下代码没有运气:

[centers, radii] = imfindcircles(W,[30 65],'ObjectPolarity','bright');
figure,imshow(W);% title('Sobel gradient');
viscircles(centers,radii,'Color','b');

请注意,圆圈大小可能会因图片而异

有什么建议。

答案

很近!你只需要调整一下灵敏度。范围从0到1,找到的圆圈越多越高。默认情况下为0.85。还有一点调整半径:

imshow(W) % assuming W is logical
[centers,radii] = imfindcircles(W,[40 60],'ObjectPolarity','bright','Sensitivity',0.925)
viscircles(centers, radii,'EdgeColor','b');

我不认为有可能找到较低的圆圈而不会先得到一些误报 - 最终它不是很圆。

resultimage

另一答案

尽管不是一位优秀的数字图像分析师,但我试图用这张图片稍微玩一下。我发现以下方法更加灵活:

img = imread('1GBtO.png');
img = im2bw(img);

rp = regionprops('table',img,'Centroid','Eccentricity','EquivDiameter','MajorAxisLength','MinorAxisLength');
rp.Radii = mean([rp.MajorAxisLength rp.MinorAxisLength],2) / 2;

rp([rp.Eccentricity] > 0.75,:) = [];
rp(rp.EquivDiameter < 10 | rp.EquivDiameter > 30,:) = [];

imshow(img);
hold on;
viscircles(rp.Centroid,rp.Radii);
hold off;

输出远远不是理想的输出,但我觉得它比你的第一次试用有所改进:

Output

但我认为您可以通过找到正确的算法来调整半径并通过调整标准来排除不需要的区域来获得所需的结果。

以上是关于二进制图像圆拟合的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV中实现曲线与圆拟合

数据拟合:最小二乘二维圆拟合的C++实现(另一种方法)

打开 CV 平凡圆检测——如何得到最小二乘而不是轮廓?

Python Opencv使用霍夫圆变换从二进制图像中检测圆

数据拟合:最小二乘二维圆拟合的C++实现

图像处理halcon实现图像中两个圆形轮廓的圆心距