很久没有出去溜达了,今天天气好,就放松放松去,晚上在办公室没啥事,把以前写的一个基于标准的欧式距离的模板匹配代码共享吧。

     opencv有模板匹配的代码,我没看他是如何优化的,所以不管他吧,我只描述我自己实现。

     基于欧式距离的模板匹配就是遍历被匹配图的每一个像素,然后计算以该像素为中心,和模板图重叠部分的像素的欧式距离,当模板图越大时,计算就急剧增加,因此做优化才能有真正的实用价值。

     两个标量的欧式距离表达式为 (a - b) * (a - b),展开后为 a^2 + b^ 2 - 2ab,我们每一个像素点的计算就是WM * HM个像素色阶值的距离的累加和(WM和HM分别为模板图的宽度和高度),模板匹配中,模板图所有像素的平方和是固定的,可以提前计算,而被匹配图中每个像素点周边WM * HM的像素的平方和可以使用类似BoxBlur中懒惰算法快速的得到,而只有两者的成绩项是必须每个点重新计算,这也是整个计算过程中最为耗时的部分,如果直接用C的代码写出来,恐怕等到花儿都谢了。

     我在图像处理中任意核卷积(matlab中conv2函数)的快速实现一文中曾经给出过一种基于SSE的的快速卷积的算法,他可以一次性计算出16个字节的乘法,速度因此也得到了大的提升,因此,完全可以用在上述的计算a * b的过程中,这样我们的模板匹配速度就能有质的提高。

    计算模板图的像素自乘平方和代码非常简单,也没啥耗时,简单代码如下:

网友评论