本次学习使用MATLAB中的PCA函数对Yale人脸数据库进行降维,并观察前20个特征向量所对应的图像。欢迎大家一起讨论,进步。
设计思路
1.读取人脸数据:将165张图片保存在info中,每一行代表一张图片(100*100维),共165列
A. 设置图片路径
B. 根据路径读取图片
C. 将100*100的图片转化为一行,即1*10000
D. 把转化后的图片保存在info中
2.进行PCA分析
A. 将info转为double类型(PCA不支持整数类输入)
B. 调用PCA函数
3.输出前20个特征向量所对应的图片
A. 将特征向量转化为100*100的数组
B. 调用mat2gray将数组转化为图片
代码:
%读取人脸数据:将165张图片保存在info中,每行代表一张图片,共165列。
info=[];
for i=1:165
filename=strcat('C:\Users\Reid Lee\Desktop\yale\s',num2str(i),'.bmp');
img = imread(filename,'bmp');
vex = reshape(img,1,100*100);
info = [info;vex];
end
%进行PCA分析
x = double(info);
[coeff,score,latent]=pca(x);
%输出前20个特征向量所对应的图片
for i=1:20
img=reshape(coeff(:,i),100,100);
subplot(5,4,i)
imshow(mat2gray(img));
end
%只保留前k个特征
k=20;
%coeff(:,k+1:164)=0;
x = x * (coeff*coeff');
%输出还原的图片
for i=1:165
filename=strcat('C:\Users\Reid Lee\Desktop\myale\m',num2str(i),'.bmp');
img=reshape(coeff(:,i),100,100);
imwrite(mat2gray(img),filename,'bmp');
end
sprintf('finish')
测试及结果
1. 前20个特征向量对应的图片
2. 使用前20个特征向量对原图片进行转化