python OpenCV学习笔记(二十八):Hough圆变换

官方文档 – https://docs.opencv.org/3.4.0/da/d53/tutorial_py_houghcircles.html


一个圆在数学上表示为这里写图片描述,其中这里写图片描述是圆心,r 是半径。从方程中可以看出,我们有3个参数,所以我们需要一个用于hough变换的3D累加器,这将是非常无效的。因此,OpenCV使用了更复杂的方法,Hough梯度法,该方法使用边缘的梯度信息。
使用函数cv.HoughCircles()
cv.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]])
method:详见cv::HoughModes
dp:累加器分辨率与图像分辨率的逆比。例如,如果dp=1,则累加器与输入图像的分辨率相同。如果dp=2,这个累加器的宽度和高度是图像的一半。
minDist:探测到的圆的中心之间的最小距离。如果参数太小,除了真实的一个外,还可能错误地检测到多个相邻圆。如果它太大,可能会漏掉一些圆。
param1:第一个特定参数。如果是CV_HOUGH_GRADIENT的情况下,是传递给Canny边缘检测器中较高阈值的参数(低的参数小两倍)
param2:第二个特定参数。如果是CV_HOUGH_GRADIENT的情况下,它是检测阶段圆中心的累加器阈值。它越小,就会发现越多的假圆。与较大的累加器值相对应的圆,将首先返回。
minRadius:最小半径
maxRadius:最大半径

import numpy as np
import cv2 as cv

img = cv.imread('opencv-log-white.png', 0)
img = cv.medianBlur(img, 5)
cimg = cv.cvtColor(img, cv.COLOR_GRAY2BGR)

circles = cv.HoughCircles(img, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
    # 画出输出的圆
    cv.circle(cimg, (i[0], i[1]), i[2], (0,255,0), 2)
    # 画出圆心
    cv.circle(cimg, (i[0], i[1]), 2, (0,0,255), 3)

cv.imshow('detected circles', cimg)
cv.waitKey(0)
cv.destroyAllWindows()

python OpenCV学习笔记(二十八):Hough圆变换_第1张图片

你可能感兴趣的:(OpenCV)