谈到基于边缘梯度的模板匹配,大多数文章都有提到这个算法,但是看到的文章几乎都是翻译和复制,没有对算法原理做详细的说明,所以在这里说说我的理解。
对分值计算的说明:
原文章的公式如下:
S u , v = 1 n ∑ i = 1 n ( G x i T ⋅ G x ( u + X i , v + Y i ) S ) + ( G y i T ⋅ G y ( u + X i , v + Y i ) S ) G x i T 2 + G y i T 2 ⋅ G x ( u + X i , v + Y i ) T + G y ( u + X i , v + Y i ) T S_{u,v}=\frac{1}{n} \sum_{i=1}^{n} \frac{\left(G x_{i}^{T} \cdot G x_{(u+X i, v+Y i)}^{S}\right)+\left(G y_{i}^{T} \cdot G y_{(u+X i, v+Y i)}^{S}\right)}{\sqrt{G x_{i}^{T^{2}}+G y_{i}^{T^{2}}} \cdot \sqrt{G x_{(u+X i, v+Y i)}^{T}+G y_{(u+X i, v+Y i)}^{T}}} Su,v=n1i=1∑nGxiT2+GyiT2⋅Gx(u+Xi,v+Yi)T+Gy(u+Xi,v+Yi)T(GxiT⋅Gx(u+Xi,v+Yi)S)+(GyiT⋅Gy(u+Xi,v+Yi)S)
首先我们需要知道计算两个向量的相似度的方法之一:余弦相似度
对于两个二维列向量
α
=
(
a
1
,
a
2
)
T
\pmb{\alpha}=(a_1,a_2)^\mathrm{T}
ααα=(a1,a2)T和
β
=
(
b
1
,
b
2
)
T
\pmb{\beta}=(b_1,b_2)^\mathrm{T}
βββ=(b1,b2)T,其余弦相似度为:
cos
θ
=
α
⋅
β
∥
α
∥
⋅
∥
β
∥
=
a
1
b
1
+
a
2
b
2
a
1
2
+
a
2
2
⋅
b
1
2
+
b
2
2
\cos \theta=\frac{\boldsymbol{\alpha} \cdot \boldsymbol{\beta}}{\|\boldsymbol{\alpha}\| \cdot\|\boldsymbol{\beta}\|}=\frac{a_{1} b_{1}+a_{2} b_{2}}{\sqrt{a_{1}^{2}+a_{2}^{2}} \cdot \sqrt{b_{1}^{2}+b_{2}^{2}}}
cosθ=∥α∥⋅∥β∥α⋅β=a12+a22⋅b12+b22a1b1+a2b2
也就是这两个向量夹角的余弦值,可以发现这个余弦值是在0和1之间的。
接着我们开始做模板匹配,其中模板图像为 A A A,匹配图像为 B B B。
根据Canny算子可以得到
A
A
A中
n
n
n个梯度不为0的点,坐标为
(
x
i
,
y
i
)
(
i
=
0
,
1
,
…
,
n
)
(x_i,y_i)(i=0,1,\dots,n)
(xi,yi)(i=0,1,…,n),这
n
n
n个点的水平梯度值和竖直梯度值可以组成
n
n
n个二维向量,对应待匹配区域中的
n
n
n个点,则上面的分值实际上就是这
n
n
n个二维向量的余弦相似度的均值。则分值可表示为:
S
(
u
,
v
)
=
1
n
∑
i
=
1
n
(
G
x
(
x
i
,
y
i
)
A
⋅
G
x
(
u
+
x
i
,
v
+
y
i
)
B
)
+
(
G
y
(
x
i
,
y
i
)
A
⋅
G
y
(
u
+
x
i
,
v
+
y
i
)
B
)
(
G
x
(
x
i
,
y
i
)
A
)
2
+
(
G
y
(
x
i
,
y
i
)
A
)
2
⋅
(
G
x
(
u
+
x
i
,
v
+
y
i
)
B
)
2
+
(
G
y
(
u
+
x
i
,
v
+
y
i
)
B
)
2
S_{(u, v)}=\frac{1}{n} \sum_{i=1}^{n} \frac{\left(G x_{\left(x_{i}, y_{i}\right)}^{A} \cdot G x_{\left(u+x_{i}, v+y_{i}\right)}^{B}\right)+\left(G y_{\left(x_{i}, y_{i}\right)}^{A} \cdot G y_{\left(u+x_{i}, v+y_{i}\right)}^{B}\right)}{\sqrt{\left(G x_{\left(x_{i}, y_{i}\right)}^{A}\right)^{2}+\left(G y_{\left(x_{i}, y_{i}\right)}^{A}\right)^{2}} \cdot \sqrt{\left(G x_{\left(u+x_{i}, v+y_{i}\right)}^{B}\right)^{2}+\left(G y_{\left(u+x_{i}, v+y_{i}\right)}^{B}\right)^{2}}}
S(u,v)=n1i=1∑n(Gx(xi,yi)A)2+(Gy(xi,yi)A)2⋅(Gx(u+xi,v+yi)B)2+(Gy(u+xi,v+yi)B)2(Gx(xi,yi)A⋅Gx(u+xi,v+yi)B)+(Gy(xi,yi)A⋅Gy(u+xi,v+yi)B)
其中
G
x
(
x
i
,
y
i
)
A
Gx^A_{(x_i,y_i)}
Gx(xi,yi)A和
G
y
(
x
i
,
y
i
)
A
Gy^A_{(x_i,y_i)}
Gy(xi,yi)A表示
A
A
A中这
n
n
n个点的水平梯度值和竖直梯度值;
(
u
,
v
)
(u,v)
(u,v)表示在
B
B
B中选择的区域的原点;
G
x
(
u
+
x
i
,
v
+
y
i
)
B
Gx^B_{(u+x_i,v+y_i)}
Gx(u+xi,v+yi)B和
G
y
(
u
+
x
i
,
v
+
y
i
)
B
Gy^B_{(u+x_i,v+y_i)}
Gy(u+xi,v+yi)B分别表示
B
B
B中坐标为
(
u
+
x
i
,
v
+
y
i
)
(u+x_i,v+y_i)
(u+xi,v+yi)的点的水平和竖直梯度值。
这个算法有以下几个特点:
- 分值大小天然就在0和1之间;
- 相对于梯度的幅值,这个算法更关注梯度的角度;
- 在实际的计算中,由于分母不能为0,所以目标区域中梯度向量为0向量的点实际上是不能参与运算的,这也是即使待匹配形状被部分遮挡也能利用这个算法计算出结果的原因。
对贪婪度的说明:
原文章的公式如下:
判据1:: S m > S m i n − 1 + m n 判据2: S m ≥ S m i n m n 停止计算判据: S m < m i n ( ( S m i n − 1 + 1 − g ⋅ S m i n 1 − g ⋅ m n ) , ( S m i n ⋅ m n ) ) \text{判据1::}S_m>S_{min}-1+\frac{m}{n}\\ \text{判据2:}S_m\ge S_{min}\frac{m}{n}\\ \text{停止计算判据:}S_m<\mathrm{min}((S_{min}-1+\frac{1-g\cdot S_{min}}{1-g}\cdot \frac{m}{n}),(S_{min}\cdot \frac{m}{n})) 判据1::Sm>Smin−1+nm判据2:Sm≥Sminnm停止计算判据:Sm<min((Smin−1+1−g1−g⋅Smin⋅nm),(Smin⋅nm))
在对待匹配图像进行遍历匹配找到大于分值阈值的区域时,大部分区域都是不满足的,所以可以利用区域中前 m m m个点的计算结果来决定我们是否要继续计算。
设置一个最小分数值
S
m
i
n
S_{min}
Smin。对于全部的
n
n
n个点,设其前
m
m
m个点的分值
S
m
S_m
Sm,后
n
−
m
n-m
n−m个点的分值为
S
n
−
m
S_{n-m}
Sn−m,若满足匹配,则有:
S
m
i
n
≤
S
n
=
S
m
⋅
m
+
S
n
−
m
⋅
(
n
−
m
)
n
≤
S
m
⋅
1
+
1
⋅
n
−
m
n
=
S
m
+
1
−
m
n
S_{min}\le S_n =\frac{S_m\cdot m+S_{n-m}\cdot (n-m)}{n}\le S_m\cdot 1+1\cdot \frac{n-m}{n}=S_m+1-\frac{m}{n}
Smin≤Sn=nSm⋅m+Sn−m⋅(n−m)≤Sm⋅1+1⋅nn−m=Sm+1−nm
因此有:
S
m
>
S
m
i
n
−
1
+
m
n
S_m>S_{min}-1+\frac{m}{n}
Sm>Smin−1+nm
事实上只要把
S
n
−
m
S_{n-m}
Sn−m缩放掉即可。这个判据是一个比较宽松的判据,是一个必要条件。
还有一个比较严苛的判据:
S
m
≥
S
m
i
n
m
n
S_m\ge S_{min}\frac{m}{n}
Sm≥Sminnm
可以设置一个贪婪度来综合这两个判据,故最终计算停止的判据为:
S
m
<
m
i
n
(
(
S
m
i
n
−
1
+
1
−
g
⋅
S
m
i
n
1
−
g
⋅
m
n
)
,
(
S
m
i
n
⋅
m
n
)
)
S_m<\mathrm{min}((S_{min}-1+\frac{1-g\cdot S_{min}}{1-g}\cdot \frac{m}{n}),(S_{min}\cdot \frac{m}{n}))
Sm<min((Smin−1+1−g1−g⋅Smin⋅nm),(Smin⋅nm))
-
当 g = 0 g=0 g=0时,判据为:
S m < m i n ( ( S m i n − 1 + m n ) , ( S m i n ⋅ m n ) ) S_m<\mathrm{min}((S_{min}-1+\frac{m}{n}),(S_{min}\cdot \frac{m}{n})) Sm<min((Smin−1+nm),(Smin⋅nm))
由于
S m i n ( 1 − m n ) < 1 − m n S_{min}(1-\frac{m}{n})<1-\frac{m}{n} Smin(1−nm)<1−nm
所以较小值为前者。 -
当 g = 1 g=1 g=1时,显然前者为无穷大,所以较小值为后者。
故可以通过贪婪度 g g g来控制判据的严苛程度,判据的严苛与否决定了匹配的速度和准确度,越严苛匹配速度更快但容错率下降。