标准的基于欧式距离的模板匹配算法优源码化和实现
来源:互联网 发布:电气画图软件 编辑:程序博客网 时间:2024/05/07 05:06
一下文章转载自:http://www.cnblogs.com/Imageshop/p/6108764.html,正文如下:
代码下载:http://files.cnblogs.com/files/Imageshop/MatchTemplate.rar(解压密码: Buy me a beer)
很久没有出去溜达了,今天天气好,就放松放松去,晚上在办公室没啥事,把以前写的一个基于标准的欧式距离的模板匹配代码共享吧。
opencv有模板匹配的代码,我没看他是如何优化的,所以不管他吧,我只描述我自己实现。
基于欧式距离的模板匹配就是遍历被匹配图的每一个像素,然后计算以该像素为中心,和模板图重叠部分的像素的欧式距离,当模板图越大时,计算就急剧增加,因此做优化才能有真正的实用价值。
两个标量的欧式距离表达式为 (a - b) * (a - b),展开后为 a^2 + b^ 2 - 2ab,我们每一个像素点的计算就是WM * HM个像素色阶值的距离的累加和(WM和HM分别为模板图的宽度和高度),模板匹配中,模板图所有像素的平方和是固定的,可以提前计算,而被匹配图中每个像素点周边WM * HM的像素的平方和可以使用类似BoxBlur中懒惰算法快速的得到,而只有两者的成绩项是必须每个点重新计算,这也是整个计算过程中最为耗时的部分,如果直接用C的代码写出来,恐怕等到花儿都谢了。
我在图像处理中任意核卷积(matlab中conv2函数)的快速实现一文中曾经给出过一种基于SSE的的快速卷积的算法,他可以一次性计算出16个字节的乘法,速度因此也得到了大的提升,因此,完全可以用在上述的计算a * b的过程中,这样我们的模板匹配速度就能有质的提高。
计算模板图的像素自乘平方和代码非常简单,也没啥耗时,简单代码如下:
而计算被匹配图中每个像素为中心,WH*WM范围内像素的自乘平方和的O(1)算法也比较简单:
上述代码思路类似于BoxBlur的实现方式,如果还想更快点,可以参考解析opencv中Box Filter的实现并提出进一步加速的方案(源码共享)一文的基于SSE的处理方式,有兴趣的朋友可以自研。
其实速度也不快,但是有些应用场合模板图很小(比如16*16的),被匹配图也不大,比如640 * 480的,这个时候大概也就30ms左右吧,如果是灰度的匹配那就能更快了。
其实代码如果想优化,还是可以用线程并行的。
- 标准的基于欧式距离的模板匹配算法优源码化和实现
- 标准的基于欧式距离的模板匹配算法优源码化和实现(附源代码)。
- 基于欧式距离定义相似度推荐算法的评估
- [opencv]模板匹配算法(单图像模板匹配和基于模板匹配的目标跟踪)
- [opencv]模板匹配算法(单图像模板匹配和基于模板匹配的目标跟踪)
- 欧式距离和马氏距离的区别
- 基于边界的模板匹配的原理及算法实现
- 基于边界的模板匹配的原理及算法实现
- 基于边界的模板匹配的原理及算法实现
- 基于模板匹配和遗传算法的人眼定位
- OpenCV矩阵的归一化和欧式距离详解
- 基于Halcon的多目标模板匹配算法
- 基于灰度的模板匹配算法
- 图像匹配(欧式距离)
- 图像处理常用算法GPU实现三:基于模板匹配的边缘检测
- 图像处理常用算法GPU实现三:基于模板匹配的边缘检测
- 【Tensorflow 实战】实现欧式距离
- 求矩阵各个元素两两之间的欧式距离(python实现)
- sql之left join、right join、inner join的区别
- 1026. 程序运行时间(15)
- spring-data-jpa原理探秘(1)-运行环境创建及加载Repository接口
- 二叉树递归
- Chapter 3: Getting Started With Devops
- 标准的基于欧式距离的模板匹配算法优源码化和实现
- [USACO Mar08] 游荡的奶牛
- HDU 5934 Bomb 强连通缩点
- 如何使用root用户运行J版Ceph
- Android动画----Alpha
- 野指针的一些认识
- 计算机图形学——直线的三种扫描转换算法
- 异步串行接口
- Chapter 4: The First Way - Accelerate Flow