码迷,mamicode.com
首页 > 其他好文 > 详细

学习 opencv---(13)opencv霍夫变换:霍夫线变换,霍夫圆变换

时间:2017-01-19 21:15:14      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:ble   init   idt   过程   ogr   表达   方向   需要   har   

   在本篇文章中,我们将一起学习opencv中霍夫变换相关的知识点,以及了解opencv中实现霍夫变换的HoughLines,HoughLinesP函数的使用方法,实现霍夫圆变换的HoughCircles函数的使用方法。

   先尝鲜一下其中一个示例程序的运行截图:

  技术分享

 

    

  一、引言

    在图像处理和计算机视觉领域中,如何从当前的图像中提取所需要的特征信息是图像识别的关键所在。在许多应用场合中需要快速准确的检测出直线或者圆。其中一种非常有效的解决问题的方法是霍夫(Hough)变换,其为图像处理中从图像识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。最基本的霍夫变换是从黑白图像中检测直线(线段),这篇文章就将介绍opencv中霍夫变换的使用方法和相关知识。

    

 二、霍夫变换概述

     霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个参数空间通过计算累计结果的局部最大值得到一个符合特定形状的集合作为霍夫变换结果。

   霍夫变换于1962年由PaulHough首次提出,最初的Hough变换是设计用来检测直线和曲线,起初的方法要求知道物体边界线的解析方程,但不需要有关区域位置的先验知识。这种方法的一个突出优点是分割结果的Robustness,即对数据的不完全或噪声不是非常敏感。然而,要获得描述边界的解析表达常常是不可能的。

  后于1972年由Richard Duda & Peter Hart推广使用,经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆。霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题。

 

   霍夫变换在opencv中分为霍夫线变换和霍夫圆变换俩种,下面将分别进行介绍。

   

  三、霍夫线变换    

      3.1  OpenCV中的霍夫线变换

      我们知道,霍夫线变换是一种用来寻找直线的方法,在使用霍夫变换之前,首先要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像。

     opencv支持三种不同的霍夫变线变换,分别是:标准霍夫变换(standard hough transform,SHT)和多尺度霍夫变换(Multi-Scale Hough Transform,MSHT),累计概率霍夫变换(Progressive Probablilistic Hough Transform,PPHT)

 

   其中,多尺度霍夫变换(MSHT)为经典霍夫变换(SHT)在多尺度下的一个变种。累计概率霍夫变换(PPHT)算法是标准霍夫变换(SHT)算法的一个改进。

它在一定的范围内进行霍夫变换,计算单独线段的方向以及范围,从而减少计算量,缩短计算时间。之所以PPHT为“概率”的,是因为并不将累加器平面内的所有可能的点累加,而是累加其中的一部分,该想法是如果峰值足够高,只用一小部分时间去寻找它就够了。这样猜想的话,可以实质性的减少计算时间。

  在opencv中,我们可以用HoughLines函数来调用标准霍夫变换SHT和多尺度霍夫变换MSHT。

  而HoughLinesP函数用于调用累计概率霍夫变换的PPHT。累计概率霍夫变换执行效率很高,所有相比于HoughLines函数,我们更倾向于使用HoughLinesP函数。

 

    总结一下,OpenCV中的霍夫线变换有如下三种: 

<1>标准霍夫变换(StandardHough Transform,SHT),由HoughLines函数调用。

<2>多尺度霍夫变换(Multi-ScaleHough Transform,MSHT),由HoughLines函数调用。

<3>累计概率霍夫变换(ProgressiveProbabilistic Hough Transform,PPHT),由HoughLinesP函数调用。

 

   3.2 霍夫线变换的原理

  【1】总所周知,一条直线在图像二维空间可由俩个变量表示,如:

   (1)在笛卡尔坐标系:可由参数:斜率和截距(m,b)表示

   (2)在极坐标系:可由参数:极径和极角技术分享表示

                                                     技术分享

      

   对于霍夫变换,我们将采用第二种方式极坐标系来表示直线,因此,直线的表达式可为:

                                 技术分享

   化简便可得到:

                                                          技术分享

      【2】一般来说对于点技术分享, 我们可以将通过这个点的一族直线统一定义为:

                                                           技术分享

  这就意味着每一对技术分享代表一条通过点技术分享的直线。

  

 【3】如果对于一个给定点技术分享我们在极坐标对极径极角平面绘出所有通过它的直线, 将得到一条正弦曲线. 例如, 对于给定点X_0= 8 和Y_0= 6 我们可以绘出下图 (在平面):

                                                                               技术分享

  只绘出满足下列条件的点 技术分享 和  技术分享 .

  

【4】我们可以对图像中所有的点进行上述操作. 如果两个不同点进行上述操作后得到的曲线在平面技术分享相交, 这就意味着它们通过同一条直线. 例如,接上面的例子我们继续对点 技术分享 和点 技术分享 绘图, 得到下图:

                                                                                  技术分享

   这三条曲线在平面相交于点 (0.925, 9.6), 坐标表示的是参数对 技术分享 或者是说点技术分享, 点技术分享和点技术分享组成的平面内的的直线。

 

  【5】以上的说明表明,一般来说, 一条直线能够通过在平面 技术分享 寻找交于一点的曲线数量来检测。而越多曲线交于一点也就意味着这个交点表示的直线由更多的点组成. 一般来说我们可以通过设置直线上点的阈值来定义多少条曲线交于一点我们才认为检测到了一条直线。

 【6】这就是霍夫线变换要做的. 它追踪图像中每个点对应曲线间的交点. 如果交于一点的曲线的数量超过了阈值, 那么可以认为这个交点所代表的参数对技术分享在原图像中为一条直线。

 

   3.3 HoughLines( )函数详解

    此函数可以采用标准霍夫变换的二值图像线条。在opencv 中,我们可以用来调用标准霍夫变换SHT和多尺度霍夫变换MSHT的opencv内建算法

1 void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 );

   

  • 第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像,可以将任意的源图载入进来后由函数修改成此格式后,再填在这里。
  • 第二个参数,InputArray类型的lines,经过调用HoughLines函数后储存了霍夫线变换检测到线条的输出矢量。每一条线由具有两个元素的矢量技术分享

     

    表示,其中,技术分享是离坐标原点((0,0)(也就是图像的左上角)的距离。 技术分享是弧度线条旋转角度(0~垂直线,π/2~水平线)。
  • 第三个参数,double类型的rho,以像素为单位的距离精度。另一种形容方式是直线搜索时的进步尺寸的单位半径。PS:Latex中/rho就表示 技术分享
  • 第四个参数,double类型的theta,以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。
  • 第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中。
  • 第六个参数,double类型的srn,有默认值0。对于多尺度的霍夫变换,这是第三个参数进步尺寸rho的除数距离。粗略的累加器进步尺寸直接是第三个参数rho,而精确的累加器进步尺寸为rho/srn。
  • 第七个参数,double类型的stn,有默认值0,对于多尺度霍夫变换,srn表示第四个参数进步尺寸的单位角度theta的除数距离。且如果srn和stn同时为0,就表示使用经典的霍夫变换。否则,这两个参数应该都为正数。

 

   在学完函数解析,看看浅墨为大家准备的以HoughLines为核心的示例程序,就可以全方位了解HoughLines函数的使用方法了:

 

学习 opencv---(13)opencv霍夫变换:霍夫线变换,霍夫圆变换

标签:ble   init   idt   过程   ogr   表达   方向   需要   har   

原文地址:http://www.cnblogs.com/wyuzl/p/6308685.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!