Matlab:找不到带有imfindcircles的圆圈

时间:2017-06-23 11:19:34

标签: matlab computer-vision

我想了解imfindcircles的工作原理,因此我创建了一个黑色背景和单个白色圆圈的简单图像。图像为640x480,圆的直径为122像素:

enter image description here

我尝试使用imfindcircles来检测圆圈,我尝试了各种模式的图像,uint8 RGB,uint8灰度,double灰度和反转所有这些形式的图片,以及minRmaxR的各种值。在所有情况下我都没有结果:

minR = 40;
maxR = 80;
Irgb = imread('example_circle.png');
Irgbr = 255 - Irgb;
I = rgb2gray(Irgb);
Ir = 255 - I;
Id = double(I)/255;
Ird = 1 - Id;

[c1,r1] = imfindcircles(I,[minR maxR]);
[c2,r2] = imfindcircles(Ir,[minR maxR]);
[c3,r3] = imfindcircles(Id,[minR maxR]);
[c4,r4] = imfindcircles(Ird,[minR maxR]);
[c5,r5] = imfindcircles(Irgb,[minR maxR]);
[c6,r6] = imfindcircles(Irgbr,[minR maxR]);

disp([length(r1) length(r2) length(r3) length(r4) length(r5) length(r6)]);

输出结果为:

 0     0     0     0     0     0

我该如何使用该功能找到圆圈?

1 个答案:

答案 0 :(得分:2)

imfindcircles函数有一个0.95参数:

  

当您增加灵敏度因子时,imfindcircles会检测到更多圆形物体,包括弱圆和部分遮挡的圆。灵敏度值越高,也会增加误检的风险。

通过将“敏感度”设置为更高的值,您可以获得更多潜在的圈子。您可以调整此参数以始终为您提供一个圆圈,例如[c1, r1] = imfindcircles(Irgb,[40,80], 'Sensitivity', 0.95) 似乎在这个具体案例中运作良好。但这可能不是很强大。

1

如果你知道完全一个圈子,你可以将灵敏度设置为metric,它会返回所有潜在圈子。然后,使用[c, r] = imfindcircles(Irgb,[40,80], 'Sensitivity', 1); c1 = c(1,:); r1 = r(1,:); 输出,它会为您提供检测到的圆的计算强度。如你所知,只有一个圆圈,你可以选择最强的圆圈,它总是第一行。

{{1}}