我想了解imfindcircles
的工作原理,因此我创建了一个黑色背景和单个白色圆圈的简单图像。图像为640x480,圆的直径为122像素:
我尝试使用imfindcircles
来检测圆圈,我尝试了各种模式的图像,uint8
RGB,uint8
灰度,double
灰度和反转所有这些形式的图片,以及minR
和maxR
的各种值。在所有情况下我都没有结果:
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
我该如何使用该功能找到圆圈?
答案 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}}