python-opencv Tutorials 一码人翻译(28)图像处理---- --霍夫直线检测

霍夫变换在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()

猜你喜欢

转载自blog.csdn.net/qq_41905045/article/details/81707646