本章将介绍如下内容:
- 如何利用霍夫变换实现图像中的圆形检测
- 讲解核心函数:
cv2.HoughCircles()
理论基础
圆形在数学上表示为 $(x-x_{center})^2 + (y - y_{center})^2 = r^2$ , 其中 $(x_{center},y_{center})$ 为圆心坐标,$r$ 为圆的半径。 从方程可见需要检测三个参数(圆心 x,y + 半径 r), 若使用传统三维累加器将导致计算复杂度急剧上升、内存消耗显著增加。 OpenCV采用霍夫梯度法(Hough Gradient Method)进行优化, 利用边缘的梯度信息缩小参数空间,显著提升计算效率。
函数实现:核心函数 cv2.HoughCircles()
包含多个参数(具体说明参见官方文档),
下面直接展示代码实现:
import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv
img = cv.imread('/data/cvdata/opencv-logo-white.png',0)
img = cv.medianBlur(img,5)
cimg = cv.cvtColor(img,cv.COLOR_GRAY2BGR)
circles = cv.HoughCircles(img,cv.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
cv.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
# cv.imshow('detected circles',cimg)
# cv.waitKey(0)
# cv.destroyAllWindows()
plt.imshow(cimg)
<matplotlib.image.AxesImage at 0x7f5776d9d3a0>
结果如下所示:
circles = cv2.HoughCircles(
image, # 输入图像(必须为8位单通道灰度图)
method, # 检测方法(目前仅支持HOUGH_GRADIENT)
dp, # 累加器分辨率与图像分辨率的反比(通常为1)
minDist, # 检测到圆心之间的最小距离(过小会导致重复检测)
param1=50, # Canny边缘检测的高阈值
param2=30, # 圆心检测阈值(越小假圆越多)
minRadius=0, # 最小圆半径
maxRadius=0 # 最大圆半径(0表示不限制)
)
参数 | 调整策略 | 影响效果 |
---|---|---|
minDist |
设为图像宽度的1/10~1/5 | 避免相邻圆重叠 |
param1 |
通常设为Canny低阈值的2~3倍 | 影响边缘检测灵敏度 |
param2 |
根据图像复杂度调整(10~50) | 值越大检测标准越严格 |
minRadius |
已知最小半径时设为具体值 | 减少误检 |