clear all;
%---------------------- 打开训练图像集 --------------------%
Files = dir('FREET\F1\*.bmp'); %打开文件夹中所有图像
Dir = 'FREET\F1\';
for k = 1:length(Files);
Filename = [Dir , Files(k).name];
Img = imread(Filename);
x(:,k) = Img(:); % 把图像放在矩阵x的第k列
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;
%-----奇异值分解方法计算协方差矩阵的特征值和特征向量----%
cov_mat = x'*x; %协方差矩阵为x*x’,这里用奇异值分解
[V,D] = eig(cov_mat); %V为以特征向量为列的矩阵,D为特征值组成的对角阵
V = x*V*(abs(D))^-0.5; %求协方差矩阵x*x'的特征向量
%------------------------计算特征脸个数--------------------------%
add = 0.0;
D=diag(D); %将对角阵D转换为矢量
sum = sum(D);
for k =nImages:-1:1 %由于在D按照从小到大排列,故逆序遍历
add = add + D(k);
if add/sum > 0.95 %当差异信息比例达到95%时退出循环
break;
end
end
%-------------测试样本在新空间上投影后的坐标-----------%
KLCoef = x'*V;
%---------------------- 打开待识别图像集 --------------------%
files = dir('FREET\F2\*.bmp'); %打开文件夹中所有图像
dir = 'FREET\F2\';
for k = 1:length(files);
filename = [dir , files(k).name];
img = imread(filename);
y(:,k) = img(:);
end;
y = double(y)/255;
%----------- 计算每幅待识别图像的与平均脸的差值 -------%
for i=1:1:nImages
y(:,i) = y(:,i) - avrgx; % y每一列减去平均脸
end;
%-------------待识别样本在新空间上投影后的坐标-----------%
dKLCoef = y'*V;
%---------------------------按照最近邻法分类------------------------%
count = 0.0; %计数器,用于计算正确识别的人脸个数
for image_index = 1:1:nImages
for i=1:1:nImages
%计算待识别图像与每幅训练图像坐标间的欧氏距离,由特征脸的正交归一性,欧氏距离就是坐标点乘再开方
dist_comp(i) = sqrt(dot(dKLCoef(image_index,:)-KLCoef(i,:), dKLCoef(image_index,:)-KLCoef(i,:)));
end
min_index = find(dist_comp == min(dist_comp)); %找出欧氏距离最小的训练图像的下标
if min_index(1) == image_index %判断最近邻分类是否正确
count= count + 1;
end
end
rate = count/nImages %输出识别正确率
转自:http://lovefreewind.blog.163.com/blog/static/17834635720120904529174/