Opencv中实现霍夫圆检测一般是基于图像梯度的实现,而且其检测效果对噪声特别敏感,因此需要对图像首先进行滤波处理。
一般步骤:
1,检测边缘,发现可能的圆心。
2,基于第一步的基础上,计算可能的候选圆心的半径大小。
图像霍夫圆检测
在实际的检测中,各种参数之类需要自行进行调节。
#16,霍夫圆检测
import cv2 as cv
import numpy as np
def detect_circles_demo(image):
#均值漂移滤波避免噪声影响
dst = cv.pyrMeanShiftFiltering(image, 10, 100)
#图像转换为灰度图像
cimage = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
#cv.HoughCircles函数设置参数
circles = cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 80, param1=50, param2=30, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)
cv.circle(image, (i[0], i[1]), 2, (255, 0, 0), 2)
cv.imshow("circles_demo", image)
src = cv.imread(r'F:\OutputResult\SrcImage\coins2.jpg')
cv.namedWindow("src",0)
cv.imshow("src",src)
detect_circles_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
函数说明:
cv.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]])
image:参数图像8位,单通道,灰度输入图像。
method:参数方法检测方法,参数圆输出找到的圆的矢量的方法。上面用的是基于梯度的霍夫圆检测。
dp:累加器分辨率与图像分辨率的反比。例如,如果dp=1,累加器的分辨率与输入图像相同。如果dp=2,累加器一半的宽度和高度。
minDist:检测圆中心之间的最小距离。如果参数为太小,除了一个真正的圆外,可能还会错误地检测到多个相邻圆。如果是太大,有些圆可能会丢失。
param1:第一个方法特定参数。在hough_梯度的情况下,它是较高的通过Canny边缘检测器的两个阈值(较低的阈值小两倍)。
param2:第二个方法特定参数。在hough_梯度的情况下,它是检测阶段圆心的累加器阈值。它越小,就越多 可能会检测到假圆。与较大的累加器值相对应的圆先返回。
minRadius:最小半径最小圆半径。
maxRadius:最大半径最大圆半径。如果<=0,则使用最大图像尺寸。如果<0,则返回没有找到半径的中心。
程序结果: