• 大小: 3KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2022-11-21
  • 语言: Matlab
  • 标签: PCA  人脸识别  

资源简介

使用PCA主成分分析方法提取特征脸,然后在特征脸空间使用最近邻分类器进行分类

资源截图

代码片段和文件信息

clear ;

tic;
%%  打开训练图像集 
Files = dir(‘face33\train\*.bmp‘);      %打开文件夹中所有图像
Dir = ‘face33\train\‘;
nImg=length(Files);
for k = 1:length(Files);
    Filename = [Dir  Files(k).name];
    Img  = imread(Filename);
    x(:k) = Img(:);           % 把图像放在矩阵x的第k列
    %% 将二维Img转换成一维列向量时,按列抽取:即是把第i+1列置于第i列后
end;
nImages = k;                    % 图像个数
imsize = size(Img);            % 图像维度
nPixels = imsize(1)*imsize(2);   % 图像总像素数
x = double(x)/255;                    % 将x转换为double型

%% 计算每幅训练图像的与平均脸的差值 
avrgx = mean(x‘)‘;           %计算均值图像
for i=1:1:nImages
    x(:i) = x(:i) - avrgx;       % x每一列减去平均脸
end;

%% 奇异值分解方法计算协方差矩阵的特征值和特征向量
%{
 Image尺寸为142x120=17040,协方差阵S=xx‘,则S为17040x17040矩阵,计算其特征值、特征向量计算量很大
 于是计算cov_mat=x‘x特征值、特征向量,则x‘x*v=lamda*v,左右同乘以x:xx‘x*v=lamda*x*v
 得到S特征向量为:lamda^-0.5*x*v
%}
cov_mat = x‘*x;  %协方差矩阵为x*x’,这里用奇异值分解
[VD] = eig(cov_mat);         %V为以特征向量为列的矩阵,D为特征值组成的对角阵
%V = x*V*(abs(D))^-0.5;        %求协方差矩阵x*x‘的特征向量


%% 计算特征脸个数
add = 0.0;
DD=diag(D);                       %将对角阵D转换为矢量
sum = sum(DD);
for lamda_k =nImages:-1:1          %由于在D按照从小到大排列,故逆序遍历
    add = add + DD(lamda_k);
    if add/sum > 0.95     

评论

共有 条评论