您的位置:首页 > 编程语言 > MATLAB

基于K-L变换的人脸识别的MATLAB实现

2019-04-07 16:30 183 查看

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; %协方差矩阵为xx’,这里用奇异值分解

[V,D] = eig(cov_mat); %V为以特征向量为列的矩阵,D为特征值组成的对角阵

V = xV(abs(D))^-0.5; %求协方差矩阵x*x’的特征向量

%------------------------计算特征脸个数--------------------------%

add = 0.0;

D=diag(D); %将对角阵D转换为矢量

sum = sum(D);

for k =nImages👎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 %输出识别正确率

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: