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

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

2013-12-10 01:51 645 查看
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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  K-L matlab 人脸识别