基于NCC的模板匹配算法的一些补充

基于灰度差值的相似度计算方法SAD和SSD

在模板匹配算法中,灰度值差值的相似度计算方法SAD和SSD是最基础的,相关公式如下,摘自《机器视觉算法与应用》:
S A D ( r , c ) = 1 n ∑ ( u , v ) ∈ T ∣ t ( u , v ) − f ( r + u , c + v ) ∣ SAD(r,c)=\frac{1}{n}\sum_{(u,v)\in T}|t(u,v)-f(r+u,c+v)| SAD(r,c)=n1​(u,v)∈T∑​∣t(u,v)−f(r+u,c+v)∣

S S D ( r , c ) = 1 n ∑ ( u , v ) ∈ T ( t ( u , v ) − f ( r + u , c + v ) ) 2 SSD(r,c)=\frac{1}{n}\sum_{(u,v)\in T}({t(u,v)-f(r+u,c+v)})^{2} SSD(r,c)=n1​(u,v)∈T∑​(t(u,v)−f(r+u,c+v))2

在上述公式中 f ( r , c ) f(r,c) f(r,c)表示匹配图像坐标为(r,c)的像素的灰度值, t ( u , v ) t(u,v) t(u,v)表示模板图像坐标为 ( u , v ) (u,v) (u,v)的像素的灰度值, T T T表示需要计算相似度的区域, n n n表示 T T T区域内像素的数量。

基于归一化互相关系数的相似度计算方法NCC

NCC(归一化互相关)是图像模板匹配中更为常用的一种匹配算法。SAD和SSD只有在光照条件不发生变换的情况下使用,NCC匹配计算获得的相似度不随光照线性变换而变化。

NCC与ZNCC

在OpenCV的模板匹配算法cv::matchTemplate,其中一种模板匹配方法就是NCC,其计算方法如下公式所示:
R ( x , y ) = ∑ x ′ , y ′ ( T ( x ′ , y ′ ) ⋅ I ( x + x ′ , y + y ′ ) ) ∑ x ′ , y ′ T ( x ′ , y ′ ) 2 ⋅ ∑ x ′ , y ′ I ( x + x ′ , y + y ′ ) 2 R(x,y)= \frac{\sum_{x',y'} (T(x',y') \cdot I(x+x',y+y'))}{\sqrt{\sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}} R(x,y)=∑x′,y′​T(x′,y′)2⋅∑x′,y′​I(x+x′,y+y′)2 ​∑x′,y′​(T(x′,y′)⋅I(x+x′,y+y′))​

在《机器视觉算法与应用》中同样提到的NCC公式如下所示:
N C C ( r , c ) = 1 n ∑ ( u , v ) ∈ T t ( u , v ) − m t s t 2 ⋅ f ( r + u , c + v ) − m f ( r , c ) s f 2 ( r , c ) NCC(r,c)=\frac{1}{n}\sum_{(u,v)\in T}\frac{t(u,v)-m_{t}}{\sqrt{s_{t}^{2}}} \cdot \frac{f(r+u,c+v)-m_{f}(r,c)}{\sqrt{s_{f}^{2}(r,c)}} NCC(r,c)=n1​(u,v)∈T∑​st2​ ​t(u,v)−mt​​⋅sf2​(r,c) ​f(r+u,c+v)−mf​(r,c)​
其中
m t = 1 n ∑ ( u , v ) ∈ T t ( u , v ) m_{t}=\frac{1}{n}\sum_{(u,v)\in T}t(u,v) mt​=n1​(u,v)∈T∑​t(u,v)
s t 2 = 1 n ∑ ( u , v ) ∈ T ( t ( u , v ) − m t ) 2 s_{t}^{2}=\frac{1}{n}\sum_{(u,v)\in T}(t(u,v)-m_{t})^{2} st2​=n1​(u,v)∈T∑​(t(u,v)−mt​)2
m f ( r , c ) = 1 n ∑ ( u , v ) ∈ T f ( r + u , c + u ) m_{f}(r,c)=\frac{1}{n}\sum_{(u,v)\in T}f(r+u,c+u) mf​(r,c)=n1​(u,v)∈T∑​f(r+u,c+u)
s f 2 ( r , c ) = 1 n ∑ ( u , v ) ∈ T ( f ( r + u , c + v ) − m f ( r , c ) ) 2 s_{f}^{2}(r,c)=\frac{1}{n}\sum_{(u,v)\in T}(f(r+u,c+v)-m_{f}(r,c))^{2} sf2​(r,c)=n1​(u,v)∈T∑​(f(r+u,c+v)−mf​(r,c))2

