📄 untitled.m
字号:
clc;
clear;
%读入图像
allsamples=[];
for i=1:40
for j=1:5
if i>9
str1=strcat('0', num2str(i));
elseif i<10
str1=strcat('00', num2str(i));
end;
str2=strcat('00', num2str(j));
a=imread(strcat('E:\pca\orl\orl\','orl','_',str1,'_',str2,'.bmp'));
for m1=1:112
for m2=1:92
b(1,92*(m1-1)+m2)=a(m1,m2);
end;
end;
%b=a(1:112*92);% b是行矢量 1×N,其中N=10304,提取顺序是先列后行,即从上到下,从左到右
b=double(b);
allsamples=[ allsamples;b];
end;
end;
samplemean=mean(allsamples);
%samplemean=uint8(sample mean);
xmean=[];
for i=1:200
xmean(i,:)=allsamples(i,:)-samplemean; % xmean是一个M × N矩阵,xmean每一行保存的数据是“每个图片数据-平均图片”
end;
sigma1=xmean*xmean';
[u,s,v] = svd(sigma1);
sum1= sum(s);
sum2=sum(sum1);
dsum_extract=0;
p = 0;
dsum=0;
while(dsum_extract/sum2<0.90)
p = p + 1;
dsum=dsum+s(p,p);
dsum_extract=dsum;
end;
base=[];
for i=1:p
base(:,i) = xmean' * u(:,i);
end
tempD=zeros(p,1);
for i=1:p
De=0;
for j=1:112*92
De=De+base(j,i)*base(j,i);
end
tempD(i,1)=De;
end
% 归一化
for i=1:p
for j=1:112*92
base(j,i)=base(j,i)/sqrt(tempD(i,1));
end
end
%取出base中的第一列,画出在E:\pca\orl\orl1\画出特征脸的图像,按存入的顺序取
eign_1=zeros(10304,1);
eign=zeros(112,92);
for i1=1:p
eign_1=base(:,i1);
for j=1:112
for i=1:92
eign(j,i)=eign_1(92*(j-1)+i);
end;
end;
x=(eign-min(eign_1))/(max(eign_1)-min(eign_1));
%x=uint8(x);
imwrite(x,strcat('E:\pca\orl\orl1\',num2str(i1),'.bmp'));
end;
%最后一张特征脸显示一下
imshow(x);
face3=base'*xmean';
testset=[];
for i=1:40
for j=6:10
if i>9
str1=strcat('0', num2str(i));
else
str1=strcat('00', num2str(i));
end;
if j<10
str2=strcat('00', num2str(j));
else
str2=strcat('0', num2str(j));
end
q=imread(strcat('E:\pca\orl\orl\','orl','_',str1,'_',str2,'.bmp'));
for m1=1:112
for m2=1:92
e(1,92*(m1-1)+m2)=q(m1,m2);
end;
end;
%e=q(1:112*92);
b=double(e);
testset=[testset;b];
end;
end;
xmean4=[];
for i=1:200
xmean4(i,:)= testset(i,:)-samplemean; % xmean是一个M × N矩阵,xmean每一行保存的数据是“每个图片数据-平均图片”
end;
face4=base'*xmean4';
%把待识别的200幅人脸分别与训练集比较,做欧式距离之后每一列存的是一幅待识别人脸信息,共200列
for j=1:200
for m=1:200
for i=1:p
z(i,1)=(face4(i,j)-face3(i,m))^2;
end;
d4(m,j)=sqrt(sum(z));
end;
end;
[C,h] =sort(d4);
acc=0;
for r=1:200
for i=1:5
L=mod(h(i,r),5);
k(i,r)=h(i,r)/5;
if L==0
y(i,r)=k(i,r);
else
y(i,r)=ceil(k(i,r));
end;
end
%想找到数组中相同元素,有两个或以上相等的就认为是,否则就取最小的一个
for j1=1:5
for j2=1:5
while(j1~=j2)
if all(y(j1,r)==y(j2,r))>=2
c2(1,r)=y(j1,r);
else
c2(1,r)=y(1,r);
break;
end;
end;
end;
end;
%对列r/5,与所求的识别结果比较得出识别率
x=mod(r,5);
if x==0
reg2=r/5;
else
reg2=ceil(r/5);
end;
if c2(1,r)==reg2
acc=acc+1;
end;
end;
acc=acc/200;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -