• 大小: 188KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-07
  • 语言: Matlab
  • 标签: Eigenface  

资源简介

用MATLAB实现Eigenface算法。 使用orl_face数据库。 有两个main函数,一个是把一个图像数据转为一行,另外是吧图像数据转为一列。

资源截图

代码片段和文件信息

% eigenface

clear all
close all
clc

%step 1:Get some data
num = 20;
[height width] = size(imread(‘data\1.pgm‘));
Data(height*widthnum) = 0; %convert one image data into a column

for i=1:num
    path = [‘data\‘num2str(i)‘.pgm‘];
    temp = imread(path);
    temp = im2double(temp);
    Data(:i) = reshape(temp [] 1);   %convert one image data into a column
end

%setp 2:Subtract the mean
MeanValue = mean(Data 2);
OriginalMean = repmat(MeanValue1 size(Data2));
DataAdjust = Data - OriginalMean;

%step 3:Calculate the covariance matrix
% 注意这里的cov函数,如果传入参数是矩阵,那么行代表了维度,也就是上面的x1x2x3xn。
% 所以,这里DataAdjust需要转置一下。
% Covariance = cov(DataAdjust‘);
% Covariance_2 = (DataAdjust * DataAdjust‘)./(size(Data2)-1); %验证了A*A‘/(N-1)等于协方差矩阵

%step 4:calculate the eigenvectors and eigenvalues
% [EigenVectors EigenValues] = eig(Covariance); %返回值EigenValues按照从小到大排序的,所以,从靠后的列选择主成分

%step 5:choosing components and forming a feature vector.
[row col] = size(Data);
if row >= col
    length = col;
else
    length = row;
end
% SortEigenVectors = fliplr(EigenVectors); %特征向量排序,第一列对应的特征值最大,依次往后
% FeatureVectors = SortEigenVectors(:1:length-1); %%select part the EigenVectors as the components here is the first length-1 columns

%用另外一种方法得到FeatureVectors针对的是数据维数较大的情况这种方法更快
C1 = DataAdjust‘ * DataAdjust;
[C1_EigenVectors C1_EigenValues] = eig(C1);
V = DataAdjust * C1_EigenVectors;
%进行归一化 这一步在好多叙述里都没有提及到
EigenVectors_2 = V ./ (ones(size(V 1)1) * sqrt(sum(V .* V)));
%选取pricipal components
SortEigenVectors_2 = fliplr(EigenVectors_2);
FeatureVectors = SortEigenVectors_2(:1:length-1); 

%选取一个特征向量进行展示,即所谓的特征脸,目前一共有20-1=19个特征脸
% EigenFace_1 = reshape(FeatureVectors(:2)height width);
% figure
% imshow(EigenFace_1 []);

%图像数据投影到特征空间上
PatternVectors = FeatureVectors‘ * DataAdjust; %每一列代表一幅图像投影到n-1维的空间里。


%测试图像
%将一张图像映射到特赠空间后得到的模式向量,也就是在n-1维上的各个投影
TestData = imread(‘D:\Matlab\3_eigenface\study\orl_faces\s20\2.pgm‘);
temp = im2double(TestData);
TestData = reshape(temp [] 1);
TestDataPatternVector = FeatureVectors‘ * (TestData - MeanValue); 
%利用欧氏距离进行比较。
result(1 length) = 0;
for i=1:length
    temp = (PatternVectors(:i) - TestDataPatternVector).^2;
    result(1i) = sqrt(sum(temp));
end
[minimum index] = min(result);
X = [‘Match the s‘ num2str(index) ‘ successfully.  Congratulations!‘];
disp(X)









 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2016-12-07 19:17  data\
     文件       10318  2016-12-07 16:01  data\1.pgm
     文件       10318  2016-12-07 16:01  data\10.pgm
     文件       10318  2016-12-07 16:01  data\11.pgm
     文件       10318  2016-12-07 16:01  data\12.pgm
     文件       10318  2016-12-07 16:01  data\13.pgm
     文件       10318  2016-12-07 16:01  data\14.pgm
     文件       10318  2016-12-07 16:01  data\15.pgm
     文件       10318  2016-12-07 16:01  data\16.pgm
     文件       10318  2016-12-07 16:01  data\17.pgm
     文件       10318  2016-12-07 16:01  data\18.pgm
     文件       10318  2016-12-07 16:01  data\19.pgm
     文件       10318  2016-12-07 16:01  data\2.pgm
     文件       10318  2016-12-07 16:01  data\20.pgm
     文件       10318  2016-12-07 16:01  data\3.pgm
     文件       10318  2016-12-07 16:01  data\4.pgm
     文件       10318  2016-12-07 16:01  data\5.pgm
     文件       10318  2016-12-07 16:01  data\6.pgm
     文件       10318  2016-12-07 16:01  data\7.pgm
     文件       10318  2016-12-07 16:01  data\8.pgm
     文件       10318  2016-12-07 16:01  data\9.pgm
     文件        2676  2016-12-15 16:02  main_4_1.m
     文件        2722  2016-12-16 21:09  main_4_2.m

评论

共有 条评论