对比OpenCV和《机器视觉算法与应用》中的公式我看可以看到两种的不同。根据互相关最基本的数学计算公式 ρ ( X , Y ) = C O V ( X , Y ) D ( X ) D ( Y ) \rho(X,Y)=\frac{COV(X,Y)}{\sqrt{D(X)}\sqrt{D(Y)}} ρ(X,Y)=D(X) ​D(Y) ​COV(X,Y)​。我们可以看到两者公式的不同在于在《机器视觉算法与应用》书中将 X X X替换为 X − X ‾ X-\overline{X} X−X, Y Y Y替换为 X − Y ‾ X-\overline{Y} X−Y,该公式被称为ZNCC公式。ZNCC相比NCC,对光照变化的干扰更小。

ZNCC公式简化

如果直接使用ZNNC公式其计算量是相当大的,尤其是分子的计算量是比较大的。但该公式是可以简化的,我本人最初在ImageShop的blog中看到简化公式。在后续调研中,发现在该领域2001年的一篇经典相关论文《Template matching using fast normalized cross correlation》中就提出了对原始ZNCC公式的简化。以下对简化步骤进行介绍:

对于分子的简化如下所示,将公式展开
∑ ( u , v ) ∈ T ( t ( u , v ) − m t ) ⋅ ( f ( r + u , c + v ) − m f ( r , c ) ) \sum_{(u,v)\in T}(t(u,v)-m_{t})\cdot(f(r+u,c+v)-m_{f}(r,c)) (u,v)∈T∑​(t(u,v)−mt​)⋅(f(r+u,c+v)−mf​(r,c))
= ∑ ( u , v ) ∈ T t ( u , v ) ⋅ f ( r + u , c + v ) − ∑ ( u , v ) ∈ T t ( u , v ) ⋅ m f ( r , c ) − ∑ ( u , v ) ∈ T m t ⋅ f ( r + u , c + v ) + ∑ ( u , v ) ∈ T m t ⋅ m f ( r , c ) =\sum_{(u,v)\in T}t(u,v)\cdot f(r+u,c+v)-\sum_{(u,v)\in T}t(u,v)\cdot m_{f}(r,c)-\sum_{(u,v)\in T}m_{t}\cdot f(r+u,c+v)+\sum_{(u,v)\in T}m_{t}\cdot m_{f}(r,c) =(u,v)∈T∑​t(u,v)⋅f(r+u,c+v)−(u,v)∈T∑​t(u,v)⋅mf​(r,c)−(u,v)∈T∑​mt​⋅f(r+u,c+v)+(u,v)∈T∑​mt​⋅mf​(r,c)
= ∑ ( u , v ) ∈ T t ( u , v ) ⋅ f ( r + u , c + v ) − n ⋅ m t ⋅ m f ( r , c ) − ∑ ( u , v ) ∈ T m t ⋅ f ( r + u , c + v ) + n ⋅ m t ⋅ m f ( r , c ) =\sum_{(u,v)\in T}t(u,v)\cdot f(r+u,c+v)-n\cdot m_{t}\cdot m_{f}(r,c)-\sum_{(u,v)\in T}m_{t}\cdot f(r+u,c+v)+n\cdot m_{t}\cdot m_{f}(r,c) =(u,v)∈T∑​t(u,v)⋅f(r+u,c+v)−n⋅mt​⋅mf​(r,c)−(u,v)∈T∑​mt​⋅f(r+u,c+v)+n⋅mt​⋅mf​(r,c)
= ∑ ( u , v ) ∈ T t ( u , v ) ⋅ f ( r + u , c + v ) − ∑ ( u , v ) ∈ T m t ⋅ f ( r + u , c + v ) =\sum_{(u,v)\in T}t(u,v)\cdot f(r+u,c+v)-\sum_{(u,v)\in T}m_{t}\cdot f(r+u,c+v) =(u,v)∈T∑​t(u,v)⋅f(r+u,c+v)−(u,v)∈T∑​mt​⋅f(r+u,c+v)
= ∑ ( u , v ) ∈ T t ( u , v ) ⋅ f ( r + u , c + v ) − m t ∑ ( u , v ) ∈ T f ( r + u , c + v ) =\sum_{(u,v)\in T}t(u,v)\cdot f(r+u,c+v)-m_{t}\sum_{(u,v)\in T}f(r+u,c+v) =(u,v)∈T∑​t(u,v)⋅f(r+u,c+v)−mt​(u,v)∈T∑​f(r+u,c+v)
= ∑ ( u , v ) ∈ T t ( u , v ) ⋅ f ( r + u , c + v ) − n ⋅ m t ⋅ m f ( r , c ) =\sum_{(u,v)\in T}t(u,v)\cdot f(r+u,c+v)-n\cdot m_{t}\cdot m_{f}(r,c) =(u,v)∈T∑​t(u,v)⋅f(r+u,c+v)−n⋅mt​⋅mf​(r,c)

