本次学习使用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个特征向量对原图片进行转化