基于霍夫变换的圆形物体检测和计数
一、前言
在计算机视觉的实际应用中,圆形物体检测与计数是非常经典的场景:工业零件质检、药丸计数、圆形工件分拣、硬币统计等场景都离不开这项技术。而霍夫变换(Hough Transform)就是实现圆形检测最核心、最经典的算法之一,它对噪声不敏感、对物体部分遮挡鲁棒性强,非常适合工业视觉场景。
霍夫变换是一种特征检测算法,核心思想是坐标空间映射与投票统计。它将图像空间中的几何边缘点,映射到对应参数空间,通过统计参数空间累加峰值,自动拟合出直线、圆形等规则几何图形,抗遮挡、抗噪声能力强。
在 MATLAB 中,imfindcircles函数正是基于霍夫梯度法实现的官方圆形检测函数,使用简单高效。只需输入灰度图像和半径范围,即可自动检测圆形目标,输出圆心坐标、半径等结果。函数支持调节灵敏度、区分亮暗目标,能有效过滤噪声和干扰,无需手动实现复杂算法,直接用于圆形物体的检测、定位与计数,适合工业质检、零件统计等场景。
下面给出一个利用imfindcircle函数检测圆形物体的实例。
二、程序设计思想和程序代码
读取图像:加载想要处理的图像。
图像预处理:将图像转换为灰度图像,并可能应用滤波器来平滑图像,以便更好地处理。
边缘检测:使用例如 Canny 边缘检测器来找到硬币的边界。
圆形检测:使用霍夫圆变换来识别图像中的圆形(即硬币)。
计数硬币:计算检测到的圆形数量。并将其显示在图片的左上角。
标注几何中心:用*标注了硬币的几何中心
代码:
originalImage = imread('D:\图像处理\image\硬币.jpg');
imshow(originalImage);
holdon;% 保持当前图像,以便在其上绘制。
title('Original Image');
% 转换为灰度图像
grayImage = rgb2gray(originalImage);
% 直方图均衡化
equalizedImage = histeq(grayImage);
% 边缘检测
edges = edge(equalizedImage,'canny', [], 2);% 可以调整阈值和Sigma值
% 霍夫圆变换来识别圆形
[centers, radii] = imfindcircles(edges, [20 100],'ObjectPolarity','bright','Sensitivity', 0.92);% 调整半径和敏感度
% 绘制检测到的硬币
viscircles(centers, radii);
% 绘制每个硬币的几何中心
plot(centers(:,1), centers(:,2),'r*');
% 计数硬币
numberOfCoins = numel(radii);
disp(['硬币个数 : ', num2str(numberOfCoins)]);
% 在图像上显示计数结果
text(10, 10, ['硬币个数: ', num2str(numberOfCoins)],'Color','black','FontSize', 10);
holdoff;% 结束在同一图像上的绘制。
