clc;
close all;
tic
%%%%设计思路:(图像大小为32*32)先把存在在yale32_gabor_feature所有的图像的gabor特征图变换成列向量(按列展开1024
%*1),然后每40个合并,也就是合并成的矩阵是一副图像的40个gabor特征图像向量组成的矩阵,然后转置,大小变为40行1024列,这个矩阵的
%每一列代表一个像素的40个Gabor值,根据文献,再将像素在图像中的位置信息x,y位置加入特征中,然后计算RCM,一个样本图像对应一个RCM(42*42),
%这样RCM就是计算出来的特征矩阵
load yale32_gabor_feature; %加载已经计算好了的yale数据库的gabor特征图,存在三维数组feature中,size(feature)=(32,32,165*40)
persons=15; % 数据库中的人数( yaleface = 40 ; yale face = 15 )
pictures=11; % 每个人的图像样本数( yale =10 ; yale face = 11 )
row=32;
col=32;
n=row*col;
ctr=2; % 每个人参加训练的样本数
cts=pictures-ctr; % 每个人参加测试的样本数
ptr=persons*ctr; % 所有参加训练的样本数
pts=persons*cts; % 所有参加测试的样本数
N=persons*pictures;
disp('程序开始了。。。。。');
%%%%%%%%%%%%%%%%%%-----------------------------%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:N
classi_feature=[];
for j=1:40
temp=feature(:,:,((i-1)*40+j));
[irow,icol]=size(temp);
tempvector=reshape(temp,irow*icol,1); %把每一个gabor特征图(32*32)变为列向量(1024*1)
classi_feature=[classi_feature tempvector];
end
total_gaborfeature(:,:,i)= (classi_feature)'; %%total_feature的大小是40*1024*165,第一维和第二维组合成的图表示第i副样本(总共有15*11个)的所有gabor特征(40个)
end
disp('gabor特征已经排列好了。。。');
%%%%%%%%%%%%%%%%------------------------------%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
xy_matrix=zeros(2,1024);
xtemp=[1:32];
xxtemp=[];
for i=1:32
xxtemp=[xxtemp xtemp];
end
ytemp=zeros(1,32);
yytemp=[];
for i=1:32
for j=1:32
ytemp(1,j)=i;
end
yytemp=[yytemp ytemp];
end
xy_matrix=[xxtemp;yytemp];
%%%%%%%%%%%%%%%%------------------------------%%%%%%%%%%%%%%%%%%%%%%%%%%%%
hebing_matrix_feature=zeros(42,1024);
for i=1:165
temp=total_gaborfeature(:,:,i);
hebing_matrix_feature=[xy_matrix;temp];
total_feature(:,:,i) = hebing_matrix_feature; %%%size(total_feature)=[42 1024 165]
end
disp('位置特征也加进去了!!');
%%%%%%%%%%%%%%%%------------------------------%%%%%%%%%%%%%%%%%%%%%%%%%%%
zi=zeros(42,42);
avg=zeros(42,1);
sum=zeros(42,42);
%%%%%%%%%%%%%%试行断,识别率有点低%%%%%%%%%%%%%%%%%%%%%%%%%
% for i=1:165
% temp= total_feature(:,:,i); %%%%size(temp)=[42 1024]
% avg=mean(temp,2);
% for j=1:n
% zi=(temp(:,j)-avg);
% sum=sum+((zi)*(zi)');
% end
% total_RCM_matrxi(:,:,i)=sum/(n-1); %%%size(total_RCM_matrxi)=[42 42 165]
% end
%%%%%%%%%%%%%%试行断,识别率有点低%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%试行断,识别率明显提高很多%%%%%%%%%%%%公式一样,但是数据明显有些差异%%%%%%%%%%%%%
for i=1:165
temp= total_feature(:,:,i);
avg=mean(temp,2);
for j=1:n
temp(:,j)=(temp(:,j)-avg);
end
total_RCM_matrxi(:,:,i)=temp*temp'/(n-1) ;
end
disp('所有的样本RCM全部计算好了');
%%%%%%%%%%%%%%%%%%试行段,识别率明显提高很多%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%------------------------------%%%%%%%%%%%%%%%%%%%%%%%%%%%
%取前ctr个用于训练样本集,cts用测试样本集
Ran=[1 2 3 4 5 6 7 8 9 10 11];
for i=1:persons
for j=1:ctr
xl_rcm(:,:,(i-1)*ctr+j)=total_RCM_matrxi(:,:,pictures*(i-1)+Ran(j));
end
end
for i=1:persons
for j=(ctr+1):pictures
cs_rcm(:,:,cts*(i-1)+(j-ctr))=total_RCM_matrxi(:,:,pictures*(i-1)+Ran(j));
end
end
%%%%%%%%%%%%%%%%------------------------------%%%%%%%%%%%%%%%%%%%%%%%%%%
disp('计算距离中.......');
% d=RCM_Distance(xl_rcm(:,:,1),cs_rcm(:,:,1));
% disp(d);%测试函数RCM_Distance能用否
err=0;
Aclass=zeros(ptr,1); %%ptr是训练样本的总数
Bclass=zeros(pts,1); %%pts是测试样本的总数
result_class=zeros(pts,1);
for ac=1:ptr
Aclass(ac)=ceil(ac/ctr); %训练样本的本应属于的类别
end
for bc=1:pts
Bclass(bc)=ceil(bc/cts);
end
for i=1:pts
Tij=zeros(ptr,1); %第i个测试样本到所有训练样本的距离
for j=1:ptr
Tij(j)=RCM_Distance((cs_rcm(:,:,i)),(xl_rcm(:,:,j)));
end
[Min,IND]=sort(Tij);
result_class(i)=Aclass(IND(1));
if Bclass(i)~=result_class(i) %&Bresult2(i)~=Bclass2(i)
err=err+1;
end
end
err
disp('错判率:'),disp(err/pts);
Accuracy=(1-err./pts)*100;
disp('识别率:'),disp(Accuracy);
toc
% 5个用于训练,6个测试
% err =
%
% 9
%
% 错判率:
% 0.1000
%
% 识别率:
% 90
%
% Elapsed time is 21.711806 seconds.
% 2个用于训练,9个测试
% err =
%
% 29
%
% 错判率:
% 0.2148
%
% 识别率:
% 78.5185
%
% Elapsed time is 14.513804 seconds.
% 9个用于训练,2个测试
% err =
%
% 1
%
% 错判率:
% 0.0333
%
% 识别率:
% 96.6667
%
% Elapsed time is 15.022644 seconds.
评论2
最新资源