对于分母的简化如下所示,直接参考方差计算公式 V a r ( X ) = E [ ( X − E [ X ] ) 2 ] = E [ X 2 ] − E [ X ] 2 Var(X)=E[(X-E[X])^{2}]=E[X^{2}]-E[X]^{2} Var(X)=E[(X−E[X])2]=E[X2]−E[X]2。
将公式中的 1 n \frac{1}{n} n1​拆分为两个 1 n \frac{1}{\sqrt{n}} n ​1​,分别带入 s t 2 \sqrt{s_{t}^{2}} st2​ ​和 s f 2 ( r , c ) \sqrt{s_{f}^{2}(r,c)} sf2​(r,c) ​。则:
n ⋅ s t 2 = n ⋅ ( 1 n ∑ ( u , v ) ∈ T ( t ( u , v ) − m t ) 2 ) = n 1 n ∑ ( u , v ) ∈ T ( t ( u , v ) 2 ) − m t 2 = ∑ ( u , v ) ∈ T t ( u , v ) 2 − n ⋅ m t 2 \sqrt{n}\cdot \sqrt{s_{t}^{2}} = \sqrt{n}\cdot (\frac{1}{n}\sum_{(u,v)\in T}(t(u,v)-m_{t})^{2})=\sqrt{n}\sqrt{\frac{1}{n}\sum_{(u,v)\in T}(t(u,v)^{2})-m_{t}^{2}}=\sqrt{\sum_{(u,v)\in T}t(u,v)^{2}-n\cdot m_{t}^{2}} n ​⋅st2​ ​=n ​⋅(n1​(u,v)∈T∑​(t(u,v)−mt​)2)=n ​n1​(u,v)∈T∑​(t(u,v)2)−mt2​ ​=(u,v)∈T∑​t(u,v)2−n⋅mt2​ ​
n ⋅ s f 2 ( r , c ) = n ⋅ ( 1 n ∑ ( u , v ) ∈ T ( f ( r + u , c + v ) − m f ( r , c ) ) 2 ) = n 1 n ∑ ( u , v ) ∈ T f ( r + u , c + v ) 2 − m f ( r , c ) 2 = ∑ ( u , v ) ∈ T f ( r + u , c + v ) 2 − n ⋅ m f ( r , c ) 2 \sqrt{n}\cdot \sqrt{s_{f}^{2}(r,c)} = \sqrt{n}\cdot (\frac{1}{n}\sum_{(u,v)\in T}(f(r+u,c+v)-m_{f}(r,c))^{2})=\sqrt{n}\sqrt{\frac{1}{n}\sum_{(u,v)\in T}f(r+u,c+v)^{2}-m_{f}(r,c)^{2}}=\sqrt{\sum_{(u,v)\in T}f(r+u,c+v)^{2}-n\cdot m_{f}(r,c)^{2}} n ​⋅sf2​(r,c) ​=n ​⋅(n1​(u,v)∈T∑​(f(r+u,c+v)−mf​(r,c))2)=n ​n1​(u,v)∈T∑​f(r+u,c+v)2−mf​(r,c)2 ​=(u,v)∈T∑​f(r+u,c+v)2−n⋅mf​(r,c)2 ​

