基于matlab特征脸Eigenface算法的实现
基于matlab特征臉Eigenface算法的實(shí)現(xiàn)
- 1.特征臉?biāo)惴ê喗?/li>
- 2.PCA
- 2.1 什么是PCA
- 2.2 PCA實(shí)現(xiàn)步驟(附matlab代碼)
- 2.2.1 前期準(zhǔn)備
- 2.2.2 具體步驟
1.特征臉?biāo)惴ê喗?/h1>
特征臉?biāo)惴ㄊ菍⑷四槒南袼乜臻g變換到另外一個空間,在另外一個空間做相似性的計(jì)算。特征量不能再像素空間直接進(jìn)行相似性計(jì)算在于原像素空間中不同類別的圖像在分布上很難用個簡單的線或者面把他們切分開,然后如果變換到另一個空間,就可以很好的把他們分開了。這里我們用到的PAC(Principal Component Analysis)從而得到特征臉。
2.PCA
2.1 什么是PCA
PCA(principal components analysis)即主成分分析技術(shù),又稱主分量分析。主成分分析也稱主分量分析,旨在利用降維的思想,把多指標(biāo)轉(zhuǎn)化為少數(shù)幾個綜合指標(biāo)。
在統(tǒng)計(jì)學(xué)中,主成分分析PCA是一種簡化數(shù)據(jù)集的技術(shù)。它是一個線性變換。這個變換把數(shù)據(jù)變換到一個新的坐標(biāo)系統(tǒng)中,使得任何數(shù)據(jù)投影的第一大方差在第一個坐標(biāo)(稱為第一主成分)上,第二大方差在第二個坐標(biāo)(第二主成分)上,依次類推。主成分分析經(jīng)常用于減少數(shù)據(jù)集的維數(shù),同時保持?jǐn)?shù)據(jù)集的對方差貢獻(xiàn)最大的特征。這是通過保留低階主成分,忽略高階主成分做到的。這樣低階成分往往能夠保留住數(shù)據(jù)的最重要方面。但是,這也不是一定的,要視具體應(yīng)用而定。
2.2 PCA實(shí)現(xiàn)步驟(附matlab代碼)
2.2.1 前期準(zhǔn)備
接下來我們需要使用ORL Faces人臉數(shù)據(jù)庫實(shí)現(xiàn)特征臉的提取,對于人臉數(shù)據(jù)庫,大家可自行選擇。
2.2.2 具體步驟
(1)獲取數(shù)據(jù),將圖像的進(jìn)行列拼接,然后合成一個大矩陣,該矩陣中每一列都是一個圖像的列拼接??梢酝ㄟ^matlab實(shí)現(xiàn)如下:
humanNum=40; %人數(shù) trainNum=9; %每個人的訓(xùn)練級人數(shù) eigenFaceNum=20 %取特征向量數(shù)量 imgL=112; %圖像長寬 imgW=92; faceData=zeros(imgL*imgW,trainNum*humanNum);%臉矩陣分配空間對于圖像的長寬獲得,可以通過在matlab中導(dǎo)入圖像后,點(diǎn)擊查看圖像的長寬。
我們需要將圖像進(jìn)行列拼接,每個圖像將占據(jù)(imgW*imgL)*1,訓(xùn)練集圖像為9,于是我們聲明以上空間的數(shù)組。
for j=1:humanNumfor i=1:trainNumpath = ['F:\orl_faces\s',num2str(j),'\',num2str(i),'.pgm'];tempFace = imread(path);faceData(:,(j-1)*trainNum+i)=reshape(tempFace, [], 1); %進(jìn)行列向拼接end end(2)計(jì)算求每行圖像的平均值,然后每一行減去該平均值,由于平均值是共同分量,減去可以將數(shù)據(jù)值減小,同時并不影響數(shù)據(jù)間的差值,對于后期的求特征值特征向量會更加簡便。
%求平均臉 avgface=mean(faceData,2);%平均臉(一列) %減去平均臉 A=faceData; for i=1:humanNum*trainNumA(:,i)=A(:,i)-avgface; end(3)求特征值和特征向量
convT=A'*A; %求協(xié)方差矩陣的轉(zhuǎn)置 10304*10304 [Vs,Ds]= eig(convT); %求特征向量,特征值 D=Ds;V=Vs; Dtemp=abs(diag(D)); %轉(zhuǎn)化成列向量 ind=find(Dtemp<1e-6); %尋找0特征值Dtemp(ind)=[]; %去除相應(yīng)的特征值 V(:,ind)=[]; %去除相應(yīng)的特征向量[DD,ind]=sort(Dtemp,'descend');%將特征值從大到小排列V=V(:,ind); %將特征向量按特征值從大到小排列(4)取特征向量,按理說特征向量越多,在后面的人臉識別中會更加準(zhǔn)確。
%取前eigenFaceNum個特征向量 for i=1:eigenFaceNumVG(:,i)=V(:,i); end以上為PCA的主要步驟,接下來我們進(jìn)行特征臉的顯示。
EigenVectors=A*VG; %將A向特征空間映射%轉(zhuǎn)化成特征臉 for j=1:eigenFaceNumtempA=reshape(EigenVectors(:,j),112, 92); %將平均臉數(shù)據(jù)構(gòu)成平均臉圖象if(j==1)eigenVectorsImg=tempA;elseeigenVectorsImg=[eigenVectorsImg,tempA]; %將特征臉拼接成一個圖片end end測試集進(jìn)行匹配,將數(shù)據(jù)分為測試集和訓(xùn)練集,大家可根據(jù)自己的人臉數(shù)據(jù)庫中每個人物的圖片數(shù)來分。識別率較低,就增加訓(xùn)練集,減少測試集。
% 一個圖片進(jìn)行匹配 s=5; number=10; path = ['F:\orl_faces\s',num2str(s),'\',num2str(number),'.pgm']; comimg=imread(path); comFaceData=reshape(comimg, [], 1); comFaceData=double(comFaceData); comFaceData=comFaceData-avgface; W1=(comFaceData')*EigenVectors; %計(jì)算特征區(qū)域的投影坐標(biāo)distance=zeros(rows,1); for i=1:rowstempW=W(i,:);distance(i)=pdist2(W1,tempW); end [m,index]=min(distance); %在特征區(qū)域找最小距離 matchImg=reshape(faceData(:,index),112, 92);%匹配圖片 matchNum=ceil(index/trainNum);figure(3) subplot(1,2,1) imshow(comimg,[]); title(['被識別圖片,來自第',num2str(s),"組人像"]) subplot(1,2,2) imshow(matchImg,[]); if(s==matchNum)title(['匹配圖片成功,匹配第',num2str(matchNum),"組人像"]) elsetitle(['匹配圖片失敗,匹配第',num2str(matchNum),"組人像"]) end總結(jié)
以上是生活随笔為你收集整理的基于matlab特征脸Eigenface算法的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20多年老码农的IT学习之路
- 下一篇: 怎么用matlab画国旗,Matlab考