基于欧式距离的模板匹配就是遍历被匹配图的每一个像素,然后计算以该像素为中心,和模板图重叠部分的像素的欧式距离,当模板图越大时,计算就急剧增加,因此做优化才能有真正的实用价值。

     两个标量的欧式距离表达式为 (a - b) * (a - b),展开后为 a^2 + b^ 2 - 2ab,我们每一个像素点的计算就是WM * HM个像素色阶值的距离的累加和(WM和HM分别为模板图的宽度和高度),模板匹配中,模板图所有像素的平方和是固定的,可以提前计算,而被匹配图中每个像素点周边WM * HM的像素的平方和可以使用类似BoxBlur中懒惰算法快速的得到,而只有两者的成绩项是必须每个点重新计算,这也是整个计算过程中最为耗时的部分,如果直接用C的代码写出来,恐怕等到花儿都谢了。

%图一:利用直方图进行图像的匹配
%图二:利用形状进行图像的匹配
%交给你们啦~~~~
%-要求mo<=num
clear;
mo = 1;%-选取第?幅图像
num=5;%图片总数量
distance_const=0.8;%设定直方图距离
similar_const=0.5;%设定形状匹配相似度
close all;
%获取第一幅图像
sname='';%统一修改存储位置,修改路径时只需在此步修改
ss=[sname,num2str(mo),'.jpg'] ; %打开待匹配图像
f1=open_img(ss);                %求待匹配图像的累计直方图
%选择其它待匹配图像
distance=zeros(1,num);
for j=1:num
    sl=[sname,num2str(j),'.jpg']
    f2=open_img(sl);
    %进行直方图的匹配
    d=zeros(1,256);
    for ii=1:256
        d(ii)=(sqrt((f1(ii)-f2(ii)).^2));
    end
    distance(j)=sum(d);
end

distance_num=mo;
for j=1:num
    if distance(j)>0
        if distance(j)<=distance_const
            distance_num=[distance_num,j];
        end
    end
end
%**************************************************************************
%****
disp('采用直方图匹配,在给定的距离值以内的图片名称数为:');
distance_num
disp('采用直方图匹配,在给定的距离值以内的图片数目为:');
length(distance_num)
%**************************************************************************
figure(1)
num = length(distance_num);                              %查找到的累积直方图匹配的图像个数
ref =[sname,num2str(mo),'.jpg'];                         %待检索的图像
ref_img = imread(ref);                                   %打开图像
subplot(num+1,2,1);
imshow(ref_img);
title('待匹配图像')
h1=IMHISTS(ref_img);                                     %对原图像求取直方图
subplot(num+1,2,2);
bar(h1,0.075,'b');
axis([0 255 0 4000]);
title('待匹配图像的直方图');
for i = 1:num
    match = [sname,num2str(distance_num(i)),'.jpg'];     %数据库图像
    match_img = imread(match);                           %打开图像
    subplot(num+1,2,2*i+1);
    imshow(match_img);
    ttxt=sprintf('第%d匹配图像',i);title(ttxt);
    h2=IMHISTS(match_img);                               %对匹配图像求取直方图
    subplot(num+1,2,2*i+2);
    bar(h2,0.075,'b');
    axis([0 255 0 4000]);
    ttxt=sprintf('第%d匹配图像直方图',i);title(ttxt);
end
similar = ones(1,num);
rec_tang_1=center_rectangle(ref_img);
for i = 1:num
    match = [sname,num2str(distance_num(i)),'.jpg'];%数据库图像
    match_img = imread(match);                                   %打开图像
    rec_tang = center_rectangle(match_img);
    for j = 1:6
        similar(i) = similar(i) * (1- abs(rec_tang_1(j)-rec_tang(j)) / (rec_tang_1(j)+rec_tang(j)) );
    end
end
similar_num=mo
for i=1:num
    if abs(i-mo)>0
        if similar(i)<=similar_const
            similar_num=[similar_num,i];
        end
    end
end
%**************************************************************************
%****
disp('采用形状匹配,在给定的距离值以内的图片名称数为:');
similar_num
disp('采用形状匹配,在给定的距离值以内的图片数目为:');
length(similar_num)
%**************************************************************************
num=length(similar_num);
figure(2)
for i = 1:num
    match = [sname,num2str(similar_num(i)),'.jpg'];     %数据库图像
    match_img = imread(match);                           %打开图像
    subplot(num,1,i);
    imshow(match_img);
    ttxt=sprintf('第%d匹配图像',i);title(ttxt);
end
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.

【图像识别】基于模板匹配算法实现花朵分类matlab源码_欧式距离

【图像识别】基于模板匹配算法实现花朵分类matlab源码_欧式距离_02