数字图像处理(五) 利用PCA算法进行人脸识别
来源:互联网 发布:minitab软件入门 编辑:程序博客网 时间:2024/06/05 22:06
把你的脸部识别出来这样高科技的东西,原来可以简单的实现,说是简单,其实不像之前的那些,这次写不出来,直接拿了高材生老师的代码来理解整个思路(请尊重他的知识产权),将算法读懂。数字图像处理,觉得挺实用的而写这些东西。
首先需要我们提取人脸库,如一个公司,一所学校,把每个人的头像切下来。imcrop一下,截取成一个个小方框,就如南大标准脸那样的照片。
(:)是将矩阵转成一列。n个人可以排成n列,存成一个库。为了让识别的效果更好,同一个人可以用多个图片取样。所以可以用个三维的矩阵存储。(这里一个人用了两张样照。)
i 为 1 1 2 2 3 3 4 4
k 为 1 2 1 2 1 2 1 2
filelist=dir('*.bmp');FileNum=length(filelist);%for i=1:FileNum/2for j=1:FileNum inFilename = filelist(j).name; fa=imread(inFilename); fa=fa(:);%取整 i=ceil(j/2); if mod(j,2) == 1 k=1; else k=2; end FaceLib(:,k,i)=double(fa);endsave FaceLib;
save之后会保存为一个mat文件,通过load方法可将数据拿到。识别部分利用了PCA算法。
识别处理源码:
load('FaceLab.mat'); %他人源码,未经同意不得随便转载 % filelist=dir('*.bmp');%inFilename = filelist.name;%读入识别图像 testface = imread('test.bmp');% testface = rgb2gray(testface);% testface = imresize(testface, [128 128], 'bicubic');testface = double(testface(:));dim=size(StuFaceLab,1);tal=size(StuFaceLab,2);class=size(StuFaceLab,3);ell=2; % ell training sample;ellsample=1; % ellsample test sample;t=1e7; % Similarity matrix 的参数order=1; dita=1e7; NumTotal=ell*class;lpp=NumTotal-class;lda=class-1;polynomial=1;pca=40;%------------------- KPCA ------------------------------%Itr=zeros(dim,ell,class); % Training sample feature vectorfor classnum=1:class for e=1:ell% Itr(:,e,classnum)=Iv(:,e,classnum); % Itr(:,e,classnum)=StuFaceLab(:,e,classnum); % end end%----------------------------------------------------------------%% 倒入向量 Iv(dim,ell)% 样本类数 classImean=zeros(dim,1);for classnum=1:class for i=1:ell Imean=Imean+Itr(:,i,classnum); endendImean=(1/(ell*class))*Imean; %求平均向量Q=zeros(dim,ell*class);for classnum=1:class for num=1:ell Q(:,num+(classnum-1)*ell)=Itr(:,num,classnum)-Imean(:,1); endendR=zeros(ell*class,ell*class);R=Q'*Q; % R's size is ell * elld=rank(R);d=pca;[U,L]=eigs(R,d,'LM'); % 求出 R 的eigenvector and eigenvalueWpca=zeros(dim,d);for p=1:d Wpca(:,p)=(1/(sqrt(L(p,p))))*Q*U(:,p);end % 程序至此得到了线形变换的矩阵 Wpca .%----------------------------------------------------------------%Iy=zeros(d,ell,class); % training feature vector % for classnum=1:class for num=1:ell Y=zeros(d,1); Iy(:,num,classnum)=Wpca'*Itr(:,num,classnum); endend %---------------------------循环体开始-------------------------------% % X=Tldalpp(:,img,cl); % X input sample vector % %以下为改进算法, 求每个类的 Z1 的平均值% Iymean=zeros(dimension,class); Iymean=zeros(d,class); % because there two training face, revised by Y.G.Wang for classnum=1:class % Z1 : the mean of Z1 for i=1:ell Iymean(:,classnum)=Iymean(:,classnum)+Iy(:,i,classnum); end Iymean(:,classnum)=(1/ell)*Iymean(:,classnum); end%-------------------------进行匹配-------------------%%----------------此处可以进行修改,利用其他simlarity measure------------% G2=zeros(1,class); for classnum=1:class G2(1,classnum)=(X'*Iymean(:,classnum))/(norm(X)*norm(Iymean(:,classnum))); end Sclass=max(G2); %---------------得出最后的结果---------------------% for classnum=1:class if Sclass==G2(1,classnum) lastresult=classnum; end end clc if Sclass > 0.97 fprintf('此脸在本库中,且是学号:%d\n', lastresult); else fprintf('此脸不在本库中!\n'); end
pca可以降维,因为如果这么大的一个矩阵数据进行处理匹配,速度肯定很慢,所以线性代数派上用场,一个这么大的矩阵,如果能得到两幅图像之间几乎相似的特征即可。
参考资料
特征向量的几何意义,学线性代数学了很久,也搞不懂这个的东西,很好的一篇文章:
http://blog.csdn.net/hexbina/article/details/7525850
还有个12届毕业的师兄:
http://www.cnblogs.com/blue-lg/archive/2012/05/14/2499581.html
还有PCA方法从原理到实现。
http://blog.csdn.net/celerychen2009/article/details/9048033#comments
- 数字图像处理(五) 利用PCA算法进行人脸识别
- 利用Multi-LBP和PCA、LDA进行人脸识别
- 利用Python实现基于PCA算法的人脸识别
- PCA+支持向量机-人脸识别(五)
- 人脸识别中的PCA算法
- 基于PCA的人脸识别算法
- pca算法实现人脸识别
- 时钟识别(数字图像处理)
- PCA人脸识别
- PCA、人脸识别
- PCA人脸识别
- PCA人脸识别
- PCA人脸识别
- PCA人脸识别
- 【基于PCA的人脸识别算法】从QR分解到PCA,再到人脸识别
- (链接) AdaBoost中利用Haar特征进行人脸识别算法分析与总结
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结(转载)
- 利用PCA来做人脸识别
- test
- 1160C语言实验——某年某月的天数
- 10115 - Automatic Editing
- Android中实现Web通信
- cocos2dx之创建有渐影效果的sprite
- 数字图像处理(五) 利用PCA算法进行人脸识别
- iOS游戏开发三:苹果内支付实现 In-app
- 基于visual Studio2013解决C语言竞赛题之1055排序
- JAX-WS 2.2 API is required, but an older version was found in the JDK.
- hdu1316(斐波那契数列+高精度)
- 1163C语言实验——排列
- vs同一个工程下不要有多个main函数
- URAL_1018之二叉苹果树
- iOS 使用静态库封装sdk