PCA进行人脸识别

clc;clear all;close all;
%测试数据:32人,每人10张照片,取前5张照片作为训练集,后5张照片作为测试集。
ph=5;%测试训练集样本数
imdata=zeros(11292,32ph);
for i=1:32
for j=1:ph
addr=strcat(‘E:/模式识别/orl_faces/s’,num2str(i),’/’,num2str(j),’.pgm’);
a=imread(addr);%读入图像
b=a(1:11292); %把图像a矩阵按列顺序转为 行向量b
imdata(:,ph
(i-1)+j)=b’; %把b的转置矩阵存放到imdata矩阵的第ph*(i-1)+j列
end
end
%%
%第一步:计算特征脸并创建特征空间
%计算平均脸
imaverage=mean(imdata,2); %按行求平均mean(a,2)
out=reshape(imaverage,112,92);
figure;
imshow(out,[]);
title(‘平均 Face’);

clear i j a b addr
%%
%图像预处理
immin=zeros(11292,32ph);
for i=1:32ph
%归一化处理,提升矩阵计算速度,但小数精度不够,会影响匹配率
%immin(:,i) = (imdata(:,i)-imaverage)/col2medivation(imdata(:,i)-imaverage,112
92);
%仅减去平均脸,不做归一化处理
immin(:,i) = imdata(:,i)-imaverage;
end
clear i imdata
%%
W=immin’immin;%计算协方差矩阵
%计算特征向量与特征值
k=32;
[V,~]=eigs(W,k);%降到32维
V=immin
V; %dn的矩阵与nk的矩阵相乘;
VT=fliplr(V); %对特征向量进行排序
clear V W

%显示前32个特征脸
figure;
for i=1:32
v=VT(:,i);
%向量矩阵化
out=reshape(v,112,92); %把(112*92)1的列向量转成11292的矩阵
subplot(4,8,i);
imshow(out,[]);
title(strcat(‘Face’,num2str(i)));
end
clear i v out
%%
%第二步:将训练集图像映射到特征空间

featuretrain=zeros(k,32ph);
for i=1:32
ph
%映射训练集图像
add=VT’immin(:,i); %kd的矩阵与d*1的矩阵相乘;
featuretrain(:,i)=add;
end
clear i add

%%
%第三步:映射测试集图像到特征空间

%读入测试集图像
test=zeros(11292,32(10-ph));
for i=1:32
for j=(ph+1):10 %6到10
addr=strcat(‘E:/模式识别/orl_faces/s’,num2str(i),’/’,num2str(j),’.pgm’);
a=imread(addr);
b=a(1:11292);
test(:,(10-ph)
(i-1)+(j-ph))=b’;
end
end

%图像预处理
testmin=zeros(11292,32(10-ph));
for i=1:32*(10-ph)
testmin(:,i) = test(:,i)-imaverage;
end
clear i j a b addr test

featuretest=zeros(k,k*(10-ph));
for i=1:k*(10-ph)
%映射测试集图像
add=VT’testmin(:,i);
featuretest(:,i)=add;
end
clear i add
%%
%匹配计算
count=0;
for t=1:k
(10-ph)
point=figureNum(featuretest,t,featuretrain,32ph);%计算最小距离
%计算匹配个数
if(round(point/ph+0.4)==round(t/(10-ph)+0.4))
count=count+1;
end
end
tol=count/(k
(10-ph));
display(strcat(‘匹配率:’,num2str(tol*100),’%’));

%需要建立一个function文件
function point=figureNum(test,t1,train,num)
point=1;
T=norm(test(:,t1)-train(:,1));%初始默认第一列最匹配
for t2=1:num
distance=norm(test(:,t1)-train(:,t2));
if (distance<T)
point=t2;
T=distance;
end
end
end

猜你喜欢

转载自blog.csdn.net/weixin_43661602/article/details/84064781