算法思想
基于模板与与图像中最原始的灰度值进行匹配,计算模板与与图像之间的相似度进行实现。可以想象沿图像中的所有点移动模板并在每个位置计算相似度量 S S S
定义
最简单的相似性度量方法是计算模板图像与图像之间的差值的绝对值总和(
S
A
D
SAD
SAD)或所有差值的平方和(
S
S
D
SSD
SSD)1
s
a
d
(
r
,
c
)
=
1
n
∑
(
u
,
v
)
∈
T
∣
t
(
u
,
v
)
−
f
(
r
+
u
,
c
+
v
)
∣
sad(r, c) = \dfrac{1}{n}\sum _{\left( u,v\right) \in T}\left| t\left( u,v\right) -f\left( r+u,c+v \right) \right|
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) = \dfrac{1}{n}\sum _{\left( u,v\right) \in T}\left[ t\left( u,v\right) -f\left( r+u,c+v \right) \right]{^2}
ssd(r,c)=n1(u,v)∈T∑[t(u,v)−f(r+u,c+v)]2
其中n是模板感兴趣区域中的点的数量,即
n
=
∣
T
∣
n=|T|
n=∣T∣
如果模板与图像相同,相似度为0。不同,相似值会大于0
查找过程
为了在图像中找到模板的实例,使用给定的上限对相似性图像 s a d ( r , c ) sad(r,c) sad(r,c)进行阈值分割,一般情况,得到的结果是包含一些邻接像素的区域。为了得到模板的位置,需要在给定的连通区域中选择相似性图像的最小值。
代码
// sad计算
for r in range(0, img_src_height - img_tp_gray_height):
for c in range(0, img_src_width - img_tp_gray_width):
# 每一点的相似性计算
sum_sad = 0.0
for u in range(0, img_tp_gray_height):
for v in range(0, img_tp_gray_width):
sum_sad += abs(img_tp_gray[u][v] - img_src_gray[r+u][c+v])
dst[r, c] = round(1.0/n*sum_sad)
优点
计算效率非常高,因为每个像素只需要2个操作。
缺点
光照变化或者图像中存在多个相同物体,会返回非常大的结果。
参考文献
[德]卡斯特恩·斯蒂格(CarstenSteger),机器视觉算法及应用; ↩︎