霍夫变化是一种在图像中寻找直线、圆形以及其他简单形状的方法。霍夫直线变换用来在图像内寻找直线,霍夫圆变换用来在图像内寻找圆。在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()
代码运行解析及结果:
霍夫圆环变换
用霍夫圆变换来检测图像中的圆,与使用霍夫直线变换检测直线的原理类似。在霍夫圆变换中,需要考虑圆半径和圆心(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()
代码运行解析及结果:
总结:概率霍夫变换比霍夫变换得到的检测结果更准确;函数cv2.HoughCircles()具有非常多的参数,在实际检测中可以根据需要设置不同的值。