基于霍夫变换的圆形物体检测和计数

📅 2026/7/3 11:45:06 👁️ 阅读次数 📝 编程学习
基于霍夫变换的圆形物体检测和计数

一、前言

在计算机视觉的实际应用中,圆形物体检测与计数是非常经典的场景:工业零件质检、药丸计数、圆形工件分拣、硬币统计等场景都离不开这项技术。而霍夫变换(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;% 结束在同一图像上的绘制。

三、程序运行结果图

撰写博客不易,如果你觉得本文对你有所帮助,请关注、点赞,欢迎转发。谢谢大家!