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

Posted Python程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用Opencv中的Houghline方法进行直线检测---python语言相关的知识,希望对你有一定的参考价值。

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

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

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

下面我们将看到利用HoughLine算法来阐述霍夫变化进行直线检测的原理,把此算法应用到特定图像的边缘检测是可取的。

Houghline算法基础

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

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

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

HoughLine算法原理:

  • 首先建立一个二维的数组或者累加器(用来保存这两个参数),并初始化为零;

  • 这个二维数组的行代表不同的r,而列代表角度θ;

  • 数组的大小取决于算法的精度。假设所需角度的精度精确到1^°,那么就需要180列(直线的最大角度是180)。

  • 对于r,最大的可能距离是图像的对角长度,因此若需要一个像素的精度,那么需要把行数设为图像对角线的长度。

例子:

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

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

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

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

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

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

  1. 第一个参数是输入图像,且必须是二值图像,在进行霍夫变换之前需要采用阈值方法进行边缘检测;

  2. 第二和第三个参数分别是r,θ对应的精度;

  3. 第四个参数是阈值,判定为直线投票数的最小值;

  4. 注意,投票数取决于直线上点的个数,因此这个阈值代表了检测到的直线的最短长度。

总结

  • 在图像分析应用中,边缘分割点的坐标(即X,Y)是已知的,在直线的参数方程中作为输入,而r,θ是我们要找的未知变量;

  • 对每一个角度θ,求出r的值,也就是将笛卡尔图像空间的点映射到霍夫参数极坐标空间的曲线,这种点到曲线的变换就是直线的霍夫变换;

  • 这种变换是通过量化霍夫参数为有限的间隔或者累加器单元来实现的,随着算法的运行,每一个(X,Y)转换成离散的(r,θ)曲线,曲线上的点对应的累加器(二维数组)的值会递增;

  • 累加器中的峰值就代表了图像中有相应直线的存在。

霍夫变换的应用

  1. 用于分离图像中特殊形状的特征;

  2. 可以容忍特征边界描述的误差,并且不受噪声的干扰;

  3. 广泛用于条形码扫描、验证和识别。



英文原文:http://www.geeksforgeeks.org/line-detection-python-opencv-houghline-method/
译者:CONQUER


以上是关于利用Opencv中的Houghline方法进行直线检测---python语言的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV Houghline 函数创建无限线

如何利用opencv计算图像畸变系数,并进行校正与摄像机标定?

OpenCV利用鼠标在如下图所示的MFC视频图像上画直线?

opencv利用hough概率变换拟合得到直线后,利用DDA算法得到直线上的像素点坐标

利用OpenCV的霍夫变换线检测函数HoughLines()得到直线的ρ和θ值后绘制直线的原理详解

Python 如何使用 HoughLines 和 OpenCV 检测图像中的垂直线和水平线?