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