通俗易懂之OpenCV之霍夫变换原理(精讲)

入门前的知识回顾:

1、笛卡尔坐标系:相交于原点的两条数轴,构成了平面放射坐标系(直角坐标系和斜坐标系的统称)

                    斜率:表示一条直线(或曲线的切线)关于(横)坐标轴倾斜程度的量。它通常用直线(或曲线的切线)与(横)坐标轴夹角的正切,或两点的纵坐标之差与横坐标之差的比来表示。

                    截距:(数学中)直线交予X,Y轴对应的X,Y的大小。分别表示对应的横截距和纵截距。

例:        如:y=2x+2  斜率为:BO/OA=2/1=2;       

                      x轴上的截距为1,截点为A(-1,0) x轴上的截距为-1,截点为A(-1,0) 

                      y轴上的截距为1,截点为A(0,2)   Y轴上的截距为2,截点为B(0,2) 

                                

2、极坐标系、极径、极角:

        平面内由极点、极轴和极径组成的坐标系。在平面上取定一点O,称为极点。从O出发引一条射线Ox,称为极轴。再取定一个单位长度,通常规定角度取逆时针方向为正。这样,平面上任一点M的位置就可以用线段OM的长度ρ以及从Ox到OM的角度θ来确定,有序数对(ρ,θ)就称为M点的极坐标,记为P(ρ,θ);ρ称为P点的极径,θ称为M点的极角。

                                             

3、余弦定理:

                                       

霍夫变换:

  霍夫变换 是图像处理中的一种特征提取技术。该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换的结果。其运用两个坐标空间之间的变换将一个空间中具有相同形状的曲线或直线映射到了另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值的问题。

霍夫变换思想:

          先看这样一个问题(这是借鉴了其他博客总结觉得比较具有说明意义的例子):设已知一黑白图像上画了一条直线,要求出这条直线所在的位置。我们知道,直线的方程可以用y=k*x+b 来表示,其中k和b是参数,分别是斜率和截距。过某一点(x0,y0)的所有直线的参数都会满足方程y0=kx0+b。即点(x0,y0)确定了一族直线。方程y0=kx0+b在参数k--b平面上是一条直线,(你也可以是方程b=-x0*k+y0对应的直线)。这样,图像x--y平面上的一个前景像素点就对应到k--b参数平面上的一条直线。

例:  假设存在直线方程L: y=-2x+3(k=-2, b=3) .满足坐标点A(1,1) B( 3/2 , 0 ),  C( 2 , -1)

则:

方程L经过点A由x-y坐标转换为k-b坐标函数为:1 = -2*1+3     =>      y = k*x+b     ==> 1= k*1+b   ==>1=k+b          ==>  b=1-k

方程L经过点B由x-y坐标转换为k-b坐标函数为: 0 = -2 *3/2+3  =>     y = k*x+b    ==>0=k*3/2+b   ==>0=3/2k+b    ==>b= -3/2k

方程L经过点C由x-y坐标转换为k-b坐标函数为:C : - = -2 * 2 +3 =>    y = k*x+b    ==> -1 = k*2+b  ==>  -1= 2k+b   ==>b=-1-2k

                 

                                                                                 (k-b坐标系)

由上图可知。经过直线方程L:y=-2x+3的三个点A\B\C在转化为k-b坐标方程后,对应的点变成了一条直线。 A\B\C三条直线相交于点M(k=-2,b=3)则恰好是直线方程L的斜率和截距。同样,原直线方程L图像上的其他点比如D(3,-3)  E(-1,5)对应k-b坐标参数平面也会通过M(k=-2,b=3)(见下图D\E直线)[通俗的讲就是L方程上的点,在将斜率和截距变为参数,x-y变为斜率和参数后,其对应的图像也由x-y轴平面图像上的点变换为k-b平面的直线]

                      

                                                                               (k-b坐标系)

这样L方程的所有点,映射到k-b平面都会相交于点M(-2,3)形成一个峰值点。假如x-y轴坐标上存在两个直线方程(对应两条直线)。那么他们映射到k-b平面就会存在两个峰值点,以此类推。上述的这个性质就为我们解决问题提供了方法。

        简而言之。霍夫变换思想就是在原始图像坐标系下的一个点对应了参数坐标系中的一条直线,同样参数坐标系的一条直线对应了原始坐标系下的一个点,然后,原始坐标系下呈现直线的所有点,它们的斜率和截距是相同的,所以它们在参数坐标系下对应于同一个点。这样在将原始坐标系下的各个点投影到参数坐标系下之后,看参数坐标系下有没有聚集点,这样的聚集点就对应了原始坐标系下的直线。  在实际应用中,y=k*x+b形式的直线方程没有办法表示x=c形式的直线(使用直角坐标表示直线,当直线为一条垂直直线或者接近垂直直线时,该直线的斜率为无限大或者接近无限大,从而无法在k-b参数空间上表示出来。为了解决这个问题,可以采用极坐标)。所以实际应用中,是采用参数方程p=x*cos(θ)+y*sin(θ)。这样,图像平面上的一个点就对应到参数p---θ平面上的一条曲线上,其他还是一样。

极坐标参数空间:

对于霍夫变换,我们采用极坐标系来表示直线.

极坐标中用如下参数方程来表示一条直线.:

                                                        r=xcosθ+ysinθ

                              

  r代表直线到原点的垂直距离,θ代表x轴到直线垂线的角度,取值范围为±90° 如同笛卡尔坐标系一样,极坐标中的霍夫变换也将图像空间的点变换到参数空间。不同之处在于极坐标表示时,图像坐标空间的共线的两点(xi,yi)和(xj,yj)映射到参数空间是两条正弦曲线。(可参照顶部直线方程的思路 带入两点到极坐标直线方程。并转变参数。)一般来讲,一条直线能够通过在r-θ参数坐标寻找交于一点的曲线数量来检测,而越多的曲线交于共同的一点也就说明这个点表示的直线是由多个点组成的,我们可以通过设置直线上的阀值来定义多少条曲线交于了一点,才认定算是检测到了一条我们认定的直线。这就是霍夫变换要做的,她追踪图像中的每个点对应的曲线间的交点,如果交点的曲线数量超过了设定的阀值,则我们就认定这个点所代表的

…………然后,居然就没有然后了……没写了。有时间再补。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值