您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > 基于PCA进行人脸识别的Matlab代码
%一个修改后的PCA进行人脸识别的Matlab代码%calcxmean,sigmaanditseigendecompositionallsamples=[];%所有训练图像fori=1:40forj=1:5a=imread(strcat('D:\rawdata\ORL\s',num2str(i),'\',num2str(j),'.pgm'));%imshow(a);b=a(1:112*92);%b是行矢量1×N,其中N=10304,提取顺序是先列后行,即从上到下,从左到右b=double(b);allsamples=[allsamples;b];%allsamples是一个M*N矩阵,allsamples中每一行数据代表一张图片,其中M=200endendsamplemean=mean(allsamples);%平均图片,1×Nfori=1:200xmean(i,:)=allsamples(i,:)-samplemean;%xmean是一个M×N矩阵,xmean每一行保存的数据是“每个图片数据-平均图片”end;sigma=xmean*xmean';%M*M阶矩阵[vd]=eig(sigma);d1=diag(d);[d2index]=sort(d1);%以升序排序cols=size(v,2);%特征向量矩阵的列数fori=1:colsvsort(:,i)=v(:,index(cols-i+1));%vsort是一个M*col(注:col一般等于M)阶矩阵,保存的是按降序排列的特征向量,每一列构成一个特征向量dsort(i)=d1(index(cols-i+1));%dsort保存的是按降序排列的特征值,是一维行向量end%完成降序排列%以下选择90%的能量dsum=sum(dsort);dsum_extract=0;p=0;while(dsum_extract/dsum0.9)p=p+1;dsum_extract=sum(dsort(1:p));endi=1;%(训练阶段)计算特征脸形成的坐标系while(i=p&&dsort(i)0)base(:,i)=dsort(i)^(-1/2)*xmean'*vsort(:,i);%base是N×p阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化,详见《基于PCA的人脸识别算法研究》p31i=i+1;end%addbywolfsky就是下面两行代码,将训练样本对坐标系上进行投影,得到一个M*p阶矩阵allcoorallcoor=allsamples*base;accu=0;%测试过程fori=1:40forj=6:10%读入40x5副测试图像a=imread(strcat('D:\rawdata\ORL\s',num2str(i),'\',num2str(j),'.pgm'));b=a(1:10304);b=double(b);tcoor=b*base;%计算坐标,是1×p阶矩阵fork=1:200mdist(k)=norm(tcoor-allcoor(k,:));end;%三阶近邻[dist,index2]=sort(mdist);class1=floor(index2(1)/5)+1;class2=floor(index2(2)/5)+1;class3=floor(index2(3)/5)+1;ifclass1~=class2&&class2~=class3class=class1;elseifclass1==class2class=class1;elseifclass2==class3class=class2;end;ifclass==iaccu=accu+1;end;end;end;accuracy=accu/200%输出识别率函数调用是定义函数,然后用函数名进行调用就可以了
本文标题:基于PCA进行人脸识别的Matlab代码
链接地址:https://www.777doc.com/doc-3022192 .html