霍夫变化是一种在图像中寻找直线、圆形以及其他简单形状的方法。霍夫直线变换用来在图像内寻找直线,霍夫圆变换用来在图像内寻找圆。在Open CV 中,前者可以用函数 cv2.HoughLines()和函数cv2.HoughLinesP()实现,后者可以用函数cv2.HoughCircles()实现。

概率霍夫变换

Open CV中提供了函数 cv2.HoughLinesP()用来实现概率霍夫变换,其语法格式为:

lines = cv2.HoughLinesP (image, rho, theta,threshold, minLineLength, maxLineGap)

1.image:输入图像,需注意的是必须是8位的单通道二值图像。如果是其他类型图像,在进行霍夫变换之前,需将其修改指定格式。

2.rho:以像素为单位的距离r精度。一般情况下精度为1。

3.theta:为角度θ的精度,一般情况下精度为Π/180,表示搜索可能的角度。

4.threshold: 是阈值,该值越小判断出的直线就越多。

5.minLineLength :控制接受直线的最小长度

6:maxLineGap :控制接受共线间的最小间隔

注:返回值lines 中的每个元素都是一对浮点数,表示检测到的直线的参数,即(r,θ)是numpy。ndarray类型。

import cv2
import numpy as np

img = cv2.imread("zx.png")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray,50,150)
minLineLength = 10
maxLineGap = 50
lines = cv2.HoughLinesP(canny,1,np.pi/180,50,minLineLength,maxLineGap)

for line in lines:
    x1,y1,x2,y2 = line[0]
    cv2.line(img, (x1,y1),(x2,y2),(0,255,0),2)

cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindow()

代码运行解析及结果:

opencv霍夫变换校正 霍夫变换参数_ci

opencv霍夫变换校正 霍夫变换参数_边缘检测_02

霍夫圆环变换

      用霍夫圆变换来检测图像中的圆,与使用霍夫直线变换检测直线的原理类似。在霍夫圆变换中,需要考虑圆半径和圆心(x,y)坐标共三个参数。

实现霍夫圆变换的函数为cv2.HoughCircles(),将Canny边缘检测和霍夫变换结合,其语法为:

circles = cv2.HoughCircles(image, method, dp, minDist, param1, param2, minRadius, maxRadius)

1.image:输入图像,类型为8位单通道灰度图像(别忘了转换哟!!!)

2.method :检测方法。(截止Open CV 4.0.0-pre版本,HOUGH_GRADIENT是唯一可用的参数值。)

3.dp :累计器分辨率

4.minDist :圆心间的最小间距。

5.param1 :该参数缺省时默认为100.它对应的是Canny边缘检测器的搞阈值。

6.param2 : 圆心位置必须收到的投票数。(该值越大,检测到的圆越小;该值越小,检测到的圆越多。)

7.minRadius :圆半径的最小值,小于该值的圆不会被检测。(缺省时默认为0)

8.maxRadius:圆半径的最大值,大于该值的圆不会被检测。(缺省默认也为0)

9.circles :返回值,由圆心坐标和半径构成的numpy.ndarray。

import cv2
import numpy

img = cv2.imread("yq.png")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray,50,150)

circles = cv2.HoughCircles(canny,cv2.HOUGH_GRADIENT,1,30,param1 = 50,param2 = 30,minRadius = 5,maxRadius =100)

if not circles is None:
    circles = numpy.uint16(numpy.around(circles))
    
    for circle in circles:
        x,y,r = circle[0]
        cv2.circle(img, (x, y),int(r),(0,255,0),2)

cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindow()

代码运行解析及结果:

opencv霍夫变换校正 霍夫变换参数_霍夫变换_03

opencv霍夫变换校正 霍夫变换参数_ci_04

总结:概率霍夫变换比霍夫变换得到的检测结果更准确;函数cv2.HoughCircles()具有非常多的参数,在实际检测中可以根据需要设置不同的值。