检测图像中的圆形

%% 加载图像
% 此示例使用包含各种颜色的圆形塑料片的图像。
rgb = imread('picture_yuan.png');
imshow(rgb);
%% 确定搜索圆的半径范围
% imfindcircles 需要半径范围来搜索圆。
% 找到合适半径范围的快速方法是使用交互式工具 imdistline 获得各种对象半径的近似估计值。
d = imdistline;
% imdistline 会创建一个可拖动的工具,可以移动该工具以匹配塑料片,并且可以读取数字以获得其半径的近似估计值。
%大多数塑料片的半径在 21-23 个像素的范围内。为保险起见,请使用稍大一点的半径范围(20-25 个像素)。
%在此之前,请删除 imdistline 工具。

delete(d);
%% 寻找圆的初步尝试
%请对此图像调用 imfindcircles,使用的搜索半径为 [20 25] 像素。
%在此之前,最好要清楚对象是比背景亮还是比背景暗。

gray_image = rgb2gray(rgb);
imshow(gray_image);
% 背景相当亮,大多数塑料片比背景暗。
%但是,默认情况下,imfindcircles 会找到比背景亮的圆形对象。
%因此,在 imfindcircles 中将参数 'ObjectPolarity' 设置为 'dark' 以搜索较暗的圆。
% [centers,radii] = imfindcircles(rgb,[20 25],'ObjectPolarity','dark');
%% 提高检测敏感度
%回到塑料片图像,在默认敏感度水平下,可能所有圆都低于内部阈值,因此未检测到圆。
%'Sensitivity' 是介于 0 和 1 之间的数字,默认设置为 0.85。将 'Sensitivity' 提高到 0.9。

[centers,radii] = imfindcircles(rgb,[20 25],'ObjectPolarity','dark', ...
    'Sensitivity',0.98);
%% 在图像上绘制圆
%函数 viscircles 可用于在图像上绘制圆。来自 imfindcircles 的输出变量 centers 和 radii 可以直接传递给 viscircles。

imshow(rgb)
h = viscircles(centers,radii);
%% 使用第二种方法(两阶段)寻找圆
%此方法的结果看起来更好。imfindcircles 有两种不同寻找圆的方法。
%到当前为止,默认方法(称为相位编码方法)用于检测圆。
%在 imfindcircles 中还可以使用另一种方法,通常称为两阶段方法。使用两阶段方法并显示结果。

[centers,radii] = imfindcircles(rgb,[20 25],'ObjectPolarity','dark', ...
          'Sensitivity',0.96,'Method','twostage');

delete(h)
h = viscircles(centers,radii);

你可能感兴趣的:(检测图像中的圆形)