最后ZNCC的计算公式可化简为
N C C ( r , c ) = ∑ ( u , v ) ∈ T t ( u , v ) ⋅ f ( r + u , c + v ) − m t ⋅ n ⋅ m f ( r , c ) ∑ ( u , v ) ∈ T t ( u , v ) 2 − n ⋅ m t 2 ⋅ ∑ ( u , v ) ∈ T f ( r + u , c + v ) 2 − n ⋅ m f ( r , c ) 2 NCC(r,c)=\frac{\sum_{(u,v)\in T}t(u,v)\cdot f(r+u,c+v)-m_{t}\cdot n\cdot m_{f}(r,c)}{\sqrt{\sum_{(u,v)\in T}t(u,v)^{2}-n\cdot m_{t}^{2}}\cdot \sqrt{\sum_{(u,v)\in T}f(r+u,c+v)^{2}-n\cdot m_{f}(r,c)^{2}}} NCC(r,c)=∑(u,v)∈T​t(u,v)2−n⋅mt2​ ​⋅∑(u,v)∈T​f(r+u,c+v)2−n⋅mf​(r,c)2 ​∑(u,v)∈T​t(u,v)⋅f(r+u,c+v)−mt​⋅n⋅mf​(r,c)​
经过化简后的公式,其中与模板相关的计算可以提前计算获得。在匹配过程中需要计算的内容包括:

  • ∑ ( u , v ) ∈ T t ( u , v ) ⋅ f ( r + u , c + v ) \sum_{(u,v)\in T}t(u,v)\cdot f(r+u,c+v) ∑(u,v)∈T​t(u,v)⋅f(r+u,c+v),即模板与匹配图像的互相关(卷积),当模板较大时可想而知,由于无法使用可分离卷积或递归卷积,其计算耗时是很严重的。
  • n ⋅ m f ( r , c ) = ∑ ( u , v ) ∈ T f ( r + u , c + u ) n\cdot m_{f}(r,c) = \sum_{(u,v)\in T}f(r+u,c+u) n⋅mf​(r,c)=∑(u,v)∈T​f(r+u,c+u) ,即匹配图像的局部求和。由于可以使用递归卷积,其计算耗时较小。
  • ∑ ( u , v ) ∈ T f ( r + u , c + v ) 2 \sum_{(u,v)\in T}f(r+u,c+v)^{2} ∑(u,v)∈T​f(r+u,c+v)2,该步骤计算当模板较大时,为了防止溢出风险,需要一个大字节数值存储。

