用一个文件face_recongnition.m实现从读取文件数据到PCA主成份提取和人脸识别的整个过程 tic;
SampleFiles = dir('F1');%返回目录中的文件 %经测试图片文件从3到1193 allsample = [];%样本矩阵 fnum=3; lnum=1193; for i = fnum : lnum
filename = SampleFiles(i).name;%读图片名 filename=strcat('F1','\\',filename); sample = imread(filename); [row,col]=size(sample);
pix_num=row*col;%图片像素点数目 %figure(i);
%subplot(2,2,1);imshow(sample); %subplot(2,2,2);imshow(sample);
temp=reshape(sample,pix_num,1);%返回一个m*1的矩阵temp,将二维图像数据变成一维列向量
allsample=[allsample temp];%将所有图片数据变成一个样本矩阵 end
allsample = uint8(allsample);
VI
%%%%%%%%%主成分分析(PCA)%%%%%%%%%%%%%% %%%%%%%%%计算平均图片数据%%%%%%%%%%% m = mean(allsample,2); %计算样本每一维平均值 img_num = size(allsample,2);%返回列数,也即训练图片数目
%%%%%%计算每个图像与均值的差%%%%%%%%%%%%%% A = zeros(pix_num,img_num);%行为图片像素个数,列为图片数目 m1=ones(1,img_num);%用于构造矩阵运算 A = double(allsample) - m*m1;
%%%%%%%计算协方差矩阵的特征矢量和特征值%%%%%% L = A'*A; %由SVD理论构造矩阵L=A'*A用于计算特征值和特征向量
[V D] = eig(L);%计算矩阵A的特征值D和特征向量矩阵V
d1=diag(D);
% 按特征值大小以降序排列 dsort = flipud(d1); vsort = fliplr(V); %以下选择95%的能量 dsum = sum(dsort);
VII
dsumtemp = 0;
char_num = 0;%特征值主分量个数 while( dsumtemp/dsum < 0.95) char_num = char_num + 1;
dsumtemp = sum(dsort(1:char_num)); end
%%%%%%计算特征脸主分量%%%%%%%%%% U=zeros(pix_num,char_num);%主分量特征向量 vsort=vsort(:,1:char_num); dsort=dsort(1:char_num).^(-1/2); dsort=diag(dsort);
U=A* vsort*dsort;%求协方差矩阵的特征向量主分量
%%%%%%计算训练集中人脸在特征空间中的投影表示%%%%% Train_pro=zeros(char_num,img_num); Train_pro=U'*A;
%%%%%%%%%%对测试集中人脸进行识别%%%%%%%% testFiles = dir('F2');%返回目录中的文件() %经测试图片文件从3到1193 alltest = [];%样本矩阵
VIII
for i = fnum : lnum
tfilename = testFiles(i).name; tfilename=strcat('F2','\\',tfilename); test = imread(tfilename); [row,col]=size(test);
ttemp=reshape(test,row*col,1);%返回一个m*1的矩阵temp,将二维图像数据变成一维列向量
alltest=[alltest ttemp];%将所有图片数据变成一个样本矩阵 end
alltest = uint8(alltest);
%%%%%%%%计算减去均值后的人脸矩阵%%%%%% tA = zeros(pix_num,img_num); tA = double(alltest) - m*m1;
%%%%计算测试集中人脸在特征空间中的投影表示%%%% Test_pro=zeros(char_num,img_num); Test_pro=U'*tA;
%%%%%%测试集中人脸和训练集中人脸相似性进行匹配%%%% pro_match=zeros(char_num,img_num); mtemp=ones(1,img_num);
IX
diatance=zeros(img_num,img_num); sum1=0;%sum1为匹配成功的数目
for i=1:img_num %测试集中的第i个图片数据 pro_match=Test_pro(:,i)*mtemp-Train_pro; distance=pro_match'*pro_match; distance=diag(distance); [mat_min,match(i)]=min(distance); if(i==match(i)) sum1=sum1+1; end end
rec_perc=(sum1/img_num)
%%%%%%随机抽取5个图形做代表显示匹配效果%%%%%% for i=1:5
ri=(round(100*rand(1,1))); figure(i); subplot(121); r=allsample(:,ri);
imshow(reshape(r,142,120));title(SampleFiles(ri).name,'FontWeight','bold','Fontsize',15,'color','red'); subplot(122);
X
k=match(ri);
imshow(reshape(alltest(:,k),142,120));title(testFiles(k).name,'FontWeight','bold','Fontsize',15,'color','red'); end toc
XI

