【Opencv3+Python3入门(15)图像霍夫变换直线检测】

版权声明:本文为博主原创文章,转载时须注明出处 https://blog.csdn.net/KID_yuan/article/details/89567844

图像霍夫变换直线检测

霍夫直线检测是利用点在直角坐标与极坐标之间的互相转换关系来进行求解的。

检测前提:边缘检测已经完成。

根据图像的边缘上的每一个点的坐标(x,y)都有其对应的极坐标表示,此时若固定(x,y),将角度θ作为自变量,极半径r作为因变量,则可以根据下面的表达式(即上面红色直线的平面坐标表达式,(x,y)为其上面的点):得到r随θ变化的曲线。

在不知道对于每一个图像上边缘的点是否为一条直线上时,对所有边缘点都对其进行取不同的θ值,带入上面的表达式,当发现某些点的曲线相交于一点,说明这些相交的点为同一直线上的点,(因为若是同一直线上的点时,该直线的表达式中的θ固定了)然后再将θ和r反变换为点的坐标,即可得到直线。

程序如下:

#15,霍夫直线检测
import cv2 as cv
import numpy as np
 
def line_detection(image):
    #将图像转换为灰度图像
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    #利用Canny进行边缘检测
    edges = cv.Canny(gray, 50, 150, apertureSize=3)
    #设置霍夫直线检测参数
    #第二个参数为半径的步长,第三个参数为每次偏转的角度
    lines = cv.HoughLines(edges, 1, np.pi/180, 80)
    print(type(lines))
    #将求得交点坐标反代换进行直线绘制
    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(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
    cv.namedWindow("lines_demo",0)
    cv.imshow("lines_demo", image)

def line_detect_possible_demo(image):
    #通常用第二种方式。
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    edges = cv.Canny(gray, 50, 150, apertureSize=3)
    #自动检测可能的直线,返回的是一条条线段
    lines = cv.HoughLinesP(edges, 1, np.pi/180, 80, minLineLength=50, maxLineGap=10)
    print(type(lines))
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
    cv.imshow("linepossible_demo", image)
 
src = cv.imread(r'F:\OutputResult\SrcImage\tianzi1.jpg')
cv.namedWindow("src",0)
cv.imshow("src",src)
line_detect_possible_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

主要用到的函数:

cv.HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]])

扫描二维码关注公众号,回复: 6063254 查看本文章

image:输入边缘图像。

rho:以像素为单位的累加器的参数rho距离分辨率。

theta:以弧度表示的累加器的参数θ角分辨率。

threshold:参数阈值累加器阈值参数。只有那些得到足够的投票(在阈值内)直线lines被返回。

srn:对于多尺度Hough变换,它是距离分辨率rho的除数。粗累加器距离分辨率为rho,精确累加器分辨率为RHO/SRN。如果srn=0和stn=0,则使用经典的hough变换。否则,这两个参数应为正数。

stn:对于多尺度Hough变换,它是距离分辨率theta的除数。参数最小值用于标准和多尺度Hough变换,最小角度用于检查线条,必须介于0和maxθ之间。

min_theta:参数最小值用于标准和多尺度Hough变换,最小角度用于检查线条。必须介于0和maxθ之间。

max_theta:参数最大值用于标准和多尺度Hough变换,最大角度用于检查线条。必须介于minθ和π之间。

HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]])

image:输入边缘图像。返回值输出行向量。每一行由一个4元向量表示是每个检测到的结束点线段。

rho:以像素为单位的累加器的参数rho距离分辨率。

theta:以弧度表示的累加器的参数θ角分辨率。

threshold:参数阈值累加器阈值参数。只有那些得到足够的投票(满足阈值)行被返回。

minLineLength:最小行长度。短于被拒绝的线段。

maxLineGap:连接同一行上的点之间允许的最大间隙。

通常都使用第二种方式

运行结果:

猜你喜欢

转载自blog.csdn.net/KID_yuan/article/details/89567844