Folder=['D:\灰度变换后的图片\person01';'D:\灰度变换后的图片\person02';'D:\灰度变换后的图片\person03';'D:\灰度变换后的图片\person04';'D:\灰度变换后的图片\person05';'D:\灰度变换后的图片\person06';'D:\灰度变换后的图片\person07';'D:\灰度变换后的图片\person08';'D:\灰度变换后的图片\person09';'D:\灰度变换后的图片\person10';
'D:\灰度变换后的图片\person11';'D:\灰度变换后的图片\person12';'D:\灰度变换后的图片\person13';'D:\灰度变换后的图片\person14';'D:\灰度变换后的图片\person15';'D:\灰度变换后的图片\person16';'D:\灰度变换后的图片\person17';'D:\灰度变换后的图片\person18';'D:\灰度变换后的图片\person19';'D:\灰度变换后的图片\person20';
'D:\灰度变换后的图片\person21';'D:\灰度变换后的图片\person22';'D:\灰度变换后的图片\person23';'D:\灰度变换后的图片\person24';'D:\灰度变换后的图片\person25';'D:\灰度变换后的图片\person26';'D:\灰度变换后的图片\person27';'D:\灰度变换后的图片\person28';'D:\灰度变换后的图片\person29';'D:\灰度变换后的图片\person30';
'D:\灰度变换后的图片\person31';'D:\灰度变换后的图片\person32';'D:\灰度变换后的图片\person33';'D:\灰度变换后的图片\person34';'D:\灰度变换后的图片\person35';'D:\灰度变换后的图片\person36';'D:\灰度变换后的图片\person37';'D:\灰度变换后的图片\person38';'D:\灰度变换后的图片\person39';'D:\灰度变换后的图片\person40';];
gifPath = ['\01.JPG';'\02.JPG';'\03.JPG';'\04.JPG';'\05.JPG';'\06.JPG';'\07.JPG';'\08.JPG';'\09.JPG';'\10.JPG';];
persons=40; % 数据库中的人数
pictures=10; %每个人的图像样本数
row=40;
col=45;
ctr=5; %每个人参加训练的样本数
d=8; % 降维后的维数
cts=pictures-ctr; % 每个人参加测试的样本数
ptr=persons*ctr; % 所有参加训练的样本数
pts=persons*cts; % 所有参加测试的样本数
tic
for i=1:persons
for j=1:ctr
img_path=[Folder(i,:),gifPath(j,:)];
img=double(imread(img_path));%读入图像并转双精度
imgg(:,:,pictures*(i-1)+j)=img;
A(:,:,(i-1)*ctr+j)=imgg(:,:,pictures*(i-1)+j); % A 的第三维用作训练样本的序号
end
end
G=zeros(col,col);
for i=1:ptr
G=G+A(:,:,i)'*A(:,:,i); %协方差
end
G=G/ptr;
[V,D]=eig(G);%求特征值D和特征向量V
[ld,ind]=sort(diag(D)); %ld:小到大排一列 ind:对应的索引
ld=ld(end:-1:1); %大到小排列
Ind=ind(end:-1:1);%对应的大到小索引排列
for i=1:d
X(:,i)=V(:,Ind(i));
end
for i=1:ptr
YY(:,:,i)=A(:,:,i)*X;
end
for i=1:persons
for j=(ctr+1):pictures
img_path=[Folder(i,:),gifPath(j,:)];
img=double(imread(img_path));
imgg(:,:,pictures*(i-1)+j)=img;
B(:,:,cts*(i-1)+(j-ctr))=imgg(:,:,pictures*(i-1)+j);
end
end
for i=1:pts
YYT(:,:,i)=B(:,:,i)*X;
end
err=0; %误判个数
Aclass1=zeros(ptr,1); %训练样本的分类
Aclass2=zeros(ptr,1);
Bclass1=zeros(pts,1); %测试样本的分类
Bclass2=zeros(pts,1);
Bresult1=zeros(pts,1);
Bresult2=zeros(pts,1);
for ac=1:ptr
Aclass1(ac)=ceil(ac/ctr); %训练样本的本应属于的类别
Aclass2(ac)=ceil(ac/ctr);
end
for bc=1:pts
Bclass1(bc)=ceil(bc/cts); %测试样本被判别属于的类别
Bclass2(bc)=ceil(bc/cts);
end
for i=1:pts
Dij=zeros(ptr,1); %第i个测试样本到所有训练样本的距离
Tij=zeros(ptr,1);
for j=1:ptr
YDD=YYT(:,:,i)-YY(:,:,j); % 第 i 个测试样本与第 j 个训练样本的各个投影特征向量的差
for k=1:d
Tij(j)=Tij(j)+norm(YDD(:,k)); %差的二范数累加即为两者的欧氏距离
end
end
[Min,IND]=sort(Dij); % 从小到大索引,取最小的那个类别即为结果
[Min,IND]=sort(Tij);
Bresult1(i)=Aclass1(IND(1));
Bresult2(i)=Aclass2(IND(1));
if Bresult2(i)~=Bclass2(i); %&Bresult2(i)~=Bclass2(i)
err=err+1;
end
end
disp('识别率:'),disp(1-(err/(pts+ptr)));
toc