Python OpenCV基于霍夫圈变换算法检测图像中的圆形
基本介绍
霍夫圆变换是利用数学原理检测图像中的圆形的一种方法。它需要对每个像素点进行检测,计算出其是否可以代表一个圆。这种方法在处理较小的圆或噪声较小的图像时非常有效。
算法步骤
霍夫圆变换算法的具体步骤如下:
- 边缘检测:使用Canny算法或其他方法根据图像进行边缘检测。
- 霍夫变换:对于边缘图像中的每个非零像素点进行处理,生成一系列可能的圆心和半径。
- 圆形检测:对于每组可能的圆心和半径,计算其中多少个包含足够的边缘点(该点是通过设置阈值来确定的),如果该值超过了一个预定义的阈值,那么就可以说这个圆形是有效的。
OpenCV的实现
OpenCV 中可以通过调用 cv2.HoughCircles()
函数来实现霍夫圆变换算法的检测。这个函数有一些参数需要设置,如下所示:
cv2.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]])
参数说明:
- image:8位单通道灰度输入图像
- method:定义检测图像中的圆的方法。目前支持 CV_HOUGH_GRADIENT 标准霍夫变换方法和 CV_HOUGH_GRADIENT_ALT 一种改进型方法。
- dp:累加器分辨率与图像分辨率的反比。它对应于霍夫空间中一组累加器的图像大小。
- minDist:检测到的圆心之间的最小距离。
- circles:定义输出的二维向量。向量的每个元素都包含圆的参数(3个浮点数):圆的中心坐标 (x,y) 和半径 r。
- param1:用于处理边缘检测的阈值。
- param2:用于检测圆度的阈值。如果阈值过高,则可能会忽略某些圆形。如果阈值过低,则可能会将其他对象误判为圆形。
- minRadius:最小半径。
- maxRadius:最大半径。
下面是关于 OpenCV 霍夫圆变换的两个示例:
示例1
import cv2
import numpy as np
img = cv2.imread('test.jpg', 0)
img = cv2.medianBlur(img, 5)
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20,
param1=50, param2=30, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
# draw the outer circle
cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2)
# draw the center of the circle
cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3)
cv2.imshow('detected circles', cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
以上代码从文件中读取了图像,并将它转为了灰度图像,然后应用了中值滤波器以消除噪声。接下来,通过将图像传递给 cv2.HoughCircles()
函数,使用标准的 CV_HOUGH_GRADIENT 霍夫变换方法来检测图像中的圆形。最终,使用 cv2.circle()
函数将检测出的圆形绘制在彩色输出图像中。
示例2
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while True:
# Capture frame-by-frame
ret, frame = cap.read()
# Convert to gray
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Apply Gaussian Blur
gray_blur = cv2.GaussianBlur(gray, (25, 25), 0)
# Detect Circles
circles = cv2.HoughCircles(gray_blur, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
# If circles are detected, convert the (x, y) coordinates and radius of the circles to integers
if circles is not None:
circles = np.round(circles[0, :]).astype("int")
# Loop over the (x, y) coordinates and radius of the circles
for (x, y, r) in circles:
# Draw the circle in the output frame
cv2.circle(frame, (x, y), r, (0, 255, 0), 2)
# Display the resulting frame
cv2.imshow('Circle Detection', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
以上代码从摄像机捕获了连续的帧。在每个帧上,从 BGR 色彩空间转换为灰度图像,并应用了高斯模糊器以消除噪声。接下来,应用霍夫圆变换检测图像中的圆。最终,使用 cv2.circle()
函数将检测出的圆形绘制在上述的帧上。
总结
使用 OpenCV 的霍夫圆变换功能可以非常轻松地检测图像中的圆形。此外,OpenCV 可以与摄像机一起使用,实时地捕获并处理每一帧。巧妙使用本方法,可以实现很多实时的图像识别应用。
本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!