【Opencv3+Python3入门(16)图像霍夫圆检测】

版权声明:本文为博主原创文章,转载时须注明出处 https://blog.csdn.net/KID_yuan/article/details/89575083

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,则返回没有找到半径的中心。

程序结果:

猜你喜欢

转载自blog.csdn.net/KID_yuan/article/details/89575083
今日推荐