一、获取圆形检测原理
原图如下:
选取一个圆的任意点设定为圆形进行绘制圆形,交与一点
再将平面直角坐标系上的各点,通过公式转到极坐标上
很明显的看出较亮的点为圆心,然后通过半径进行绘制出圆。
二、实现步骤
由于霍夫圆检测对噪声比较明显,故需要首先对图像进行滤波操作(中值滤波等)
霍夫圆形检测是基于图像梯度实现的,分为两步:
1,检测边缘,发现可能是圆的圆形
2,基于第一步从候选的圆心中开始计算,求出最佳的半径大小
三、代码实现
cv2.HoughCircles(cimage,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0)
cv2.HOUGH_GRADIENT:基于梯度计算
1:步长
20:最小距离即检测出来的两个圆形之间的最小距离,超过这个最小距离才会认定是两个圆
param1=50,param2=30:高低阈值的设定
minRadius=0,maxRadius=0:当不确定圆的半径时,可以这样设定
import cv2
import numpy as np
from matplotlib import pyplot as pltdef detect_circles(image):dst = cv2.pyrMeanShiftFiltering(image,10,100)#消除噪声!!!!必不可少cimage = cv2.cvtColor(dst,cv2.COLOR_BGR2GRAY)circles = cv2.HoughCircles(cimage,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0)circles = np.uint16(np.around(circles))for i in circles[0,:]:cv2.circle(image,(i[0],i[1]),i[2],(0,0,255),2)cv2.circle(image,(i[0],i[1]),2,(255,0,0),2)#圆心cv2.imshow("circles",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\circles.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
detect_circles(src)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果图如下: