2dpca matlab程序,simulink基于2DPCA的人脸识别

Folder=['D:\灰度变换后的图片\person01';'D:\灰度变换后的图片\person02';'D:\灰度变换后的图片\person03';'D:\灰度变换后的图片\person04';'D:\灰度变换后的图片\person05';'D:\灰度变换后的图片\person06';'D:\灰度变换后的图片\person07';'D:\灰度变换后的图片\person08';'D:\灰度变换后的图片\person09';'D:\灰度变换后的图片\person10';

'D:\灰度变换后的图片\person11';'D:\灰度变换后的图片\person12';'D:\灰度变换后的图片\person13';'D:\灰度变换后的图片\person14';'D:\灰度变换后的图片\person15';'D:\灰度变换后的图片\person16';'D:\灰度变换后的图片\person17';'D:\灰度变换后的图片\person18';'D:\灰度变换后的图片\person19';'D:\灰度变换后的图片\person20';

'D:\灰度变换后的图片\person21';'D:\灰度变换后的图片\person22';'D:\灰度变换后的图片\person23';'D:\灰度变换后的图片\person24';'D:\灰度变换后的图片\person25';'D:\灰度变换后的图片\person26';'D:\灰度变换后的图片\person27';'D:\灰度变换后的图片\person28';'D:\灰度变换后的图片\person29';'D:\灰度变换后的图片\person30';

'D:\灰度变换后的图片\person31';'D:\灰度变换后的图片\person32';'D:\灰度变换后的图片\person33';'D:\灰度变换后的图片\person34';'D:\灰度变换后的图片\person35';'D:\灰度变换后的图片\person36';'D:\灰度变换后的图片\person37';'D:\灰度变换后的图片\person38';'D:\灰度变换后的图片\person39';'D:\灰度变换后的图片\person40';];

gifPath = ['\01.JPG';'\02.JPG';'\03.JPG';'\04.JPG';'\05.JPG';'\06.JPG';'\07.JPG';'\08.JPG';'\09.JPG';'\10.JPG';];

persons=40; % 数据库中的人数

pictures=10; %每个人的图像样本数

row=40;

col=45;

ctr=5; %每个人参加训练的样本数

d=8; % 降维后的维数

cts=pictures-ctr; % 每个人参加测试的样本数

ptr=persons*ctr; % 所有参加训练的样本数

pts=persons*cts; % 所有参加测试的样本数

tic

for i=1:persons

for j=1:ctr

img_path=[Folder(i,:),gifPath(j,:)];

img=double(imread(img_path));%读入图像并转双精度

imgg(:,:,pictures*(i-1)+j)=img;

A(:,:,(i-1)*ctr+j)=imgg(:,:,pictures*(i-1)+j); % A 的第三维用作训练样本的序号

end

end

G=zeros(col,col);

for i=1:ptr

G=G+A(:,:,i)'*A(:,:,i); %协方差

end

G=G/ptr;

[V,D]=eig(G);%求特征值D和特征向量V

[ld,ind]=sort(diag(D)); %ld:小到大排一列 ind:对应的索引

ld=ld(end:-1:1); %大到小排列

Ind=ind(end:-1:1);%对应的大到小索引排列

for i=1:d

X(:,i)=V(:,Ind(i));

end

for i=1:ptr

YY(:,:,i)=A(:,:,i)*X;

end

for i=1:persons

for j=(ctr+1):pictures

img_path=[Folder(i,:),gifPath(j,:)];

img=double(imread(img_path));

imgg(:,:,pictures*(i-1)+j)=img;

B(:,:,cts*(i-1)+(j-ctr))=imgg(:,:,pictures*(i-1)+j);

end

end

for i=1:pts

YYT(:,:,i)=B(:,:,i)*X;

end

err=0; %误判个数

Aclass1=zeros(ptr,1); %训练样本的分类

Aclass2=zeros(ptr,1);

Bclass1=zeros(pts,1); %测试样本的分类

Bclass2=zeros(pts,1);

Bresult1=zeros(pts,1);

Bresult2=zeros(pts,1);

for ac=1:ptr

Aclass1(ac)=ceil(ac/ctr); %训练样本的本应属于的类别

Aclass2(ac)=ceil(ac/ctr);

end

for bc=1:pts

Bclass1(bc)=ceil(bc/cts); %测试样本被判别属于的类别

Bclass2(bc)=ceil(bc/cts);

end

for i=1:pts

Dij=zeros(ptr,1); %第i个测试样本到所有训练样本的距离

Tij=zeros(ptr,1);

for j=1:ptr

YDD=YYT(:,:,i)-YY(:,:,j); % 第 i 个测试样本与第 j 个训练样本的各个投影特征向量的差

for k=1:d

Tij(j)=Tij(j)+norm(YDD(:,k)); %差的二范数累加即为两者的欧氏距离

end

end

[Min,IND]=sort(Dij); % 从小到大索引,取最小的那个类别即为结果

[Min,IND]=sort(Tij);

Bresult1(i)=Aclass1(IND(1));

Bresult2(i)=Aclass2(IND(1));

if Bresult2(i)~=Bclass2(i); %&Bresult2(i)~=Bclass2(i)

err=err+1;

end

end

disp('识别率:'),disp(1-(err/(pts+ptr)));

toc

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值