欢迎光临
我们一直在努力

Python OpenCV 霍夫圆检测(Hough Circle Transform)详解与实战

在机器视觉开发中,除了检测直线之外,圆形目标检测也是十分常见的需求,例如:

  • 瓶盖检测
  • 轴承检测
  • 硬币识别
  • 圆孔定位
  • 医学图像分析
  • 工业零件尺寸测量

OpenCV 提供了 霍夫圆变换(Hough Circle Transform),能够快速检测图像中的圆形目标。

本文将详细介绍霍夫圆检测原理、参数说明以及完整 Python 示例。

一、霍夫圆检测原理

现实中的圆可以由三个参数唯一确定:

  • 圆心 xxx
  • 圆心 yyy
  • 半径 rrr

圆的数学公式:

(x−a)2+(y−b)2=r2
(x-a)^2 + (y-b)^2 = r^2
(xa)2+(yb)2=r2

其中:

  • (a,b)(a,b)(a,b) 为圆心
  • rrr 为半径

霍夫圆检测就是让图像中的边缘点不断进行“投票”,最终寻找票数最高的位置作为圆心。

由于直接计算三维参数空间(xxxyyyrrr)开销非常大,因此 OpenCV 使用了 霍夫梯度法(Hough Gradient),利用边缘梯度方向,大大提高了检测速度。

二、OpenCV 霍夫圆检测函数

OpenCV 使用:

circles = cv2.HoughCircles(
image,
method,
dp,
minDist,
param1,
param2,
minRadius,
maxRadius
)

参数说明

参数说明
image 输入灰度图
method 检测方法,一般固定为 cv2.HOUGH_GRADIENT
dp 累加器分辨率与原图分辨率比值
minDist 两个圆心之间最小距离
param1 Canny 高阈值
param2 圆心投票阈值
minRadius 最小半径
maxRadius 最大半径

三、参数详解

1. dp

表示累加器分辨率。

例如:

  • dp = 1:累加器大小与原图一致。
  • dp = 2:检测速度更快,但精度略低。

一般推荐:1 或 1.2。

2. minDist

表示两个圆心之间允许的最小距离。

例如:

  • minDist=100:如果两个圆距离小于 100 像素,只保留一个。

如果设置太小:容易重复检测同一个圆。
如果设置太大:可能漏掉相邻圆。

3. param1

这是 Canny 边缘检测的高阈值。

例如:

  • param1=100

OpenCV 内部实际执行:

cv2.Canny(gray, 50, 100)

即:

  • 低阈值 = param1 / 2
  • 高阈值 = param1

4. param2

这是最重要的参数。

它表示:圆心累计投票阈值。

例如:

  • param2=30:只有累计票数超过 30 才认为是真正的圆。

数值越小:检测更多,容易误检。
数值越大:检测更严格,容易漏检。

通常需要根据实际图像调整。

5. 半径范围

例如:

minRadius=20
maxRadius=80

表示:只检测 20~80 像素之间的圆。这样可以极大提高速度。

四、基础示例

import cv2
import numpy as np

# 读取图片
img = cv2.imread("circle.png")

# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 高斯滤波
gray = cv2.GaussianBlur(gray, (9, 9), 2)

# 霍夫圆检测
circles = cv2.HoughCircles(
gray,
cv2.HOUGH_GRADIENT,
dp=1,
minDist=50,
param1=100,
param2=30,
minRadius=10,
maxRadius=100
)

# 绘制检测结果
if circles is not None:
circles = np.uint16(np.around(circles))
for circle in circles[0]:
x, y, r = circle
# 绘制圆
cv2.circle(img, (x, y), r, (0, 255, 0), 2)
# 绘制圆心
cv2.circle(img, (x, y), 3, (0, 0, 255), 1)

cv2.imshow("Circle Detection", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

五、工业视觉中的完整流程

实际项目中,很少直接使用霍夫圆检测,而是按照如下流程:

  • 读取图像
  • 灰度化
  • 高斯滤波
  • 霍夫圆检测
  • 筛选半径
  • 计算圆心
  • 尺寸测量
  • 通常会增加:

    • ROI 裁剪
    • 二值化
    • 去噪
    • 轮廓过滤

    这样检测更加稳定。

    六、参数调节技巧

    假设:检测不到圆。

    可以尝试:降低 param2

    例如:

    • 30 → 20 → 15

    如果误检太多:

    提高 param2

    例如:

    • 30 → 40 → 50

    如果圆很多:

    增加 minDist,避免重复检测。

    如果已知圆大小:

    一定要设置 minRadius 和 maxRadius,速度会提升很多。

    七、实际案例:检测硬币

    import cv2
    import numpy as np

    img = cv2.imread("coins.jpg")

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (7, 7), 1.5)

    circles = cv2.HoughCircles(
    gray,
    cv2.HOUGH_GRADIENT,
    dp=1.2,
    minDist=40,
    param1=120,
    param2=35,
    minRadius=20,
    maxRadius=80
    )

    if circles is not None:
    circles = np.uint16(np.around(circles))
    for x, y, r in circles[0]:
    cv2.circle(img, (x, y), r, (0, 255, 0), 2)
    cv2.putText(
    img,
    f"R={r}",
    (x 20, y r 10),
    cv2.FONT_HERSHEY_SIMPLEX,
    0.6,
    (0, 0, 255),
    2
    )

    cv2.imshow("Coins", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    在这里插入图片描述

    八、霍夫圆检测优缺点

    优点:

    • 算法成熟,OpenCV 内置实现。
    • 检测速度快,适合实时应用。
    • 对轻微噪声具有一定鲁棒性。
    • 能同时检测多个圆。

    缺点:

    • 对参数较敏感,需要根据场景调节。
    • 对边缘质量要求较高,图像模糊时效果下降。
    • 遮挡严重或圆形不完整时容易漏检。
    • 光照变化较大时,需要结合滤波和预处理。

    九、总结

    霍夫圆检测是 OpenCV 中经典且实用的圆形目标检测算法,广泛应用于工业检测、医学图像和智能视觉等领域。实际工程中,通常会先进行灰度化、滤波、ROI 裁剪等预处理,再结合霍夫圆检测实现稳定识别。通过合理设置 dp、minDist、param1、param2 以及圆半径范围,可以在检测速度与准确率之间取得良好的平衡。

    对于工业视觉项目,霍夫圆检测通常作为目标定位的第一步,后续可结合亚像素拟合、尺寸测量、模板匹配等算法,进一步提升检测精度和系统鲁棒性。

    赞(0)
    未经允许不得转载:171主机测评 » Python OpenCV 霍夫圆检测(Hough Circle Transform)详解与实战
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址