链接:
link1
link2
link3
link4
link5
link6
In my opinion:
对于传统的识别算法:
特征提取包含在模板匹配内,即基于几何特征的模板匹配算法。
特征提取单独作为一类,可能可以理解为目前比较抽象的一些特征提取,如深度学习中利用某一层的输出作为新的特征。
%1,2绝对误差和算法(MAD、SAD)
clc;clear;close all;
%读取参考图
src=imread('reference.png');%导入参考图
[a,b,d]=size(src);%获取图像长宽以及通道数
if d==3
src=rgb2gray(src);%判断是否灰度图,若不是则转为灰度图
end
%读取模板图
mask=imread('template.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;
%MAD/SAD
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('搜索图');
%NCC
clc;clear;close all;
%%读取参考图
src=imread('reference.png');%导入参考图
[a b d]=size(src);%获取图像长宽以及通道数
if d==3
src=rgb2gray(src);%判断是否灰度图,若不是则转为灰度图
end
%读取模板图
mask=imread('template.png');
[m n d]=size(mask);
if d==3
mask=rgb2gray(mask);
end
mask=im2double(mask);
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);%当前子图
temp=im2double(temp); %注意要将int转为double型
%dst(i,j)=sum(sum((abs(temp-mask).^2)));%%此处除以S即为MAD,不除即为SAD
temp_m=mean(mean(temp));
mask_m=mean(mean(mask));
a=((sum(sum((temp-temp_m).*(mask-mask_m)))));
b=(sqrt(sum(sum(((temp-temp_m).^2))))* sqrt(sum(sum(((mask-mask_m).^2)))));
dst(i,j)=a/b;
end
end
abs_max=max(max(dst));%%寻找最小值
[x,y]=find(dst==abs_max);
figure;
imshow(mask);title('模板');
figure;
imshow(src);
hold on;
rectangle('position',[y,x,N-1,M-1],'edgecolor','r');%在参考图上框选匹配出的结果
hold off;title('搜索图');
%%SSDA
clc;clear;close all;
%读取参考图
src=imread('reference.png');%导入参考图
[a b d]=size(src);%获取图像长宽以及通道数
if d==3
src=rgb2gray(src);%判断是否灰度图,若不是则转为灰度图
end
%读取模板图,原理同读取参考图
mask=imread('template.png');
[m n d]=size(mask);
if d==3
mask=rgb2gray(mask);
end
mask=im2double(mask);
N=n;%模板尺寸,此处为矩形(高,宽)=(M,N)
M=m;
P=a;%代搜索图像尺寸,同上
Q=b;
%进行匹配
dst=zeros(P-M,Q-N);%创建矩阵,存放模板计算出的结果
for i=1:P-M %子图选取,每次滑动一个像素
for j=1:Q-N
temp=src(i:i+M-1,j:j+N-1);%当前子图
temp=im2double(temp); %注意要将int转为double型
sum_pipei=0;
for x=1:M
for y=1:N
sum_pipei=sum_pipei+abs(temp(x,y)-mask(x,y));
if sum_pipei>15
break;
end
dst(i,j)=dst(i,j)+1;
end
if sum_pipei>15
break;
end
end
end
end
abs_max=max(max(dst));%%寻找最小值
[x,y]=find(dst==abs_max);
figure;
imshow(mask);title('模板');
figure;
imshow(src);
hold on;
rectangle('position',[y,x,N-1,M-1],'edgecolor','r');%在参考图上框选匹配出的结果
hold off;title('搜索图');
没跑通、、、、、、、、、、
clc;clear;close all;
src=imread('reference.png');
mark=imread('template.png');
src_l=im2double(src);
src_l=rgb2gray(src_l);
mark_l=im2double(mark);
mark_l=rgb2gray(mark_l);
[a b d]=size(src_l);%获取图像长宽以及通道数
[m n d]=size(mark_l);
H1=hadamard(m);%产生512X512的Hadamard矩阵
H2=hadamard(n);
% mark_l=H1*mark_l*H2;
% mark_l=mark_l/a;
N=n;%模板尺寸,此处为矩形(高,宽)=(M,N)
M=m;
P=a;%代搜索图像尺寸,同上
Q=b;
dst=zeros(P-M,Q-N);%创建矩阵,存放模板计算出的结果
for i=1:P-M %子图选取,每次滑动一个像素
for j=1:Q-N
temp=src_l(i:i+M-1,j:j+N-1);%当前子图
pic=abs(temp-mark_l);
pic=H1*pic*H2/a;
dst(i,j)=sum(sum(abs(pic)));
end
end
abs_max=min(min(dst));%%寻找最小值
[x,y]=find(dst==abs_max);
figure;
imshow(mark);title('模板');
figure;
imshow(src);
hold on;
rectangle('position',[y,x,N-1,M-1],'edgecolor','r');%在参考图上框选匹配出的结果
hold off;title('搜索图');