⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 untitled.m

📁 人脸识别算法PCA的可执行程序
💻 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 + -