基于Matlab的人脸识别设计(PCA)
1??PCA主成分分析
圖像預(yù)處理是人臉識別的重要組成部分。由于圖像采集環(huán)境不同,輸入測試圖像常常存在一些問題,如不同程度的噪聲和圖像對比度不足。再者,獲取距離和焦距大小之類的外部因素也使得面部信息在整個(gè)圖像中具有不確定的大小和位置。為了確保收集的面部圖像的質(zhì)量,必須在識別之前預(yù)處理測試圖像。所以下文將會對本次設(shè)計(jì)中的圖像預(yù)處理過程進(jìn)行介紹。
1.1 ?樣本圖像預(yù)處理
樣本圖像的選擇與處理是實(shí)現(xiàn)人臉識別的基礎(chǔ),故在選擇樣本圖像時(shí)要進(jìn)行人為的干預(yù)。首先樣本圖像要保證人物特征的明顯與背景單一,才能使盡可能多的與人臉相關(guān)的關(guān)鍵被保留下來。其次是圖像的分辨率和寬高比。在進(jìn)行之后的圖像處理時(shí),相同的分辨率可以便于程序?qū)D像進(jìn)行更高效的運(yùn)算。而相同的寬高比將會使樣本圖像的變量剛好的控制在圖像本事,使本次課程設(shè)計(jì)更具有說明性。
確定好樣本圖像后,需要對圖像進(jìn)行灰度處理。因?yàn)榕臄z環(huán)境、光圈、樣本圖像人物的身體狀況不同,會產(chǎn)生不同色彩的人臉信息,這些色彩的不同會影響對圖像人臉本身的特征識別。同時(shí)傳統(tǒng)的彩色RGB圖像數(shù)據(jù)量過大,所以處理彩色圖像時(shí)其運(yùn)算會時(shí)間過高。灰度處理代碼如下:
pic1 = rgb2gray(imread('1.jpg'));處理后效果如圖1:
圖1?灰度轉(zhuǎn)換對比圖
圖像數(shù)據(jù)量和圖像的大小有著直接的關(guān)系,即使是將圖像像素縮至150*180后(PS:此處為小弟手動更改的像素),也會出現(xiàn)數(shù)據(jù)量過大導(dǎo)致運(yùn)行緩慢的現(xiàn)象。所以需要對灰度處理后的的圖形進(jìn)行縮小。具體代碼如下:
namud = 0.5; ?pic1 = rgb2gray(imread('1.jpg'));pic1 = imresize(pic1,namud); ?在完成了樣本圖像外觀上的所有操作后,則需要對其轉(zhuǎn)化后的數(shù)據(jù)進(jìn)行儲存,為方便后續(xù)操作,可將所有的樣本圖像以多個(gè)矩陣的方式儲存在一個(gè)細(xì)胞體結(jié)構(gòu)中,并計(jì)算得到某一個(gè)圖像的矩陣行列大小(m、n),從而將一個(gè)細(xì)胞體中的所有行為m、列為n的矩陣,轉(zhuǎn)化成大小為n*m的列矩陣,這樣方便后續(xù)的PCA算法運(yùn)算。上述過程的代碼如下:
[m,n] = size(pic1);pic_all = {pic1,pic2,pic3,pic4,pic5,pic6,pic7,pic8,pic9,pic10};for i=1:10FaceData(i,:) = reshape(pic_all{i},1,m*n);end為了節(jié)省存儲空間,Matlab為圖像提供了特殊的數(shù)據(jù)類型uint8(8位無符號整數(shù)),以此方式存儲的圖像稱作8位圖像。當(dāng)使用函數(shù)imread()時(shí),其會把灰度圖像存入一個(gè)8位矩陣,當(dāng)為RGB圖像時(shí),就存入8位RGB矩陣中。因此,Matlab讀入圖像的數(shù)據(jù)是uint8,而Matlab中數(shù)值一般采用double型(64位)存儲和運(yùn)算。所以要先將圖像轉(zhuǎn)為double格式的才能運(yùn)算,即將uint8(0-255范圍類型)準(zhǔn)換為double(0-1范圍類型)。其代碼如下:
FaceData = double(FaceData)/255;至此對樣本圖像的預(yù)處理全部結(jié)束,接下來則需要對其進(jìn)行運(yùn)算得到其圖像特征,從而進(jìn)行與測試人臉的圖像識別。
1.2??測試圖像預(yù)處理
測試圖像即需要進(jìn)行人臉識別與數(shù)據(jù)庫中進(jìn)行比對的圖像,但在處理之前因?yàn)楹罄m(xù)使用的PCA的算法,故需要進(jìn)行對測試圖像進(jìn)行像素的轉(zhuǎn)換,并保存轉(zhuǎn)換后的圖像,其代碼如下:
[filename,pathname]=uigetfile('*','choose a picture');path=[pathname,filename];Origimg=imread(path);img=imresize(Origimg,[180 150]);path='E:\Matlab_face';filename = 'test.jpg';newpath=fullfile(path,filename);imwrite(img,newpath,'jpg');對測試圖像的預(yù)處理與對樣本圖像的預(yù)處理一致。其代碼如下:pic = rgb2gray(img2find); ??pic = imresize(pic,namud);[m2,n2] = size(pic);pic = reshape(pic,1,m2*n2);pic = double(pic)/255;2?PCA主成分分析
PCA(Principal Component Analysis,主成分分析)是一種常用的數(shù)據(jù)分析方法。它是一種對數(shù)據(jù)進(jìn)行分析的技術(shù),最重要的應(yīng)用是對原有數(shù)據(jù)進(jìn)行簡化。PCA通過線性變換將原始數(shù)據(jù)變換為一組各維度線性無關(guān)的表示,可用于提取數(shù)據(jù)的主要特征分量,常用于高維數(shù)據(jù)的降維。這種方法可以有效的找出數(shù)據(jù)中最“主要”的元素和結(jié)構(gòu),去除噪音和冗余,將原有的復(fù)雜數(shù)據(jù)降維,揭示隱藏在復(fù)雜數(shù)據(jù)背后的簡單結(jié)構(gòu)。它的優(yōu)點(diǎn)是簡單,而且無參數(shù)限制,可以方便的應(yīng)用與各個(gè)場合。
2.1 PCA算法分析
表1 PCA算法分析所涉及的變量說明
| 變量名稱 | 變量說明 |
| m | 樣本圖像個(gè)數(shù) |
| Cell | 樣本圖像矩陣 |
| avg | 均值 |
| n | 樣本矩陣中最大列數(shù) |
| Z | 減去均值后的樣本矩陣 |
| C | 協(xié)方差矩陣 |
| Y | 降維后的圖像矩陣 |
| T | 表轉(zhuǎn)置 |
| V | 協(xié)方差矩陣的特征值 |
| D | 協(xié)方差矩陣特征值對應(yīng)的特征向量 |
將每一張樣本圖像轉(zhuǎn)換為大小為n(1*75*90)的列向量Xm,并儲存在一個(gè)矩陣中。所得樣本矩陣可表示為:
將樣本矩陣的每一列進(jìn)行零均值化。求樣本矩陣中每列的均值,并轉(zhuǎn)化為行向量,再轉(zhuǎn)化為行為m列為n的矩陣即得到均值向量(Avg),使細(xì)胞體向量中與均值向量相減,即完成對樣本矩陣的零均值化:
計(jì)算協(xié)方差矩陣:
求出協(xié)方差矩陣的特征值V及對應(yīng)的特征向量D。并將特征向量按對應(yīng)特征值大小從上到下按行排列成矩陣,取前k行組成矩陣P:
將樣本數(shù)據(jù)與矩陣P相乘,即得到降維到k維后的數(shù)據(jù):
至此PCA過程完成。
2.2.2 PCA代碼應(yīng)用
經(jīng)過上文的PCA算法分析我們可以基本得到其運(yùn)算流程。以m條n維數(shù)據(jù)為例,即將原始數(shù)據(jù)按列組成n行m列矩陣X,將X的每一行進(jìn)行零均值化,即減去這一行的均值,求出協(xié)方差矩陣?。求出協(xié)方差矩陣的特征值及對應(yīng)的特征向量,將特征向量按對應(yīng)特征值大小從上到下按行排列成矩陣,取前k行組成矩陣P,Y=PX即為降維到k維后的數(shù)據(jù)。其具體代碼如下:
function Cell_all = PCA(img,k) ?[m,n] = size(img);img_mean = mean(img);img_mean_all = repmat(img_mean,m,1);Z = img - img_mean_all;T = Z'*Z/m; ???[V,D] = eigs(T,k);img_new = img*V*D; ?Cell_all = {img_new,V,D};通過以上代碼即可實(shí)現(xiàn)對樣本人臉圖片的降維與數(shù)據(jù)處理。同時(shí)因?yàn)樘幚頊y試人臉圖像使用的也為PCA故其代碼與上面類似即:
pic_done = pic*V*D ;3?判別圖像間的相似性
3.1最小距離法
在樣本人臉照片完成了預(yù)處理和PCA運(yùn)算后,即將所有的樣本人臉數(shù)據(jù)都存儲在一個(gè)人臉庫中。再將測試人臉照片完成預(yù)處理與PCA運(yùn)算后,得到其運(yùn)算后的數(shù)據(jù)。之后便確定圖像間的相似性,即判斷測試圖像與樣本圖像之間的關(guān)系,并找到測試圖像對應(yīng)的樣本圖像,從而實(shí)現(xiàn)人臉識別功能。在這里選用最小距離法來判定圖像間的相似性,從而實(shí)現(xiàn)人臉識別,具體代碼如下
for i=1:m1 ?face(i) = norm(img_all(i,:)-pic_done); ?end ?FaceFind = find(face?== min(face)); ?在這里我們把PCA之后的圖像映射到坐標(biāo)之間的幾何距離作為評判與哪一個(gè)人臉最近的標(biāo)準(zhǔn) 。其中黑色圓點(diǎn)為待識別圖像坐標(biāo),紅色圓點(diǎn)為匹配圖像坐標(biāo),可見其兩點(diǎn)的距離最近。
參考文獻(xiàn)
PS:1.極其建議大家閱讀?PCA算法詳解_GatsbyNewton-CSDN博客_pca算法PCAPCA(Principal Component Analysis,主成分分析)是一種常用的數(shù)據(jù)分析方法。PCA通過線性變換將原始數(shù)據(jù)變換為一組各維度線性無關(guān)的表示,可用于提取數(shù)據(jù)的主要特征分量,常用于高維數(shù)據(jù)的降維。網(wǎng)上關(guān)于PCA的文章有很多,但是大多數(shù)只描述了PCA的分析過程,而沒有講述其中的原理。這篇文章的目的是介紹PCA的基本數(shù)學(xué)原理,幫助讀者了解PCA的工作機(jī)制是什么。當(dāng)然我https://blog.csdn.net/u010376788/article/details/46957957
? ? ? ? 2.本文的人臉識別率不高,但是應(yīng)對一般的課程設(shè)計(jì)還是可以,畢竟不會有人真的一張一張的數(shù)你的照片匹配率。
? ? ? ? 3.其他函數(shù)知識點(diǎn):
matlab中 rgb2gray() 函數(shù) 具體實(shí)現(xiàn)_corilei的博客-CSDN博客_rgb2gray函數(shù)? ? ????????簡介????rgb2gray是matlab內(nèi)部一種處理圖像的函數(shù),通過消除圖像色調(diào)和飽和度信息同時(shí)保留亮度實(shí)現(xiàn)將將RGB圖像或彩色圖轉(zhuǎn)換為灰度圖像,即灰度化處理的功能,調(diào)用這個(gè)功能的格式是I = rgb2gray(RGB),意思是將真彩色圖像RGB轉(zhuǎn)換為灰度強(qiáng)度圖像I 。????????調(diào)用格式I = rgb2gray(RGB)newmap= rgb2gray(map)函數(shù)...https://blog.csdn.net/corilei/article/details/80559448matlab的imread_深藏功與名-CSDN博客_imread函數(shù) matlabimread(matlab)????????????????????????????????????????????函數(shù)語法?A?=?imread(filename,?fmt)[X,?map]?=?imread(...)[...]?=?imread(filename)[...]?=?imread(URL,...)[...]?=?imread(https://blog.csdn.net/langb2014/article/details/48465795Matlab中cell數(shù)組的使用_ljh0302的專欄-CSDN博客_matlab讀取cell數(shù)組轉(zhuǎn)載地址:http://www.matlabsky.com/forum.php?mod=viewthread&tid=21089從celll使用說起在讀取文件的時(shí)候,cell數(shù)組(各種翻譯都有,元胞數(shù)組,單元數(shù)組...直接無視)是MATLAB的寵兒,基本都會出現(xiàn),長期使用發(fā)現(xiàn)頻率比struct高不少~無論是Import Data還是使用textscan之類獲取數(shù)據(jù),從長期使用高級語言的角度https://blog.csdn.net/ljh0302/article/details/50819018MATLAB的reshape函數(shù)_xtingjie的博客-CSDN博客_reshape函數(shù)matlab用法一作用是將4*6的A,變成6*4的B,數(shù)據(jù)排列規(guī)則:對A逐列掃描,對B逐列填充,也就是先處理完第一列,在處理第二列,再第三列。。。用法二 A是4*6的,C是2*3*4的,都有24個(gè)元素,變換前后的矩陣元素個(gè)數(shù)一樣總結(jié)reshape函數(shù)總是將原矩陣A,重組為新矩陣B,這里A、B元素個(gè)數(shù)需相同。重組的規(guī)則如下: 總是先處理低維的,再處理高維的,比如要把4*6的A變?yōu)?*4的B,就要先掃描A的第一https://blog.csdn.net/xtingjie/article/details/70991097matlab圖像uint8和double的關(guān)系,除以255乘以255_三眼二郎-CSDN博客_matlab uint8和doublematlab默認(rèn)圖像的儲存和讀取方式為uint8但是為了計(jì)算和表達(dá)方便matlab針對uint8和double都有相應(yīng)操作有時(shí)我們會疑惑一會iMG = double(img);imshow(uint8(IMG)*25)一會imshow(IMG)imwrite同樣有如此操作為什么呢??????????我們在使用時(shí)可以分成兩個(gè)體系在用uint8時(shí),matlab默認(rèn)圖像為[0,2...https://blog.csdn.net/a6333230/article/details/96474738matlab中repmat函數(shù)的用法_恰同學(xué)少年的博客-CSDN博客_repmat函數(shù)matlabB = repmat(A,m,n)B = repmat(A,[m n])B = repmat(A,[m n p...])這是一個(gè)處理大矩陣且內(nèi)容有重復(fù)時(shí)使用,其功能是以A的內(nèi)容堆疊在(MxN)的矩陣B中,B矩陣的大小由MxN及A矩陣的內(nèi)容決定,如果A是一個(gè)3x4x5的矩陣,有B = repmat(A,2,3)則最后的矩陣是6x12x5例如:>>B=repmat( [1https://blog.csdn.net/majinlei121/article/details/50762997圖像處理中uint8和double的問題_大丈夫-CSDN博客_uint8和double為了節(jié)省存儲空間,matlab為圖像提供了特殊的數(shù)據(jù)類型uint8(8位無符號整數(shù)),以此方式存儲的圖像稱作8位圖像。imread把灰度圖像存入一個(gè)8位矩陣,當(dāng)為RGB圖像時(shí),就存入8位RGB矩陣中。因此,matlab讀入圖像的數(shù)據(jù)是uint8,而matlab中數(shù)值一般采用double型(64位)存儲和運(yùn)算。所以要先將圖像轉(zhuǎn)為double格式的才能運(yùn)算,I2=im2double(I1)https://blog.csdn.net/yjl9122/article/details/50937966
總結(jié)
以上是生活随笔為你收集整理的基于Matlab的人脸识别设计(PCA)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: scipy库中的stats模块
- 下一篇: 加快pip下载的速度---镜像