EigenFace算法详解及Matlab代码0103Word文档格式.docx
- 文档编号:20214760
- 上传时间:2023-01-20
- 格式:DOCX
- 页数:19
- 大小:974.62KB
EigenFace算法详解及Matlab代码0103Word文档格式.docx
《EigenFace算法详解及Matlab代码0103Word文档格式.docx》由会员分享,可在线阅读,更多相关《EigenFace算法详解及Matlab代码0103Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
Fork=1,2,M.2.Wenowdeterminewhichfaceclassprovidesthebestdescriptionfortheinputimage.ThisisdonebyminimizingtheEuclideandistance3.Theinputfaceisconsidertobelongtoaclassifkisbellowanestablishedthreshold.Thenthefaceimageisconsideredtobeaknownface.Ifthedifferenceisabovethegiventhreshold,butbellowasecondthreshold,theimagecanbedeterminedasaunknownface.Iftheinputimageisabovethesetwothresholds,theimageisdeterminedNOTtobeaface.4.Iftheimageisfoundtobeanunknownface,youcoulddecidewhetherornotyouwanttoaddtheimagetoyourtrainingsetforfuturerecognitions.Youwouldhavetorepeatsteps1trough7toincorporatethisnewfaceimage.ThesourcecodefacerecognitionusingMatlabisprovidedbelow:
Matlab代码:
所用训练集合含20幅jpg图片,存于名为TrainDataBase的文件夹中,测试集合含10幅jpg图片,存于名为TestDataBase的文件夹中,命名均为1.jpg2.jpg3.jpg.%-%人脸辨识:
FaceRecognition%EigenFace算法%EigenFace空间的生成分解与合成%人脸辨识%-functionmeigenface()%-%step1:
读取训练集合中的人脸照片,并通过列向量拉伸生成%人脸训练集合矩阵%-clearallclccloseallimset=;
M=20;
%训练集合中人脸照片的数目figure
(1);
fori=1:
Mfilename=.TrainDataBasenum2str(i).jpg;
im=imread(filename,JPG);
im=im(:
:
2);
%im=im(:
3);
imheightimwidth=size(im);
%将图像矩阵按列拉伸为列向量imv=reshape(im,imheight*imwidth,1);
%将im中数据转化为imheight*imwidth高的列向量imset=imsetimv;
%将每个图像的像素占据一列位置,共20列向量ifi=4title(训练集合人脸照片,fontsize,18)endsubplot(5,4,i);
imshow(im);
enddisp(=Outputimageiscompleted!
=)%imset=double(imset);
imset=double(imset);
w,h=size(imset)%-%step2:
生成训练集合的平均脸%-averageface=mean(imset,2);
%imset每行的平均值,由于imset为单列向量,每行包含一个元素,因此此操作为将每行的所有值取平均值figure
(2);
imshow(uint8(reshape(averageface,imheight,imwidth);
title(平均脸);
%-%step3:
将人脸训练集合修正为与平均人脸的差:
以便计算%协方差矩阵Covariancematrix%-imset_d=imset;
figure(3);
20imset_d(:
i)=imset(:
i)-averageface;
im=reshape(imset_d(:
i),imheight,imwidth);
ifi=4title(与平均脸的差,fontsize,18)end%subplot(4,5,i);
subplot(5,4,i);
im=imagesc(im);
colormap(gray);
%imshow(im);
end%-%step4:
生成EigenFace特征脸空间%-%互相关矩阵为A*A,为减少计算量,计算代理矩阵A*A的特征值特征向量A=double(imset_d);
%includethedataoftwentyimages.%matrixof36000hightand20widthAh,Aw=size(A)L=A*A;
%matrixof20hightand20widthLh,Lw=size(L)vd=eig(L)%v为L的特征向量,d为L的特征值dL=L*v-v*d%人脸照片修正为与平均脸的差,此时矩阵A*A的秩为M-1,特征值中含有一个0%需要去除属于0的特征向量,Eigenface基底由M-1组正交向量组成vd=EliminateZero(v,d)%去除属于0的特征向量,同时将特征向量按特征值大小降序排列%生成人脸空间矩阵:
eigenfaceeigenface=;
M-1mv=A*v(:
i);
%左乘矩阵A,从而修正为协方差矩阵AA的特征向量%对Eigenface向量进行规一化修正,使每个Eigenface向量模为1,便于进行分解与合成%是否进行此归一化修正对识别没有影响,但对利用Eigenface作为基底对人脸照片进行%分解与重构却是必要的mv=mv/norm(mv);
%eigenface=eigenfacemv;
%特征人脸空间eh,ew=size(eigenface)end%显示归一化之后的人脸空间eigenfacefigure(4);
M-1im=eigenface(:
im=reshape(im,imheight,imwidth);
ifi=4title(特征脸空间:
EigenFace,fontsize,18)endsubplot(5,4,i);
%im=histeq(im,255);
end%-%step5:
计算训练集合中的照片在EigenFace基底上的投影坐标%以便进行人脸辨识%注:
如果用Eigenface基底直接对训练集合中的照片进行分解-重构%则重构误差趋于0(1e-10),如果对测试集合中的人脸(同一人,但表情姿态略有出入)%进行重构,则可观察到重构误差,这是由于EigenFace基底虽正交但不完备%-TrainCoeff=;
M%计算训练集合中第i幅图像在EigenFace基底上的投影disp(The%dthfaceimage)i=ic=double(imset_d(:
i)*eigenface;
TrainCoeff=TrainCoeffcend%-%step6:
人脸辨识,采用最近欧式距离法%计算输入图像在EigenFace基底上的投影坐标%与训练集合中各图像的投影坐标进行比较,选取欧式距离最小者作为匹配项%-%读入测试集合人脸照片N=10;
%测试集合人脸照片数目figure(5);
testset=;
Nfilename=.TestDataBasenum2str(i).jpg;
testset=testsetimv;
%subplot(3,4,i);
title(int2str(i);
endtext(200,15,请选择一幅照片(1-10),fontsize,18);
testset=double(testset);
n=input(请选择一幅照片(1-10):
);
%选取训练集合中第n幅人脸照片作为输入进行分解InputImage=testset(:
n)-averageface;
%计算输入照片在EigenFace基底上的投影坐标向量coeff=InputImage*eigenface;
%计算与训练集合中各图像的投影坐标向量的欧式距离cdist=;
Mdist=(norm(coeff-TrainCoeff(:
i)2;
cdist=cdistdist;
enddindex=sort(cdist)inum=index
(1),index
(2),index(3);
figure(6);
subplot(2,3,2);
InputImage=reshape(InputImage+averageface,imheight,imwidth);
imshow(uint8(InputImage);
title(输入照片);
subplot(2,3,4);
im1=imset(:
index
(1);
im1=reshape(im1,imheight,imwidth);
imshow(uint8(im1);
title(匹配照片1);
subplot(2,3,5);
im2=imset(:
index
(2);
im2=reshape(im2,imheight,imwidth);
imshow(uint8(im2);
title(匹配照片2);
subplot(2,3,6);
index(3);
title(匹配照片3);
pause;
close;
%-%step6:
利用EigenFace基底对测试集合中的人脸照片进行%分解-合成(重构)%注:
如果用Eigenface基底直接对训练集合中的照片进行分解-重构%则重构误差趋于0(1e-10),如果对测试集合中的人脸(同一人,但表情姿态略有出入)%进行重构,则可观察到重构误差,这是由于EigenFace基底虽正交但不完备%-;
%计算输入照片在EigenFace基底上的投影坐标coeff=InputImage*eigenface;
%在EigenFace基底上进行图像重构ReconstructedImage=eigenface(:
1:
M-1)*coeff;
%计算重构误差diff=ReconstructedImage-InputImage;
norm(diff),InputImage=reshape(InputImage+averageface,imheight,imwidth);
ReconstructedImage=reshape(ReconstructedImage+averageface,imheight,imwidth);
%figure(5);
%imagesc(ReconstructedImage);
figure(7);
subplot(2,2,1);
n*2-1);
title(训练集合中照片1);
subplot(2,2,2);
n*2);
title(训练集合中照片2);
subplot(2,2,3);
InputImage=reshape(InputImage,imheight,imwidth);
title(测试照片);
subplot(2,2,4);
ReconstructedImage=reshape(ReconstructedImage,imheight,imwidth);
imshow(uint8(ReconstructedImage);
title(测试照片的重构);
return;
%-%去除属于0的特征向量,同时将特征向量按特征值大小降序排列%-functionvd=EliminateZero(v,d)%取特征值%dd=diag(d);
dd=abs(diag(d);
%找出等于0的特征值ind=find(dd1e-06);
%1e-06);
%/1E-06);
%去除=0的特征值dd(ind)=;
%去除等于0的特征向量v(:
ind)=;
%特征值降序排序dddind=sort(dd,descend);
d=diag(ddd);
%重排特征向量v=v(:
ind);
/ResultPictures/1.Exampleofreshapetm=ma=197;
248;
17781;
22479imheightimwidth=size(ma)mac=reshape(ma,imheight*imwidth,1)tm=tmmacresult:
mac=12172294784781792.Mean:
computemeanvalueofmatrixmean(X,DIM)takesthemeanalongthedimensionDIMofX.Example:
IfX=123;
336;
468;
477;
thenmean(X,1)is3.00004.50006.0000andmean(X,2)is2.00004.00006.00006.0000.3.Imagescloadclownfiguresubplot(1,2,1)imshow(uint8(X)subplot(1,2,2)imagesc(X)%colormap(gray)axisimagetitle(DefaultCLim(=181)4.Eig:
Eigenvaluesandeigenvectors.E=eig(X)isavectorcontainingtheeigenvaluesofasquarematrixX.V,D=eig(X)producesadiagonalmatrixDofeigenvaluesandafullmatrixVwhosecolumnsarethecorrespondingeigenvectorssothatX*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EigenFace 算法 详解 Matlab 代码 0103