OpenCV 哈夫圆检测函数详解:原理、算法流程、参数和示例
OpenCV 哈夫圆检测函数详解:原理、算法流程、参数和示例
哈夫圆检测是一种基于梯度信息的圆形检测方法,在 OpenCV 中可以使用 cv2.HoughCircles 函数实现。本文将详细介绍该函数,包括其原理、算法流程、输入参数说明以及示例代码演示,帮助您理解和应用该函数进行圆形检测。
1. 原理
哈夫圆检测的原理是利用图像中的圆形边缘像素点在极坐标空间内投票的方式,找到最有可能为圆心的点,并根据其投票数确定圆的半径大小。具体步骤如下:
- 预处理: 对输入图像进行灰度化、高斯滤波、边缘检测等操作,得到边缘图像。
- 极坐标变换: 将边缘图像中的每个边缘点转换为极坐标系下的圆心候选点。
- 投票计算: 对每个圆心候选点,在极坐标空间内进行投票,统计得票最高的点即为圆心。
- 圆心筛选: 根据圆心候选点的投票数进行筛选,排除噪声点和误检点。
- 圆半径计算: 对于每个圆心,计算其对应的圆半径大小。
2. 函数算法流程
cv2.HoughCircles 函数的算法流程与哈夫圆检测的原理一致,主要包括以下步骤:
- 预处理: 使用 Canny 边缘检测算法提取图像边缘。
- 投票: 将边缘点转换为极坐标空间中的圆心候选点,并进行投票。
- 圆心检测: 找到投票数最高的点作为圆心。
- 半径计算: 计算圆心对应的圆半径。
3. 函数输入参数
cv2.HoughCircles 函数的输入参数如下:
cv2.HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)
- image: 输入图像,必须为单通道灰度图像。
- method: 检测方法,目前只支持
cv2.HOUGH_GRADIENT。 - dp: 累加器分辨率与图像分辨率的比值,一般为 1。
- minDist: 检测到的圆心之间的最小距离,如果两个圆心之间的距离小于该值,则只保留投票数较高的圆心。
- circles: 输出参数,检测到的圆的信息,为一个 n 行 3 列的 NumPy 数组,每行表示一个圆,第一列和第二列为圆心坐标,第三列为半径。
- param1: Canny 边缘检测的高阈值,一般为 100。
- param2: 累加器阈值,一般为 30。
- minRadius: 检测到的圆的最小半径,如果设置为 0,则不限制最小半径。
- maxRadius: 检测到的圆的最大半径,如果设置为 0,则不限制最大半径。
4. 示例代码
import cv2
import numpy as np
img = cv2.imread('circle.jpg', 0)
img = cv2.medianBlur(img, 5)
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
if circles is not None:
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2)
cv2.circle(img, (i[0], i[1]), 2, (0, 0, 255), 3)
cv2.imshow('HoughCircles', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
其中,circle.jpg 为输入图像,经过预处理后,使用 cv2.HoughCircles 函数进行圆检测,并在原图上绘制检测到的圆。
总结
本文详细介绍了 OpenCV 中的 cv2.HoughCircles 函数,包括其原理、算法流程、输入参数说明以及示例代码演示。希望本文能够帮助您理解和应用该函数进行圆形检测。
原文地址: https://www.cveoy.top/t/topic/jFpI 著作权归作者所有。请勿转载和采集!