### 修改后的PCA进行人脸识别的Matlab代码解析 #### PCA(主成分分析)在人脸识别中的应用 主成分分析(Principal Component Analysis, PCA)是一种常用的数据降维技术,在图像处理尤其是人脸识别领域有着广泛的应用。通过PCA可以将高维的人脸图像数据转换为低维特征向量,这些特征向量被称为“特征脸”或“Eigenface”。本文将详细解析给定的Matlab代码,并解释其在人脸识别中的具体实现方法。 #### 代码解析 1. **加载人脸图像数据**: - 使用`imread`函数读取位于`'D:\rawdata\ORL\'`路径下的图像数据。 - 代码中通过双层循环分别读取了40个人的各5张不同角度的脸部图片(总计200张),并将图像转换为10304维的向量表示形式存储到`allsamples`数组中。 2. **计算均值图像**: - 通过对所有图像向量求平均值得到了人脸图像的均值向量`samplemean`,即所有图像的平均表示。 3. **中心化数据**: - 对每一张图像进行中心化处理,即用原始图像减去均值图像得到`xmean`矩阵。这一操作的目的是消除图像数据的均值影响,便于后续PCA计算。 4. **计算协方差矩阵与特征值分解**: - 计算协方差矩阵`sigma`,并对其进行特征值分解得到特征向量`vd`与特征值`d1`。 5. **选取主成分**: - 通过累加特征值排序后的前90%的特征值来确定需要保留的主成分数量。这一步骤确保了模型的精度同时尽可能地减少计算量。 6. **构建特征脸矩阵**: - 根据选取的主成分数量,计算特征脸矩阵`base`。这一步是PCA的核心步骤之一,特征脸矩阵中的每一列代表了一个特征脸(即一个方向上的人脸变化)。 7. **计算图像在特征空间中的坐标**: - 将所有图像投影到特征空间中,得到`allcoor`矩阵。这一步将原始图像转换为了特征空间中的坐标表示。 8. **识别测试图像**: - 对于每一张测试图像,同样将其转换为特征空间中的坐标`tcoor`,并与训练集中的每个样本进行距离比较。 - 通过最近邻算法确定测试图像所属类别。 #### 关键技术点解析 1. **图像向量化**:通过将二维图像转换为一维向量,使得图像数据能够被计算机处理。在这个例子中,每张112×92像素的图像被转换成了10304维的向量。 2. **均值图像计算**:均值图像是所有训练图像的平均表示,用于中心化图像数据。通过减去均值图像,可以消除图像的亮度等共性因素的影响。 3. **特征值分解**:通过对协方差矩阵进行特征值分解,可以得到特征向量与特征值。特征值的大小反映了对应特征向量的重要性,通常选择较大的特征值对应的特征向量作为主成分。 4. **特征脸矩阵构建**:特征脸矩阵由选取的主成分构成,它代表了图像数据的主要变化趋势。在人脸识别中,通过将图像投影到该矩阵上,可以有效降低数据维度并保持主要的信息。 5. **最近邻分类**:通过计算测试图像在特征空间中的坐标与训练集中各个样本之间的距离,选择距离最小的几个样本作为候选,然后根据候选样本的类别来确定最终结果。 #### 结论 通过上述代码解析可以看出,PCA在人脸识别中的应用主要包括图像数据预处理、特征提取以及分类三个步骤。通过PCA不仅可以有效地减少计算量,提高算法效率,还能显著提升识别准确性。此外,PCA还可以与其他机器学习算法结合使用,进一步提高人脸识别系统的性能。
% calc xmean,sigma and its eigen decomposition
allsamples=[];%所有训练图像
for i=1:40
for j=1:5
a=imread(strcat('D:\rawdata\ORL\s',num2str(i),'\',num2str(j),'.pgm'));
% imshow(a);
b=a(1:112*92); % b是行矢量 1×N,其中N=10304,提取顺序是先列后行,即从上到下,从左到右
b=double(b);
allsamples=[allsamples; b]; % allsamples 是一个M * N 矩阵,allsamples 中每一行数据代表一张图片,其中M=200
end
end
samplemean=mean(allsamples); % 平均图片,1 × N
for i=1:200 xmean(i,:)=allsamples(i,:)-samplemean; % xmean是一个M × N矩阵,xmean每一行保存的数据是“每个图片数据-平均图片”
end;
sigma=xmean*xmean'; % M * M 阶矩阵
[v d]=eig(sigma);
d1=diag(d);
[d2 index]=sort(d1); %以升序排序
cols=size(v,2);% 特征向量矩阵的列数
for i=1:cols
vsort(:,i) = v(:, index(cols-i+1) ); % vsort 是一个M*col(注:col一般等于M)阶矩阵,保存的是按降序排列的特征向量,每一列构成一个特征向量
dsort(i) = d1( index(cols-i+1) ); % dsort 保存的是按降序排列的特征值,是一维行向量
end %完成降序排列
%以下选择90%的能量
dsum = sum(dsort);
dsum_extract = 0;
p = 0;
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助