急用MATLAB进行人脸识别的算法修改和解释

我查到一段MATLAB进行人脸识别的算法,但是有些内容不理解,而且部分算法有问题。希望高手能够指出并修改,有问题的地方都在%后的括号中写出。我的训练图集有20张图。算法如... 我查到一段MATLAB进行人脸识别的算法,但是有些内容不理解,而且部分算法有问题。希望高手能够指出并修改,有问题的地方都在%后的括号中写出。我的训练图集有20张图。
算法如下:

%读取图像矩阵
images=[];%([]是什么意思?)
for i=1:20
str=strcat(int2str(i),'.jpg');%连接字符串形成图像的文件名。
img=imread(str);
[rows cols]=size(img);%获得图像的行和列值。
temp=reshape(img,rows*cols,1);%创建一个(N1*N2)×1矩阵。
images=[images temp];%完成循环后的images矩阵是一个(N1*N2)×20的矩阵
end

%计算均值脸
m=mean(images,2);%按矩阵的行元素求和再除以列数,形成包含每一行的平均值的列向量
mn=reshape(m,[rows cols]);%将均值脸矩阵按原图像大小调整。
imshow(mn,[]);

%求特征值和特征向量

%方法一:用SVD函数实现
[ev,ed,v]=svd(X,0);
ed=diag(ed).^2;
base=ev(:,1:M);

%方法二,不用SVD函数实现
images=double(images);
for i=1:20
images(:,i)=(images(:,i)-m);
end
X=images'*images;
[V D]=eig(X);%计算特征值和特征向量,D为特征值,V为特征向量。
[eigenV Order]=sort(diag(D));%将特征值对角矩阵转换为列向量eigenV,再从小到大排序。
eigenV=flipud(eigenV);%按eigenV相反顺序排列,即从大到小排列。
Order2=flipud(Order);
pc=V(:,Order2);%得到特征向量。
for i=1:20
base(:,i)=eigenV(i)^(-0.5)*S*pc(:,i);%按奇异值分解法计算协方差矩阵的特征向量(原算法是有两种方法求特征向量,一种奇异值分解,另一种不用奇异值分解,我这里选用没有用奇异值分解方法,但为什么还是按照奇异值分解了,而且莫名出现一个S的变量,而且这段的公式我不理解)
end

%显示M个样本的特征脸:
figure;
r=floor(sort(M));%负无穷大方向取整
c=ceil(M/r);%正无穷大方向取整(M/r是什么意思?为什么要这么做)
for ii=1:20
subplot(r,c,ii);
imagesc(reshape(base(:,ii),[rows cols]));%调整特征向量大小到灰度图像范围内显示。
colormap('gray');axis equal tight off;%返回线性灰度色图(这段不理解)
title(['Eigen Image'num2str(ii)]);
end

%对于其他人脸图;按前面计算出的特征向量重构人脸图像(这段是说什么?)
load face_image img_test;
img_test=reshape(img_test,[rows*cols size(img_test,2)]);
for tt=[1 2]
y=base'*(img_test(:,tt)-mean);
recon=base*y+mean;
end
%两幅人脸重构图像。

我还希望添加用某一幅图找出其再训练集中对应的图的算法,希望大侠能够解答,毕业设计急用!谢谢
如果回答字数过多百度审核,可以发到我的邮箱great.spirit@163.com,谢谢
展开
 我来答
我要那个妾
推荐于2016-11-27 · TA获得超过2157个赞
知道小有建树答主
回答量:927
采纳率:50%
帮助的人:231万
展开全部
哎,看在100分的面子上。。。。
images=[];%([]是什么意思?)
这个只不过是将images初始化为一个空矩阵而已。每度一幅图像,它都将这幅图像reshape成一个列向量,然后存入images中,最终,读了N幅图像,images就有N列,每一列都是一幅图像。

(原算法是有两种方法求特征向量,一种奇异值分解,另一种不用奇异值分解,我这里选用没有用奇异值分解方法,但为什么还是按照奇异值分解了,而且莫名出现一个S的变量,而且这段的公式我不理解)
这个问题是你人脸识别的算法问题,我不想研究。。。。

c=ceil(M/r);%正无穷大方向取整(M/r是什么意思?为什么要这么做)
这个为什么要这么做,是为了后面subplot画图来计算到底需要几行几列的。这个对你的程序没有任何本质的影响。这段程序就是为了把所有的人脸图在一幅图上分块显示出来。从subplot(r,c,ii);
这句可以看出,r子图像的是行数,c是列数。那么M就是图像数了。。。

colormap('gray');axis equal tight off;%返回线性灰度色图(这段不理解)
这段是一系列画图参数的操作: colormap('gray');是让你的图是灰度图。axis equal是让横纵坐标单位一致。tight是限制画图的取值范围。off是去掉坐标显示。这些都是控制显示效果的。完全无关紧要。至于具体效果,你可以把这句去掉看看显示效果,然后在加上这句再看看效果有什么变化就知道了。

%对于其他人脸图;按前面计算出的特征向量重构人脸图像(这段是说什么?)
很明显的,这个是用你这次这20个训练样本的结果来重构以前的人脸数据。

基本就是这么回事了。但是人脸特征识别我没研究过,你这个程序的算法非常的简单,至于为什么通过几个特征值分析就好用那我就不知道了,因为我没研究过这个。
sangxin1112
2011-04-20 · TA获得超过5654个赞
知道小有建树答主
回答量:307
采纳率:0%
帮助的人:94.6万
展开全部
对人脸识别不清楚,只知道下面这行是定义一个空矩阵,这个矩阵的大小及维度都是不确定的,或者说是动态的,比如调用 images = [images,A]就等于是把矩阵A合并到images里面进去
images=[];%([]是什么意思?)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式