利用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。

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

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

标签:
Opencv,Houghline,直线检测

免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
评论“利用Opencv中Houghline方法实现直线检测”
暂无“利用Opencv中Houghline方法实现直线检测”评论...

稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!

昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。

这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。

而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?