【目标检测】目标检测原理与实现(二)--基于霍夫变换和广义霍夫变换的目标检测

时间:2022-01-03 12:51:43

转载:http://blog.csdn.net/marvin521/article/details/9071405

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


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

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

【目标检测】目标检测原理与实现(二)--基于霍夫变换和广义霍夫变换的目标检测

(图一)

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

直线的霍夫变换检测核心思想就是这些,但是考虑到斜率截距式直线表示法不能表示所有直线,比如直线X=CONSTANT时,斜率无线大,霍夫空间里无法表示此点,因此我们把直线方程转换成极坐标表示的形式:【目标检测】目标检测原理与实现(二)--基于霍夫变换和广义霍夫变换的目标检测,思想还是一样,区别就是把参数m,c转换成了theta和ρ),另外图像空间中的点对应的霍夫空间的几何形状不是直线,而是曲线,如(图二)所示:

【目标检测】目标检测原理与实现(二)--基于霍夫变换和广义霍夫变换的目标检测

(图二)

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

For each edge pixel (x,y)  in image

   For θ= -90 to 90

       ρ= 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