霍夫变换在OpenCV
上面解释的所有内容都封装在OpenCV函数中,cv.HoughLines()。它只是返回一个数组:math:(rho,theta)的值。
ρ是以像素为单位的θ以弧度。第一个参数,输入图像应该是一个二进制图像,所以在应用hough变换之前应用阈值或使用精明的边缘检测。第二和第三个参数ρ分别精度。第四个参数是阈值,这意味着它应该被认为是一条直线。记住,投票的数量取决于直线上的点数。所以它表示应该检测到的最小长度。
import cv2 as cv
import numpy as np
img = cv.imread('xiangqi.jpg')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray,50,150,apertureSize = 3)
lines = cv.HoughLines(edges,1,np.pi/180,140)
for line in lines:
rho,theta = line[0]
a = np.cos(theta)
b = np.sin(theta)
x0 = a*rho
y0 = b*rho
x1 = int(x0 + 1000*(-b))
y1 = int(y0 + 1000*(a))
x2 = int(x0 - 1000*(-b))
y2 = int(y0 - 1000*(a))
cv.line(img,(x1,y1),(x2,y2),(0,0,255),2)
cv.imshow('houghlines3.jpg',img)
cv.waitKey(0)
cv.destroyAllWindows()
图像
概率霍夫变换
在hough变换中,你可以看到即使是有两个参数的直线,也需要大量的计算。概率Hough变换是我们看到的Hough变换的优化。它并没有把所有的要点都考虑进去。相反,它只需要一个随机的点子集,这就足以进行线检测了。只是我们必须降低门槛。下面的图片比较了Hough空间的Hough变换和概率Hough变换。(图片来源:Franck Bettinger的主页)
OpenCV的实现是基于对Matas、j和Galambos、c和Kittler、J.V.125的渐进概率Hough变换的鲁棒检测。所使用的函数是cv.HoughLinesP()。它有两个新的论点。
最小长度的线。比这短的线段被拒绝。
maxLineGap-最大允许在线段之间的间隙将它们作为一条线来对待。
最好的事情是,它直接返回两条直线的端点。在之前的例子中,你只得到了线的参数,你必须找到所有的点。在这里,一切都是直接和简单的。
import cv2 as cv
import numpy as np
img = cv.imread('xiangqi.jpg')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray,50,150,apertureSize = 3)
lines = cv.HoughLinesP(edges,1,np.pi/180,80,minLineLength=80,maxLineGap=40)
for line in lines:
x1,y1,x2,y2 = line[0]
cv.line(img,(x1,y1),(x2,y2),(0,255,0),1)
cv.imshow('houghlines3.jpg',img)
cv.waitKey(0)
cv.destroyAllWindows()
、