PCA检测人脸的简单示例_matlab实现

来源:互联网 发布:单片机控制8个led灯 编辑:程序博客网 时间:2024/05/17 22:06

此文转载于mpbchina的博客,转载地址:

http://blog.csdn.net/mpbchina/article/details/7384425



  1. [plain] view plaincopy
  2. %训练  
  3. %Lx=X'*X  
  4. clear;  
  5. clc;  
  6. train_path='..\Data\TrainingSet\';  
  7. phi=zeros(64*64,20);  
  8. for i=1:20  
  9. path=strcat(train_path,num2str(i),'.bmp');  
  10. Image=imread(path);  
  11. Image=imresize(Image,[64,64]);  
  12. phi(:,i)=double(reshape(Image,1,[])');  
  13. end;  
  14. %mean  
  15. mean_phi=mean(phi,2);  
  16. mean_face=reshape(mean_phi,64,64);  
  17. Image_mean=mat2gray(mean_face);  
  18. imwrite(Image_mean,'meanface.bmp','bmp');  
  19. %demean  
  20. for i=1:19  
  21. X(:,i)=phi(:,i)-mean_phi;  
  22. end  
  23. Lx=X'*X;  
  24. tic;  
  25. [eigenvector,eigenvalue]=eigs(Lx,19);  
  26. toc;  
  27. %normalization  
  28. for i=1:19  
  29. %K-L变换  
  30. UL(:,i)=X*eigenvector(:,i)/sqrt(eigenvalue(i,i));  
  31. end  
  32. %display Eigenface  
  33. for i=1:19  
  34. Eigenface=reshape(UL(:,i),[64,64]);  
  35. figure(i);  
  36. imshow(mat2gray(Eigenface));  
  37. end  

得到的均值图像mean_face:

前19个最大主元对应的“特征脸”

测试
测试用样本:

[plain] view plaincopy
  1. %使用测试样本进行测试  
  2. clc;  
  3. test_path='..\Data\TestingSet\';  
  4. error=zeros([1,4]);  
  5. for i=1:4  
  6. path=strcat(test_path,num2str(i),'.bmp');  
  7. Image=imread(path);  
  8. Image=double(imresize(Image,[64,64]));  
  9. phi_test=zeros(64*64,1);  
  10. phi_test(:,1)=double(reshape(Image,1,[])');  
  11. X_test=phi_test-mean_phi;  
  12. Y_test=UL'*X_test;  
  13. X_test_re=UL*Y_test;  
  14. Face_re=X_test_re+mean_phi;  
  15. calculate error rate  
  16. e=Face_re-phi_test;  
  17.   
  18.   
  19. %%display figure  
  20. Face_re_2=reshape(Face_re(:,1),[64,64]);  
  21. figure(i);  
  22.   
  23. imshow(mat2gray(Image));  
  24. title('Original');  
  25. figure(10+i);  
  26. imshow(mat2gray(Face_re_2));  
  27. title('Reconstruct');  
  28. error(1,i)=norm(e);  
  29.   
  30. %dispaly error rate  
  31. error_rate=error(1,i);  
  32. display(error_rate);  
  33. end  
重建出的测试样本与原样本的对比:

四副测试样本的重建误差分别为:
1.4195e+003
1.9564e+003
4.7337e+003
7.0103e+003

可见测试样本为人脸的样本的重建误差显然小于非人脸的重建误差。



原创粉丝点击