基于NCC的模板匹配算法的一些补充相关推荐

  1. 基于灰度的模板匹配算法(一):MAD、SAD、SSD、MSD、NCC、SSDA算法

    简介: 本文主要介绍几种基于灰度的图像匹配算法:平均绝对差算法(MAD).绝对误差和算法(SAD).误差平方和算法(SSD).平均误差平方和算法(MSD).归一化积相关算法(NCC).序贯相似性算法( ...

  2. 【图像配准】基于灰度的模板匹配算法(一):MAD、SAD、SSD、MSD、NCC、SSDA、SATD算法

    简介: 本文主要介绍几种基于灰度的图像匹配算法:平均绝对差算法(MAD).绝对误差和算法(SAD).误差平方和算法(SSD).平均误差平方和算法(MSD).归一化积相关算法(NCC).序贯相似性检测算 ...

  3. 基于灰度的模板匹配算法:MAD、SAD、SSD、MSD、NCC、SSDA算法

    简介: 本文主要介绍几种基于灰度的图像匹配算法:平均绝对差算法(MAD).绝对误差和算法(SAD).误差平方和算法(SSD).平均误差平方和算法(MSD).归一化积相关算法(NCC).序贯相似性算法( ...

  4. 【图像配准】基于灰度的模板匹配算法(三):划分强度一致法(PIU)

    简介: 前面几篇文章介绍了一些比较基本的基于灰度的图像配准算法: 基于灰度的模板匹配算法(一):MAD.SAD.SSD.MSD.NCC.SSDA.SATD算法  基于灰度的模板匹配算法(二):局部灰度 ...

  5. 基于金字塔的模板匹配算法(python)

    今天完成了机器视觉的课程作业-基于金字塔的模板匹配算法,就顺便记录一下.本次作业我是通过python+opencv来完成的.这个作业就是一个模板匹配算法的基础上加一个金字塔的模型来减少计算量,所谓金字 ...

  6. 基于金字塔的模板匹配算法matlab

    先上代码 function [r,c,nccImg] = pyramidMatch(img, template, nLevels) % -------------------------------- ...

  7. 【语音识别】基于mfcc特征模板匹配算法实现声纹识别matlab源码含GUI

    在任意一个Automatic speech recognition 系统中,第一步就是提取特征.换句话说,我们需要把音频信号中具有辨识性的成分提取出来,然后把其他的乱七八糟的信息扔掉,例如背景噪声啊, ...

  8. 【工程应用七】接着折腾模板匹配算法 (Optimization选项 + no_pregeneration模拟 + 3D亚像素插值)...

    在折腾中成长,在折腾中永生. 接着玩模板匹配,最近主要研究了3个课题. 1.创建模型的Optimization选项模拟(2022.5.16日) 这两天又遇到一个做模板匹配隐藏的高手,切磋起来后面就还是 ...

  9. 图像处理之积分图应用三(基于NCC快速相似度匹配算法)

    from:https://blog.csdn.net/jia20003/article/details/53021614 图像处理之积分图应用三(基于NCC快速相似度匹配算法) 基于Normalize ...

最新文章

  1. Python中输出字体的颜色设置
  2. 浅入浅出TensorFlow 8 - 行人分割
  3. LAPJV算法学习笔记
  4. airpods pro连接安卓声音小_安卓(一加5)用airpods音量偏低怎么解决?
  5. 给大家推荐个学英语的网站
  6. Java设计模式-外观模式(Facade)
  7. Tensorflow Estimator之DNNClassifier
  8. 守护进程: supervisor使用
  9. 分治法解决组合问题(递归)
  10. JScript.NET(JScript 8.0)编程简介
  11. shell中数组的使用
  12. 动态规划 分享巧克力 4794_包装|颇具艺术欣赏性的巧克力创意包装设计
  13. 土地利用现状图例颜色标准_土地利用现状分类图例
  14. 看看别人家的待遇,字节跳动薪酬体系我真的酸了
  15. 简图记录-曾国藩家训 观后感
  16. python编程火车票_100行Python代码自动抢火车票!
  17. 全国软件2. 三人年龄
  18. echarts中国地图线性流动动画js特效
  19. Exception in Thread: ValueError: signal number 32 out of range
  20. i7z命令工具 – 用来查看CPU状况

热门文章

  1. 双网卡绑定之mode=6
  2. ProEssentials实时绘制三维地质建模、科学领域三维建模仅需毫秒
  3. CORS和VRS的区别
  4. 遭遇Viking/威金新变种、Trojan-PSW.Win32.WOW.do等(一)
  5. 加拿大太阳能飞艇将在非洲升天
  6. Linux如何管理并挂载硬盘设备
  7. 地级市各类交通工具的客货运量和拥有量指标
  8. referer java_Java中伪造referer来获取数据
  9. SQL SERVER:查询显示结果中带有行号
  10. matlab pca coeff,matlab_PCA,训练集与测试集分开,原理和用法