利用Opencv中的Houghline方法进行直线检测—python语言

这是给Python部落翻译的文章,请在这里看原文。

在图像处理中,霍夫变换用来检测任意能够用数学公式表达的形状,即使这个形状被破坏或者有点扭曲。

下面我们将看到利用HoughLine算法来阐述霍夫变化进行直线检测的原理,把此算法应用到特点图像的边缘检测是可取的。边缘检测方法请参考这篇文章–边缘检测。

Houghline算法基础

直线可以表示为y=mx+c,或者以极坐标形式表示为r=xcosθ+ysinθ,其中r是原点到直线的垂直距离,θ是水平轴顺时针方向到垂直线的夹角(这个方向取决于坐标的形式,在OpenCV就是采用这种极坐标形式)。

利用Opencv中Houghline方法实现直线检测

因此任意的曲线都可以用两个参数(r,θ)表示。

HoughLine算法原理:

  • 首先建立一个二维的数组或者累加器(用来保存这两个参数),并初始化为零;
  • 这个二维数组的行代表不同的r,而列代表角度θ;
  • 数组的大小取决于算法的精度。假设所需角度的精度精确到1"text-align: center">利用Opencv中Houghline方法实现直线检测

    上述算法的过程被封装成OpenCV函数cv2.HoughLines(),函数返回(r,θ)的一个数组,其中r的单位为像素,θ的单位为弧度。

    # Python program to illustrate HoughLine
    # method for line detection
    import cv2
    import numpy as np
    
    # Reading the required image in 
    # which operations are to be done. 
    # Make sure that the image is in the same 
    # directory in which this python program is
    img = cv2.imread('xyz.jpg')
    
    # Convert the img to grayscale
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    # Apply edge detection method on the image
    edges = cv2.Canny(gray,50,150,apertureSize = 3)
    
    # This returns an array of r and theta values
    lines = cv2.HoughLines(edges,1,np.pi/180, 200)
    
    # The below for loop runs till r and theta values 
    # are in the range of the 2d array
    for r,theta in lines[0]:
    
     # Stores the value of cos(theta) in a
     a = np.cos(theta)
    
     # Stores the value of sin(theta) in b
     b = np.sin(theta)
    
     # x0 stores the value rcos(theta)
     x0 = a*r
    
     # y0 stores the value rsin(theta)
     y0 = b*r
    
     # x1 stores the rounded off value of (rcos(theta)-1000sin(theta))
     x1 = int(x0 + 1000*(-b))
    
     # y1 stores the rounded off value of (rsin(theta)+1000cos(theta))
     y1 = int(y0 + 1000*(a))
    
     # x2 stores the rounded off value of (rcos(theta)+1000sin(theta))
     x2 = int(x0 - 1000*(-b))
    
     # y2 stores the rounded off value of (rsin(theta)-1000cos(theta))
     y2 = int(y0 - 1000*(a))
    
     # cv2.line draws a line in img from the point(x1,y1) to (x2,y2).
     # (0,0,255) denotes the colour of the line to be 
     #drawn. In this case, it is red. 
     cv2.line(img,(x1,y1), (x2,y2), (0,0,255),2)
    
    # All the changes made in the input image are finally
    # written on a new image houghlines.jpg
    cv2.imwrite('houghlines3.jpg', img)
    
    

    函数(cv2.HoughLines(edges, 1, np.pi/180,200))

    • 第一个参数是输入图像,且必须是二值图像,在进行霍夫变换之前需要采用阈值方法的边缘检测;
    • 第二和第三个参数分别是r,θ对应的精度;
    • 第四个参数是阈值,判定为直线投票数的最小值;
    • 注意,投票数取决于直线上点的个数,因此这个阈值代表了检测到的直线的最短长度。

    利用Opencv中Houghline方法实现直线检测

    总结

    • 在图像分析应用中,边缘分割点的坐标(即X,Y)是已知的,在直线的参数方程中作为输入,而r,θ是我们要找的未知变量;
    • 对每一个角度θ,求出r的值,也就是将笛卡尔图像空间的点映射到霍夫参数极坐标空间的曲线,这种点到曲线的变换就是直线的霍夫变换;
    • 这种变换是通过量化霍夫参数为有限的间隔或者累加器单元来实现的,随着算法的运行,每一个(X,Y)转换成离散的(r,θ)曲线,曲线上的点对应的累加器(二维数组)的值会递增;
    • 累加器中的峰值就代表了图像中有相应直线的存在。

    霍夫变换的应用

    • 用于分离图像中特殊形状的特征;
    • 可以容忍特征边界描述的误差,并且不受噪声的干扰;
    • 广泛用于条形码扫描、验证和识别。

    文章作者是Pratima Upadhyay,如果你喜欢GeeksforGeeks,并且愿意分享,可以利用contribute.geeksforgeeks.org写文章,然后发送到contribute@geeksforgeeks.org,在GeeksforGeeks中看到自己的文章,帮助更多的Geeks。

    若发现错误欢迎指正,也欢迎评论。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com

RTX 5090要首发 性能要翻倍!三星展示GDDR7显存

三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。

首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。

据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。