61 二值图像分析—霍夫圆检测
代码
import cv2 as cv
import numpy as np
src = cv.imread("../images/coins.jpg")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
gray = cv.GaussianBlur(gray, (9, 9), 2, 2)
dp = 2
param1 = 100
param2 = 80
circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp, 30, None, param1, param2, 20, 80)
for c in circles[0,:]:
print(c)
cx, cy, r = c
cv.circle(src, (cx, cy), 2, (0, 255, 0), 2, 8, 0)
cv.circle(src, (cx, cy), r, (0, 0, 255), 2, 8, 0)
# 显示
cv.imshow("hough line demo", src)
cv.waitKey(0)
cv.destroyAllWindows()
实验结果
解释
根据极坐标,圆上任意一点的坐标可以表示为如上形式, 所以对于任意一个圆, 假设中心像素点p(x0, y0)像素点已知, 圆半径已知,则旋转360由极坐标方程可以得到每个点上得坐标同样,如果只是知道图像上像素点, 圆半径,旋转360°则中心点处的坐标值必定最强.这正是霍夫变换检测圆的数学原理
X = x0+rcos(theta)
Y = y0+rsin(theta)
OpenCV中霍夫圆检测的API与参数解释如下:
circles = cv.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]] )
image
表示输入单通道的灰度图像method
圆检测的方法dp
表示图像分辨率是否有变化,默认1表示保持跟原图大小一致minDist
表示检测到的圆,两个圆心之间的最小距离circles
表示检测的圆信息(圆心+半径)param1
表示边缘提取的高阈值param2
表示霍夫空间的累加阈值minRadius
表示可以检测圆的最小半径maxRadius
表示可以检测圆的最大
所有内容均来源于贾志刚老师的知识星球——OpenCV研习社,本文为个人整理学习,已获得贾老师授权,有兴趣、有能力的可以加入贾老师的知识星球进行深入学习。