自适应模式识别:模板匹配、特征提取

自适应模式识别:模板匹配、特征提取

  • 了解
  • 实现
    • 绝对误差和算法(MAD、SAD)
    • 归一化积相关算法NCC
    • 序贯相似性检测算法SSDA
    • hadamard变换算法SATD

了解

链接:
link1
link2
link3
link4
link5
link6
自适应模式识别:模板匹配、特征提取_第1张图片
自适应模式识别:模板匹配、特征提取_第2张图片
自适应模式识别:模板匹配、特征提取_第3张图片
自适应模式识别:模板匹配、特征提取_第4张图片
自适应模式识别:模板匹配、特征提取_第5张图片
自适应模式识别:模板匹配、特征提取_第6张图片
自适应模式识别:模板匹配、特征提取_第7张图片
自适应模式识别:模板匹配、特征提取_第8张图片
自适应模式识别:模板匹配、特征提取_第9张图片
在这里插入图片描述
自适应模式识别:模板匹配、特征提取_第10张图片
自适应模式识别:模板匹配、特征提取_第11张图片
In my opinion:
对于传统的识别算法:
特征提取包含在模板匹配内,即基于几何特征的模板匹配算法。
特征提取单独作为一类,可能可以理解为目前比较抽象的一些特征提取,如深度学习中利用某一层的输出作为新的特征。

实现

绝对误差和算法(MAD、SAD)

%1,2绝对误差和算法(MADSAD)
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('搜索图');

自适应模式识别:模板匹配、特征提取_第12张图片

归一化积相关算法NCC

%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

%%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('搜索图');

hadamard变换算法SATD

没跑通、、、、、、、、、、
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('搜索图');

你可能感兴趣的:(算法,人工智能)