?基本原理:
对于圆周上的每一个点,求其梯度,根据梯度可做出关于此点的切线,与切线垂直的方向就是梯度样方向,每个点的梯度方向的交点就是圆心,然后根据圆心的位置可以确定其半径。
直线的Hough变化:
图像Hough变换_独憩的博客-CSDN博客
函数:
circles=cv.HoughCircles(image, method, dp, minDist[, param1[, param2[, minRadius[, maxRadius]]]]])
image:灰度图像
method:一般为cv.HOUGH_GRADIENT
dp:累加器分辨率与图像分辨率的反比,一般为1
minDist:不同圆心直接的最小距离,太大会遗漏一些圆形,太小会产生许多无关的圆
param1:传递给 canny 边缘检测算子的高阀值,而低阀值为高阀值的一半
param2:是检测阶段圆心的累加阀值。越小可以检测到更多的假圆。越大能通过检测的圆就更加接近完美的圆形。
minRadius:最小半径
maxRadius:最大半径
?实例:
import cv2.cv2
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img1 = cv.imread(r'XXXXX.jpg')
img=img1.copy()
img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
img = cv.medianBlur(img,5)
cimg = cv.cvtColor(img,cv.COLOR_GRAY2BGR)
circles = cv.HoughCircles(img,cv.HOUGH_GRADIENT,1,300,
param1=50,param2=30,minRadius=50,maxRadius=200)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# 画圆:
cv.circle(img1,(i[0],i[1]),i[2],(0,255,0),5)
# 圆心:
cv.circle(img1,(i[0],i[1]),2,(0,0,255),5)
cv.imshow('detected circles',img1)
cv.waitKey(0)
cv.destroyAllWindows()
?
?
|