目标检测(Object Detection)原理与实现(二)

基于霍夫变换和广义霍夫变换的目标检测算法


        上节讨论了基于阈值处理的目标检测,今天就来讨论下基于霍夫投票的目标检测,霍夫投票打算分红两个小节,第一个小节简单的说下霍夫变换和广义霍夫变换(generalized hough transform),他们投票的权重都是相等的,下一节讨论几率空间中的霍夫投票,顾名思义他们的投票权重是不肯定的。函数

      先来看下霍夫变换(hough transform),霍夫变换通常适用于有解析表达式的几何形状目标检测,例如直线、圆、椭圆等。用个统一的解析表达式来表达他们:f(x,alpha)=0,其中x 是图形上点,alpha则是解析表达式参数,好比欧式坐标系中直线的参数就是斜率m和截距c(或者极坐标系中的theta和ρ),圆的参数则是原点和半径。霍夫变换的核心就是把图像空间的直线变换到参数空间(也叫霍夫空间),好比一个直线y=mx+c,给定一个点(x’,y’),把它代入直线方程,获得y’=mx’+c,其实此时仍然是一条直线(在参数空间的直线,斜率是-x’,截距是y’),图像空间和霍夫空间的对应关系如(图一)所示:spa

(图一).net

     (图一)中左图是图像空间,右图是霍夫空间(参数空间),对于图像空间中线段pq上任意一点带入直线方程后,均可以在霍夫空间中获得另一条直线,两者是对偶的,好比如(图一)所示,把两个端点带入后,在右图中获得的两个对偶直线,并且斜率是负的。如今问题来了,机器是怎么知道pq是一条直线(假设还有其余噪声点存在的话)?咱们不知道斜率也不知道截距,咱们要作的就先假设图像中有一条直线,其方程为y=mx+c,咱们要求他的参数,而后把图像空间中的每一个点都代入直线方程,而后在霍夫空间里都产生了一条对偶直线,由于图像空间中的那条直线上的点共用一个斜率m和截距c,所以他们的对偶直线必然相交于一点,也就是说m,c的值是惟一的,在右图中也能体现出来。3d

直线的霍夫变换检测核心思想就是这些,可是考虑到斜率截距式直线表示法不能表示全部直线,好比直线X=CONSTANT时,斜率无线大,霍夫空间里没法表示此点,所以咱们把直线方程转换成极坐标表示的形式:,思想仍是同样,区别就是把参数m,c转换成了theta和ρ),另外图像空间中的点对应的霍夫空间的几何形状不是直线,而是曲线,如(图二)所示:orm


(图二)blog

     (图二)中右图的亮点就是咱们要求的参数,可是怎么求的,求交点?那也太麻烦了,霍夫投票方法此时就要登场了,你霍夫空间中的曲线也是个图像嘛,我有的是内存,对于个曲线上的每一个点我都用一个字典来表示大家,字典索引就用霍夫空间的坐标(theta和ρ)来检索,字典的值表示该坐标上有多少个曲线点(字典的学名叫累加器:accumulator)。对于(图二)中的那个亮点对应的字典值确定很大,其实咱们就是找大的最大值,峰值表示图像空间中的不少点共用一个参数。该算法的实现步骤以下伪代码所示:索引

For each edge pixel (x,y)  in image内存

   For θ= -90 to 90get

       ρ= x cosθ+ y sin θ

       ++ H(iθ, jρ);

    end

end

直观来讲就是你给我一个图像空间中的点,我就在霍夫空间中计算不少字典,而后相同位置上加1,简单的说就是把霍夫空间分割了,分割的越精细越好,可是分的越细计算量也越大,毕竟图像点不少,这个平衡读者根据状况本身把握吧。累加器的示意图如(图三)所示:

(图三)

圆和椭圆也都是相似步骤,只不过圆有三个参数,而椭圆有5个参数,计算量更大。此算法实如今opencv里也有,直接调用一个函数便可,在此很少说,直接给一个OpenCV自带的图像进行检测直线的结果和他的霍夫空间示意图,如(图四)和(图五)所示:

(图四)


(图五)

     (图五)霍夫空间中的峰值点可能不严格的在同一个坐标上,也就说图像空间中直线上的点并不严格的在同一直线上,咱们要允许一部分偏差的存在,判断峰值点是个技巧活。

下面进入广义霍夫变换(Generalized Hough Transform)。

       前面也说了,霍夫变换只适用于具备解析表达式的形状,对于通常形状则无能为力,通常形状没有解析表达式,没有解析表达式,那咱们怎么进入霍夫空间里呢?没有霍夫空间,那咱们怎么投票?不投票怎么来检测物体?有条件就上,没条件创造条件也要上大笑。通常物体虽然没有解析表达式,可是他们有边缘,说的多一些,MARR教授一开始就说边缘是人眼检测判断物体的重要条件之一,因此计算机视觉早期出现了不少边缘检测算法。有了边缘就能够创造出切向量,切向量能够作参数吗?仔细考虑一下,信息太少,ballard在1980年提出了广义霍夫变换(generalized hough transform),它利用了如(图六)所示的参数:

(图六)

      (图六)中的alpha表示参数,能够看出参数不少,参数空间确定是高维的,不过无论他多少维,方法和上面相似,参数空间中投票嘛,考虑到这个方法选择了一个参考点,把图像中的点到参考点的距离和相对方位信息做为参数来检测物体,细心的同窗可能感受出来了,他和Hu moment(Hu矩)有些类似的地方,他们都须要一些模版来提取形状参数,可是它比Hu moment用到的信息多,并且是在霍夫空间中投票,能够抵抗一些噪声、遮挡因素的影响,所以他的鲁棒性更好。投票流程如(图七)所示,其中A[a]为投票字典(累加器):

(图七)

它的检测效果如(图八)所示:


(图八)

     这节算是作个铺垫吧,为下节的霍夫投票在计算机视觉中的应用打下基础,由于今天的投票是“公平”的,每票的权重都同样,当遇到复杂问题时,好比部件的参数去投票时,权重须要区分对待,这些放在下个小节来讲。广义霍夫变换的代码网上也有,如搜不到的同窗想要的话,能够留言索取。


参考文献:

GENERALIZING THE HOUGH TRANSFORM TO DETECTARBITRARY SHAPES


转载请注明来源:http://blog.csdn.net/cuoqu/article/details/9071405