OpenCV 霍夫圆

Ammar Ali 2024年2月15日
OpenCV 霍夫圆

本教程将讨论在 Python 中使用 OpenCV 的 HoughCircles() 函数检测图像中的圆圈。

在 Python 中使用 OpenCV 的 HoughCircles() 函数检测图像中的圆圈

我们可以使用 OpenCV 的 HoughCircles() 函数来检测图像中存在的圆圈。HoughCircles() 函数使用 Hough 变换来查找灰度图像中存在的圆圈。

霍夫变换从图像中提取特征,然后使用投票程序确定图像中存在的对象的形状。

HoughCircles() 的第一个参数是我们想要检测圆圈的图像,它应该是灰度的。第二个参数是用于检测圆圈的方法。

霍夫模式包含 cv2.HOUGH_STANDARD,经典或标准霍夫变换,cv2.HOUGH_PROBABILISTIC 是概率霍夫变换,如果图像中存在长线性段,cv2.HOUGH_MULTI_SCALE,多尺度经典霍夫变换的变体,cv2.HOUGH_GRADIENTcv2.GRADIENT_ALT

第三个参数是累加器分辨率和图像分辨率的比值。如果比率为 1,则累加器和图像分辨率相等,如果比率为 2,则累加器的宽度和高度将变为一半。

cv2.HOUGH_GRADIENT_ALT 方法的推荐比率为 1.5。第四个参数是两个圆的中心之间的最小距离。

第五个参数是第一个方法的特定参数。在 cv2.HOUGH_GRADIENTcv2.HOUGH_GRADIENT_ALT 的情况下,第五个参数将用作 Canny 边缘检测器的阈值。

第六个参数是第二种方法的具体参数;在 cv2.HOUGH_GRADIENT 的情况下,第六个参数将用作圆心的阈值。

cv2.HOUGH_GRADIENT_ALT 的情况下,第六个参数将用作圆的完美值。第七个参数是最小圆半径,第八个是最大圆半径。

例如,让我们使用 HoughCircles() 函数检测图像中存在的圆圈,并使用 OpenCV 的 circle() 函数在原始图像上绘制检测到的圆圈及其中心。

请参阅下面的代码。

import numpy as np
import cv2 as cv

src_img = cv.imread("blob1.jpg", 0)
color_img = cv.cvtColor(src_img, cv.COLOR_GRAY2BGR)
circles_img = cv.HoughCircles(
    src_img, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0
)
circles_img = np.uint16(np.around(circles_img))
for i in circles_img[0, :]:
    cv.circle(color_img, (i[0], i[1]), i[2], (0, 255, 0), 2)
    cv.circle(color_img, (i[0], i[1]), 2, (0, 0, 255), 3)

cv.imshow("Original Image", src_img)
cv.imshow("Detected Circles", color_img)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

霍夫圆

我们可以根据给定的图像更改 HoughCircles() 的参数。numpy 库的 around() 函数用于将圆形值四舍五入到最接近的整数。

我们还可以通过更改 circle() 函数的第四个参数(BGR 三元组)来更改在图像上绘制的圆圈的颜色和圆圈的中心。

作者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

相关文章 - OpenCV Image