前置知识:
1.协方差矩阵的定义与计算:
2.matlab批量读取图片(原创):
%读取与初始化
cd('C:\Users\22926\Desktop\图像工程基础\s1');
file=dir('*.pgm');
[k,len]=size(file);
I=cell(k,1);
bytes=112*92;%图片的像素个数
EigVecNum=floor(k*0.8); %特征向量个数,这里取图片数的80%
%计算“拉”成的大图片
X=[];%注意这种声明方法,不用事先控制规模
for i=1:k
name=file(i).name;
I{i}=imread(name);
vec=reshape(I{i},1,bytes); %将一张图片拉成一行
X=[X;vec]; %一行行叠起来
end
%计算协方差矩阵
ave=mean(X,2);%ave是每一行的均值
X=double(X); %整数只能与相同类的整数或标量双精度值组合使用
X=X-ave;
cov=X'*X*(1/(k-1));%一定注意相乘的顺序,如果X'与X的顺序搞反了,那么cov的规模绝对不对!!
%计算特征向量与特征值
[V,D]=eigs(cov,EigVecNum);
D=(diag(D))';
V=V;
%计算特征脸
eigenface=[];
for i=1:EigVecNum
mv=X*V(:,i);
mv=mv/norm(mv);%正规化
eigenface=[eigenface,mv];
end