基于灰度的匹配算法又称为基于模板的匹配算法,子图与模板图对应位置上灰度值计算得出一个值,这个值可以是对应像素相减绝对值的加和(即SAD算法),也可以将计算出的和除以模板像素个数,即(MAD算法),其它基于灰度的图像匹配算法均基于此思想,只不过所计算的值不同。以下将逐个进行介绍。
SAD算法


SAD算法即模板与参考图对应像素相减的绝对值求和,然后在依次滑动模板遍历每个位置,得到(P-M)行,(Q-N)列的矩阵,其中值最小的位置即说明模板与参考图相似度最高。SAD相似性公式如下,(由于算法中直接用矩阵计算,与公式表达方式上不同,但实质相同)
可根据下图结合代码进行实现
SAD/MAD算法
%%
%绝对误差和算法(SAD)
%%
clear all;
close all;
%%读取参考图
src=imread('Lanny.png');%导入参考图
[a b d]=size(src);%获取图像长宽以及通道数
if d==3
src=rgb2gray(src);%判断是否灰度图,若不是则转为灰度图
end
%%读取模板图,原理同读取参考图
mask=imread('mark.png');
[m n d]=size(mask);
if d==3
mask=rgb2gray(mask);
end
%%
N=n;%模板尺寸,此处为矩形(高,宽)=(M,N)
M=m;
P=a;%代搜索图像尺寸,同上
Q=b;
%%进行匹配
dst=zeros(P-M,Q-N);%创建矩阵,存放模板计算出的结果
S=M*N;
for i=1:P-M %子图选取,每次滑动一个像素
for j=1:Q-N
temp=src(i:i+M-1,j:j+N-1);%当前子图
dst(i,j)=sum(sum(abs(temp-mask)))/S;%%此处除以S即为MAD,不除即为SAD
end
end
abs_min=min(min(dst));%%寻找最小值
[x,y]=find(dst==abs_min);
figure;
imshow(mask);title('模板');
figure;
imshow(src);
hold on;
rectangle('position',[y,x,N-1,M-1],'edgecolor','r');%在参考图上框选匹配出的结果
hold off;title('搜索图');