前置知识:

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