程序逻辑:
Load_database
% 每张图片大小为:112*92=10304 一共92张图片 v 用来存放face 数据v=zeros(10304,80);for i=1:8%进入对应的路径 s1 s2...cd(strcat('s',num2str(i)));for j=1:10a=imread(strcat(num2str(j),'.png'));%将图片数据 reshape 成 a行 单列的数据v(:,(i-1)*10+j)=reshape(a,size(a,1)*size(a,2),1);end
% 向外退出一层cd ..end
变量说明:
v:用来存储所有图片的数据,由于图片是gray(灰度的),所以每个图片的像素大小等于 图片的长度*图像的宽度=112*92=10304
然而图片是二维的数据,这里为了存储,将其reshape 为: 10304行 1列的列元素;
所以v 变量是 10304行 80列的数组,其中每一列代表一个图像;一共80张图片
所以load database返回的数据是 v 所有图片的数据
init data函数的作用:
该函数主要的作用是,按照论文的公式得到对应的特征向量,
cv=zeros(size(v,2),N);
for i=1:size(v,2)cv(i,:)=single(vzm(:,i))'*V; % Each row in cv is the signature for one image.
endend
变量的说明:
cv: cv 是从v 中的图像中得到的特征向量
cv 的行数是 80 也就是80张图片;
cv 的列数是N :特征向量的个数
所以 cv 的每一行对应着 照片的特正向量
图像处理:
%图像读取
fac=imread(path);
r=reshape(fac,10304,1);
%% Recognition
% Now, we run the algorithm and see if we can correctly recognize the face. p=r-m; % Subtract the mean
s=single(p)'*V;
z=[];
for i=1:size(v,2)z=[z,norm(cv(i,:)-s,2)];if(rem(i,20)==0)axes(handles.axes1);imshow(reshape(v(:,i),112,92))enddrawnow;
end[a,i]=min(z);
%显示在下面
index=ceil(i/10);
fac 是读取的一张人脸
r 是将人脸reshape 成一列数据
s: 是将图片按照论文的方式提取到的特征值
z: z的作用是 在循环体中,遍历所有的 80张图片,求读取图片得到的特征值和每张人脸特征值之间的 欧几里得距离,即 第二范数;距离越小代表越相近;
然后选择最小的,人为是本人