PCA人脸识别(带matlab程序)
前几天上数字图像处理的时候学习了PCA人脸识别,趁热打铁,做一些学习记录。PCA(Principal Component Analysis)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。在人脸识别上面,用PCA的主要目的就是把原来维度很高的图像,提取图像的主要成分(用于识别的特征),去掉不重要的成分,使得可以用比较少的维度来表示图像,以方便进行图形识别。
一个非常不错的学习PCA资料PCA数学原理。
看完这个应该对PCA 的原理有了更深刻的认识。
下面是matlab代码
%
%测试数据:40人,每人10张照片。每人取前ph张照片作为训练集,后(10-ph)张照片作为测试集。
clear;
clc;
ph=6;
%%
%第一步:计算特征脸并创建特征空间
tic %计算运行时间
%申请录入数据矩阵内存
imdata=zeros(112*92,40*ph);
for i=1:40
for j=1:ph
% addr=strcat('G:/orl_face/s',num2str(i),'/',num2str(j),'.pgm');
addr=strcat('G:/orl_face/s',num2str(i),'/',num2str(j),'.pgm');
a=imread(addr);%从地址中读入图像
b=a(1:112*92); %把图像a矩阵按列顺序转为行向量b
imdata(:,ph*(i-1)+j)=b'; %把b的转置矩阵存放到imdata矩阵的第ph*(i-1)+j列
end;
end;
%计算平均脸
imaverage=mean(imdata,2); %按行求平均mean(a,2) 按列mean(a)
%显示平均脸
%向量矩阵化
out=reshape(imaverage,112,92);
figure;
subplot(1,1,1);
imshow(out,[]);
title(strcat('MeanFace'));
clear i j a b addr
%图像预处理
immin=zeros(112*92,40*ph);
for i=1:40*ph
%归一化处理,提升矩阵计算速度,但小数精度不够,会影响匹配率
%immin(:,i) = (imdata(:,i)-imaverage)/col2medivation(imdata(:,i)-imaverage,112*92);
%仅减去平均脸,不做归一化处理
immin(:,i) = imdata(:,i)-imaverage;
end;
clear i imdata
%%
%计算协方差矩阵
% W=immin*immin';%dxn*nxd =dxd 太大
k=32;
W=immin'*immin; %n*d x d*n= n*n 较小
%计算特征向量与特征值(向量)
[V,~]=eigs(W,k);%降到k维
%对特征向量进行排序
V=immin*V; %dxn*nxk=d*k
VT=