标签:ble init idt 过程 ogr 表达 方向 需要 har
在本篇文章中,我们将一起学习opencv中霍夫变换相关的知识点,以及了解opencv中实现霍夫变换的HoughLines,HoughLinesP函数的使用方法,实现霍夫圆变换的HoughCircles函数的使用方法。
先尝鲜一下其中一个示例程序的运行截图:
在图像处理和计算机视觉领域中,如何从当前的图像中提取所需要的特征信息是图像识别的关键所在。在许多应用场合中需要快速准确的检测出直线或者圆。其中一种非常有效的解决问题的方法是霍夫(Hough)变换,其为图像处理中从图像识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。最基本的霍夫变换是从黑白图像中检测直线(线段),这篇文章就将介绍opencv中霍夫变换的使用方法和相关知识。
霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个参数空间通过计算累计结果的局部最大值得到一个符合特定形状的集合作为霍夫变换结果。
霍夫变换于1962年由PaulHough首次提出,最初的Hough变换是设计用来检测直线和曲线,起初的方法要求知道物体边界线的解析方程,但不需要有关区域位置的先验知识。这种方法的一个突出优点是分割结果的Robustness,即对数据的不完全或噪声不是非常敏感。然而,要获得描述边界的解析表达常常是不可能的。
后于1972年由Richard Duda & Peter Hart推广使用,经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆。霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题。
霍夫变换在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函数调用。
【1】总所周知,一条直线在图像二维空间可由俩个变量表示,如:
(1)在笛卡尔坐标系:可由参数:斜率和截距(m,b)表示
(2)在极坐标系:可由参数:极径和极角表示
对于霍夫变换,我们将采用第二种方式极坐标系来表示直线,因此,直线的表达式可为:
化简便可得到:
【2】一般来说对于点, 我们可以将通过这个点的一族直线统一定义为:
这就意味着每一对代表一条通过点的直线。
【3】如果对于一个给定点我们在极坐标对极径极角平面绘出所有通过它的直线, 将得到一条正弦曲线. 例如, 对于给定点X_0= 8 和Y_0= 6 我们可以绘出下图 (在平面):
只绘出满足下列条件的点 和 .
【4】我们可以对图像中所有的点进行上述操作. 如果两个不同点进行上述操作后得到的曲线在平面相交, 这就意味着它们通过同一条直线. 例如,接上面的例子我们继续对点 和点 绘图, 得到下图:
这三条曲线在平面相交于点 (0.925, 9.6), 坐标表示的是参数对 或者是说点, 点和点组成的平面内的的直线。
【5】以上的说明表明,一般来说, 一条直线能够通过在平面 寻找交于一点的曲线数量来检测。而越多曲线交于一点也就意味着这个交点表示的直线由更多的点组成. 一般来说我们可以通过设置直线上点的阈值来定义多少条曲线交于一点我们才认为检测到了一条直线。
【6】这就是霍夫线变换要做的. 它追踪图像中每个点对应曲线间的交点. 如果交于一点的曲线的数量超过了阈值, 那么可以认为这个交点所代表的参数对在原图像中为一条直线。
此函数可以采用标准霍夫变换的二值图像线条。在opencv 中,我们可以用来调用标准霍夫变换SHT和多尺度霍夫变换MSHT的opencv内建算法
1 void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 );
表示,其中,是离坐标原点((0,0)(也就是图像的左上角)的距离。 是弧度线条旋转角度(0~垂直线,π/2~水平线)。
在学完函数解析,看看浅墨为大家准备的以HoughLines为核心的示例程序,就可以全方位了解HoughLines函数的使用方法了:
学习 opencv---(13)opencv霍夫变换:霍夫线变换,霍夫圆变换
标签:ble init idt 过程 ogr 表达 方向 需要 har
原文地址:http://www.cnblogs.com/wyuzl/p/6308685.html