資源簡介
用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
- 上一篇:手指靜脈識別matlab
- 下一篇:matlab 遺傳算法組合優(yōu)化
評論
共有 條評論