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

文章详细介绍了模板匹配中常用的灰度差值相似度计算方法SAD和SSD,以及更适应光照变化的归一化互相关系数NCC。NCC的计算公式包括原始版本和简化版ZNCC,后者在计算效率上有所优化。文章还讨论了ZNCC的简化过程,指出在大模板情况下,模板与匹配图像的互相关计算可能成为性能瓶颈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于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)Tt(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,yT(x,y)2x,yI(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)Tst2 t(u,v)mtsf2(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)Tt(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)Tf(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} XX, Y Y Y替换为 X − Y ‾ X-\overline{Y} XY,该公式被称为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)Tt(u,v)f(r+u,c+v)(u,v)Tt(u,v)mf(r,c)(u,v)Tmtf(r+u,c+v)+(u,v)Tmtmf(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)Tt(u,v)f(r+u,c+v)nmtmf(r,c)(u,v)Tmtf(r+u,c+v)+nmtmf(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)Tt(u,v)f(r+u,c+v)(u,v)Tmtf(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)Tt(u,v)f(r+u,c+v)mt(u,v)Tf(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)Tt(u,v)f(r+u,c+v)nmtmf(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[(XE[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)Tt(u,v)2nmt2
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)Tf(r+u,c+v)2mf(r,c)2 =(u,v)Tf(r+u,c+v)2nmf(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)Tt(u,v)2nmt2 (u,v)Tf(r+u,c+v)2nmf(r,c)2 (u,v)Tt(u,v)f(r+u,c+v)mtnmf(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)Tt(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) nmf(r,c)=(u,v)Tf(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)Tf(r+u,c+v)2,该步骤计算当模板较大时,为了防止溢出风险,需要一个大字节数值存储。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值