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

 更新时间:2021年09月01日 11:10:20   作者:CONQUERczy  
这篇文章主要为大家详细介绍了利用Opencv中的Houghline方法进行直线检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

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

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

Houghline算法基础

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

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

HoughLine算法原理:

  • 首先建立一个二维的数组或者累加器(用来保存这两个参数),并初始化为零;
  • 这个二维数组的行代表不同的r,而列代表角度θ;
  • 数组的大小取决于算法的精度。假设所需角度的精度精确到1∘,那么就需要180列(直线的最大角度是180)。
  • 对于r,最大的可能距离是图像的对角长度,因此若需要一个像素的精度,那么需要把行数设为图像对角线的长度。

例子:

假设一幅100x100的图像,在图像中间有一条水平直线。设直线的第一个点的坐标为(x,y),在直线方程中,令参数θ=0,12,⋯,180,观查参数r变化。对每一个参数对(r,θ),在累加器中将(r,θ)对应的单元格中的值递增1,比如现在在累加器中,某个单元(50,90)的值等于1,其它的值也如此。

对于直线上的第二个点,重复上述操作。将得到的参数对(r,θ)的对应值继续递增,然后(50,90)对应的值等于2。实现上我们是对参数对(r,θ)进行投票,对直线上的每一个点重复上述操作,对每一个点,单元格(50,90)对应的值会递增,或者说投票给参数对(50,90),而会或者不会投票给其它参数对。以这种方式,最后单元格(50,90)的值将会是最大的值。然后搜索累加器的最大值,将会找到参数对(50,90)。也就是说,在图像中找到了到原点距离为50,角度为90的一条直线。

上述算法的过程被封装成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,θ对应的精度;
  • 第四个参数是阈值,判定为直线投票数的最小值;
  • 注意,投票数取决于直线上点的个数,因此这个阈值代表了检测到的直线的最短长度。

总结

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

霍夫变换的应用

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

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

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

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

相关文章

  • python实现自动获取IP并发送到邮箱

    python实现自动获取IP并发送到邮箱

    这篇文章主要为大家详细介绍了python实现自动获取IP并发到邮箱,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Python数据类型探索列表魔法世界

    Python数据类型探索列表魔法世界

    这篇文章主要为大家介绍了Python数据类型探索列表魔法世界,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • pytz格式化北京时间多出6分钟问题的解决方法

    pytz格式化北京时间多出6分钟问题的解决方法

    这篇文章主要给大家介绍了关于pytz格式化北京时间多出6分钟问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • python中的_和__用法及说明

    python中的_和__用法及说明

    这篇文章主要介绍了python中的_和__用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Python Xml文件添加字节属性的方法

    Python Xml文件添加字节属性的方法

    下面小编就为大家分享一篇Python Xml文件添加字节属性的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • 对python中url参数编码与解码的实例详解

    对python中url参数编码与解码的实例详解

    今天小编就为大家分享一篇对python中url参数编码与解码的实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • 通过 Python 和 OpenCV 实现目标数量监控

    通过 Python 和 OpenCV 实现目标数量监控

    这篇文章主要介绍了如何通过 Python 和 OpenCV 实现目标数量监控,本文通过实例代码图文的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • Python实例练习水仙花数问题讲解

    Python实例练习水仙花数问题讲解

    这篇文章介绍了Python找水仙花数从分析到实现的过程,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • python枚举类型定义与使用讲解

    python枚举类型定义与使用讲解

    在python中枚举是一种类(Enum,IntEnum),存放在enum模块中。枚举类型可以给一组标签赋予一组特定的值,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Python实现一键自动分类管理文件

    Python实现一键自动分类管理文件

    经常杂乱无章的文件夹会让我们找不到所想要的文件,所以本文小编特意为大家介绍了如何制作一个可视化GUI界面,通过输入路径一键点击实现文件分门别类的归档,希望对大家有所帮助<BR>
    2024-01-01

最新评论