MATLAB模板匹配花朵分类
一、简介
该课题为基于颜色的花朵分类。带界面GUI
二、源代码
clear;
mo = 1;%-选取第?幅图像
num=5;%图片总数量
distance_const=0.8;%设定直方图距离
similar_const=0.5;%设定形状匹配相似度
close all;
%获取第一幅图像
sname='C:\Users\lenovo\Desktop\\';%统一修改存储位置,修改路径时只需在此步修改
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);
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
function result=center_rectangle(sdata)
%求取图像的中心矩
size(sdata);
[M,N]=size(sdata);
%***************
%m00,miu00,yibu00分别与公式中数字相互对应,并取其音译
%***************
m00=0.0;
m10=0.0;
m01=0.0;
for i=1:M
for j=1:N
m00=m00+double(sdata(i,j));
m10=m10+i*double(sdata(i,j));
m01=m01+j*double(sdata(i,j));
end
end
ave_x=m10/m00;
ave_y=m01/m00;
m00;
miu20=0.0;
miu02=0.0;
miu11=0.0;
miu12=0.0;
miu21=0.0;
miu30=0.0;
miu03=0.0;
%求取7个中心矩
for i=1:M
for j=1:N
miu20=miu20+(i-ave_x).^2.*(j-ave_y).^0.*double(sdata(i,j));
miu02=miu02+(i-ave_x).^0.*(j-ave_y).^2.*double(sdata(i,j));
miu11=miu11+(i-ave_x).^1.*(j-ave_y).^1.*double(sdata(i,j));
miu12=miu12+(i-ave_x).^1.*(j-ave_y).^2.*double(sdata(i,j));
miu21=miu21+(i-ave_x).^2.*(j-ave_y).^1.*double(sdata(i,j));
miu30=miu30+(i-ave_x).^3.*(j-ave_y).^0.*double(sdata(i,j));
miu03=miu03+(i-ave_x).^0.*(j-ave_y).^3.*double(sdata(i,j));
end
end
yibu20=miu20/(m00.^((2+0)/2+1));
yibu02=miu02/(m00.^((0+2)/2+1));
yibu11=miu11/(m00.^((1+1)/2+1));
yibu12=miu12/(m00.^((1+2)/2+1));
yibu21=miu21/(m00.^((2+1)/2+1));
yibu30=miu30/(m00.^((3+0)/2+1));
yibu03=miu03/(m00.^((0+3)/2+1));