OpenCV 霍夫圆
本教程将讨论在 Python 中使用 OpenCV 的 HoughCircles()
函数检测图像中的圆圈。
在 Python 中使用 OpenCV 的 HoughCircles()
函数检测图像中的圆圈
我们可以使用 OpenCV 的 HoughCircles()
函数来检测图像中存在的圆圈。HoughCircles()
函数使用 Hough 变换来查找灰度图像中存在的圆圈。
霍夫变换从图像中提取特征,然后使用投票程序确定图像中存在的对象的形状。
HoughCircles()
的第一个参数是我们想要检测圆圈的图像,它应该是灰度的。第二个参数是用于检测圆圈的方法。
霍夫模式包含 cv2.HOUGH_STANDARD
,经典或标准霍夫变换,cv2.HOUGH_PROBABILISTIC
是概率霍夫变换,如果图像中存在长线性段,cv2.HOUGH_MULTI_SCALE
,多尺度经典霍夫变换的变体,cv2.HOUGH_GRADIENT
和 cv2.GRADIENT_ALT
。
第三个参数是累加器分辨率和图像分辨率的比值。如果比率为 1,则累加器和图像分辨率相等,如果比率为 2,则累加器的宽度和高度将变为一半。
cv2.HOUGH_GRADIENT_ALT
方法的推荐比率为 1.5。第四个参数是两个圆的中心之间的最小距离。
第五个参数是第一个方法的特定参数。在 cv2.HOUGH_GRADIENT
和 cv2.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 三元组)来更改在图像上绘制的圆圈的颜色和圆圈的中心。