多目标多角度的快速模板匹配算法(基于边缘梯度)

本文探讨了一种基于边缘梯度的多目标多角度快速模板匹配算法,指出了使用Canny检测边缘的局限性,并提出了改进方法。通过将模板图整体幅值信息纳入计算公式,减少无效计算并提高匹配准确性。实际编码中面临角度检测和边缘处理的挑战,文中提出两种解决方案,包括忽略最外圈梯度值和直接旋转梯度值。

【工程应用二】 多目标多角度的快速模板匹配算法(基于边缘梯度) - Imageshop - 博客园

 

 基于边缘梯度方面的匹配,最为出名的莫过于CodeProject上一篇多年前的印度小哥的文章,链接为:Edge Based Template Matching

这个核心计算式和基于NCC的看上去相似又有着很多不同。注意式子中的大写字母G表示图像的梯度信息,这个是可正亦可负的。即计算式已经脱离原有的像素信息,而使用了梯度相关信息,常用的获取X和Y方向梯度的方式有:

 即Sobel边缘检测算子。

 在印度小哥的文章里,采用了Canny检测来检测出边缘,然后只对模板图和搜索图中对应的边缘位置计算上述得分公式(以模板图中的边缘处为依据), 这样起到减少取样点,提高速度的作用。

问题:

         1、虽然Canny的使用减少了很多计算量,但是他完全剔除了其他弱边缘处的信息,就好像把考试中那些不及格的学生都定型为差生一样,是不科学的。这些弱边缘在一定程度上也有着相当的信息量。

         2、Canny本身是有着很多参数来控制最终的效果的,不是一个固定的参数对每一副图像都能获取稳定的效果,因此,这就很难成为一个稳定的算法了。

         3、如果采用了金字塔等技术,在金字塔层数增加时,Canny所对应的边缘会越来越不稳定,这会影响最终的精度。

 

 对全图实现上述公式的计算,问题:

         1、计算量飙升,这个可以通过金字塔的技术来解决。

         2、我们仔细的观察公式(1),如果做一个全局的匹配计算,在计算过程中,必然会遇到不少地方的X和Y方向的梯度都为0或者很小,而且这种像素占的比例还相当高,毕竟图像中真正属于边缘的地方很少。那么这样的一个事实就回到导致很多累加项的值为0或很小(X和Y梯度都为0时,式子的分母为0,程序需要做判断,但输出的结果必然也会是0),这样整体累加后再求平均数我们将获得一个很小的得分(哪怕和模板图一模一样的地方)

改进的方法:

        把模板图的整体的幅值信息作为一个因子放入到上述计算公式的分母中,这样,模板图中梯度较小的位置,对整体的幅值贡献就小,从而不会对最后的得分造成影响。

实际编码中的困难:

         1、对于角度的检测,类似的,我们也创建多个离散的模板,我们需要旋转模板,然后计算模板的边缘梯度,但是,旋转本身产生了新的边缘,而且是强边缘。

         如果把这边缘带入式中计算,非常明显不会得到可靠的结果,我们需要把这个边缘剔除。

         2、无论采用何种边缘梯度检测算子,最小的都会涉及到3*3的局部范围,那么对于未旋转或者旋转后的模板图,都存在一个明显问题,最外一圈像素的梯度如何处理,如果使用重复边缘像素的方式,那么就会获得一个较小的梯度,但是实际在在搜索图中是不存在这个问题的,只要模板不在搜索图的边缘处。因此,如果这样处理,哪怕模板就是从搜索图中直接扣取出来的,依据(1)式计算出的结果也不会等于1,而是小于1。

        解决:

        方法一:忽略最外圈的梯度值,即他们不参与相似性计算。这样就要求在做模板图时,需要可以在实际需要的模板的基础上,中心对称的长和宽每边各增加一个像素。但是,这样实际上还是没有完美解决问题,因为当有金字塔存在时,这可以增加的1个像素经过下采样后已经没有一个像素了。

IM_Rotate(Template, Rotate, RTI.Mask, Angle, 1, Amount);            //    旋转图像,获取Mask值
IM_Edge_Erode_3X3(RTI.Mask, RTI.Mask);  

        方法二:旋转时不是旋转图像然后再计算梯度,而是直接旋转X和Y方向的梯度,但是新的难处是梯度值是有正有负的,这种数据的旋转在使用双线性插值时,由于四个取样点的极性不同,是否能直接处理呢,我感觉好像有问题,比如四个数,2正2负,有可能插值后结果就为0了。 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值