MATLAB人脸识别
MATLAB人臉識別
人臉識別是一門新興的科研項目,起始于上個世紀60年代。經過幾十年的發展,現已成為一項最有上升潛力的人體特征識別技術。具有廣泛的應用前景,它的工作原理是借由的生物特征來確認生物個體,利用MATLAB軟件實現人臉信息的檢測、定位與識別,在輸入的整幅圖像中尋找人臉區域,把圖像分割成兩個部分——人臉區域和非人臉區域,從而為后續的應用作準備。PCA法實現人臉邊緣檢測,確定其分布范圍,設定門限閥值,實現人臉區域與非人臉區域的分割。再結合長寬比、目標面積等計算方法在圖像中分割出人臉區域,經試驗該方法能較為精確地定位單人臉圖像,對多人臉圖像定位不準確。
人臉識別是圖像識別的一個重要分支,其基本結構如圖所示。為了保證人臉的位置一致性,在一定程度上克服了背景、頭發等冗余信息的干擾,首先要對人臉庫中的圖像進行一些預處理操作。緊接著,進行特征抽取,將得到的人臉特征和訓練樣本進行對比,根據相似程序的高低決定最后的識別結果。
圖像采集
預處理
特征提取
測試 訓練
特征匹配
提取庫 識別結果
圖1-1 人臉識別系統框圖
3.1 圖像的采集
3.1.1人臉圖像的獲取
圖像的獲取都是通過攝像頭攝取,攝取的圖像可以是真人也可以是人臉的圖片,為了方便計算直接使用需要識別的人臉圖像 。
3.1.2人臉檢測
人臉檢測主要任務是判斷所給圖像是否存在人臉,若存在人臉需要給出人臉的大小(區域面積),坐標位置,是否為二值圖像 等信息。
3.2人臉圖像的預處理
常應用于人臉圖像的預處理方法有圖像
類型轉換、濾波去噪、灰度變換、邊緣檢測及二值化、尺寸歸一化、作為通用人臉圖像預處理模塊要能夠充分適應不同人臉庫中圖像在人臉大小、光照強度、成像系統等方面的任意性和差異性不能單獨采用某種單一的濾波、灰度變換和邊緣檢測方法。灰度歸一化等所以在本仿真系統中對上述的每種預處理方法全部加以實現的同時還對三種最常用預處理方法濾波去噪、灰度變換、邊緣檢測提供了多種不同的具體算法。
3.2.1濾波去噪
由于噪聲給圖像帶來的失真和降質在特征提取之前采用濾波的方式來去除噪聲是實際人臉識別系統中所必須的步驟。濾波的方法有很多如各種平滑濾波、各種銳化濾波等。在人臉圖像預處理中使用較多的濾波是平滑濾波方法可分為以下三類線性濾波、中值濾波、自適應濾波。
(1)線性濾波最典型的線性濾波方法如采用鄰域平均法的均值濾波器、采用鄰域加權平均的高斯濾波和維納濾波。線性濾波可以去除圖像中某些特定類型的噪聲如圖像中的顆粒噪聲高斯噪聲、椒鹽噪聲等。對
掃描得到的人臉圖像根據其噪聲類型一般采用此種濾波方法。考慮濾波模板大小對濾波效果影響較大仿真系統選擇算法時對同種濾波算法提供了不同模板大小的情況。
(2)中值濾波法中值濾波法是一種非線性濾波方法它把像素及其鄰域中的像素按灰度級進行排序然后選擇該組的中間值作為輸出像素值。中值濾波方法的最大優點是抑制噪聲效果明顯且能保護邊界。對于使用基于整體的人臉識別算法的系統中由于失掉小區域的細節對特征提取影響較小所以這種濾波方法最受歡迎。
(3)自適應濾波自適應濾波能夠根據圖像的局部方差來調整濾波器的輸出其濾波效果要優于線性濾波同時可以更好地保存圖像的邊緣和高頻細節信息。
3.2.1灰度變換
灰度變換是圖像增強技術中的一種。通過灰度變換可對原始圖 像中的光照不均進行補償使得待識別人臉圖像遵循同一或相似的灰度分布。只有這樣不同圖像在特征提取和識別時才具有可比性。這一過程也被稱作灰度歸一化。常用在人臉識別系統中的灰度變換方法主要有基于圖像統計特征的直方圖均衡化、直方圖規定化和灰度均值方差標準化三種方法。直方圖均衡化和直方圖規定化的灰度變換原理和實現方法可由matlab仿真來實現。三種灰度變換方法均能在一定程度上消除由于光照條件不同而
對人臉識別帶來的影響。故在仿真系統中提供了三種灰度變換效果比較及選擇界面用戶可根據需要選用。
3.2.3 邊緣檢測
對輸入人臉圖像進行邊緣檢測是很多人臉識別系統在人臉粗定位及人臉主要器官眼睛、鼻子、嘴巴定位時采用的預處理方法。邊緣檢測的方法有很多主要有微分算子法、Sobel算子法、拉普拉斯算子法、canny算子法等。每種算子對不同方向邊緣的檢測能力和抑制噪聲的能力都不同。所以和灰度變換及濾波去噪部分的設計思路相同在仿真系統中給出了canny、sobel、log、prewitt四種算子在不同灰度閾值下、不同方向的邊緣檢測算法使用者可從
檢測結果中加以比較、選擇合適的算法。圖像類型轉換、圖像二值化、尺寸歸一化也是一些人臉識別系統中經常使用的預處理方法。為了在不修改其他算法的基礎上擴大
系統處理圖像的類型和范圍將輸入圖像首先轉換為統一的類型是多數人臉圖像預處理中的第一步。仿真系統中通過調用MATLAB中提供的各種圖像類型轉換函數來實現TIF、JPG轉換為BMP格式及彩色到灰度圖像的轉換對圖像二值化采用了graythresh()函數來自動選擇閾值的二值化方法尺寸歸一化采用的算法是對人臉圖像進行剪裁和尺寸縮放實現去除大部分頭發、服飾和背景的干擾并將人臉圖像大小統一。
3.3 特征提取
通過人臉特征點的檢測與標定可以確定人臉圖像中顯著特征點的位置如眼睛、眉毛、鼻子、嘴巴等器官,同時還可以得到這些器官及其面部輪廓的形狀信息的描述。根據人臉特征點檢測與標定的結果,通過某些運算得到人臉特征的描述。
3.3.1 人臉識別的算法
通過判別圖像中所有可能區域是否屬于“人臉模式”的方法來實現人臉檢測。這類方法有:特征臉法、人工神經網絡法、支持向量機法;積分圖像法。
本次使用的是PCA(主成分分析法)其原理是:利用K-L變換抽取人臉的主要成分,構成特征臉空間,識別時將測試圖像投影到此空間,得到一組投影系數,通過與各個人臉圖像比較進行識別。
對于一幅M*N的人臉圖像,將其每列相連構成一個大小為D=M*N維的列向量。D就是人臉圖像的維數,即是圖像空間的維數。設n是訓練樣本的數目;Xj表示第j幅人臉圖像形成的人臉向量,則所需樣本的協方差矩陣為:
(1)
其中U為訓練樣本的平均圖像向量:
(2)
令A=[x1-u,x2-u,...xn-u],則有Sr=AAT,其維數為D×D。根據K-L變換原理,需要求得的新坐標系由矩陣AAT的非零特征值所對應的特征向量組成。直接計算的計算量比較大,所以采用奇異值分解(SVD)定理,通過求解ATA的特征值和特征向量來獲得AAT的特征值和特征向量。
依據SVD定理,令li(i=1,2,…,r)為矩陣ATA的r個非零特征值,vi為ATA對應于li的特征向量,則AAT的正交歸一特征向量Ui為:
(3)
則“特征臉”空間為:w=(U1,U2,...,Un)
將訓練樣本投影到“特征臉”空間,得到一組投影向量Ω=wTu,構成人臉識別的數據庫。在識別時,先將每一幅待識別的人臉圖像投影到“特征臉”空間,再利用最鄰近分類器比較其與庫中人臉的位置,從而識別出該圖像是否是庫中的人臉,如果是,是哪一幅人臉。
以下為運行結果圖:
圖 1-2人臉定位圖
圖1-3人臉檢測
不過該算法具有局限性,對于多張人臉基本上就不能準確定位如下圖:
圖1-4失敗的人臉定位圖
四、程序源碼
Img = imread('D:\1.jpg');
if ndims(Img) == 3
I=rgb2gray(Img);
else
I = Img;
end
BW = im2bw(I, graythresh(I)); % 二值化
figure;
imshow(Img)
title('原圖像');
hold on;
[xt, yt] = meshgrid(round(linspace(1, size(I, 1), 10)), ...
round(linspace(1, size(I, 2), 10)));
mesh(yt, xt, zeros(size(xt)), 'FaceColor', ...
'None', 'LineWidth', 3, ...
'EdgeColor', 'r');
imshow(BW)
title('二值圖像');
[n1, n2] = size(BW);
r = floor(n1/10); % 分成10塊,行
c = floor(n2/10); % 分成10塊,列
x1 = 1; x2 = r; % 對應行初始化
s = r*c; % 塊面積
for i = 1:10
y1 = 1; y2 = c; % 對應列初始化
y1 = y1+c; % 列跳躍
y2 = y2+c; % 列跳躍
end
x1 = x1+r; % 行跳躍
x2 = x2+r; % 行跳躍
end
[L, num] = bwlabel(BW, 8); % 區域標記
stats = regionprops(L, 'BoundingBox'); % 得到包圍矩形框
Bd = cat(1, stats.BoundingBox);
[s1, s2] = size(Bd);
mx = 0;
for k = 1:s1
p = Bd(k, 3)*Bd(k, 4); % 寬*高
if p>mx && (Bd(k, 3)/Bd(k, 4))<1.8
% 如果滿足面積塊大,而且寬/高<1.8
mx = p;
j = k;
end
end
imshow(I); hold on;
rectangle('Position', Bd(j, :), ...
'EdgeColor', 'r', 'LineWidth', 3);
title('標記圖像');
CreateDatabase.m
function T = CreateDatabase(TrainDatabasePath)
%函數功能:把二維圖像變為一維列向量用于構造T
%參數TrainDatabasePath是訓練集路徑
%返回值T是一個二維矩陣,若有P張M*N的圖像,則T為M*N行P列的矩陣
TrainFiles = dir(TrainDatabasePath);%訓練集路徑
Train_Number = 0;%訓練集中圖片數量初值
for i = 1:size(TrainFiles,1) % 目錄中除圖片本身外,還保存有(.|..|Thnmbs.db)
ifnot(strcmp(TrainFiles(i).name,'.')|strcmp(TrainFiles(i).name,'..')|strcmp(TrainFiles(i).name,'Thumbs.db'))
temp = reshape(img,irow*icol,1);%將二維圖片轉為一維向量
T = [T temp]; % 每張圖片的信息做為T的一列
end
EigenfaceCore.m
function [m, A, Eigenfaces] = EigenfaceCore(T)
% 用PCA原理決定人臉圖像的最優特征,得到一個二維矩陣,包含訓練圖像向量,返回三個輸出
% 參數:T包含訓練集中所有的圖像信息集合,
% 返回值:m:(M*Nx1)訓練均值;Eigenfaces:(M*Nx(P-1))訓練集協方差矩陣的特征向量;A:(M*NxP) 每一張圖像與均值圖像的方差矩陣
m = mean(T,2); % 平均圖像/行平均(每一副圖像的對應象素求平均)m=(1/P)*sum(Tj's) (j=1 : P)
Train_Number = size(T,2);%列數
%計算機每一張圖片到均值圖像的方差
A = [];
for i = 1 : Train_Number%對每一列
temp = double(T(:,i))-m; %每一張圖與均值的差異
A = [A temp]; %方差矩陣
end
%降維
L = A'*A; % L是協方差矩陣C=A*A'的轉置.
[V D] = eig(L); %對角線上的元素是L|C的特征值.V:以特征向量為列的滿秩矩陣,D:特征值對角矩陣。即L*V = V*D.
L_eig_vec = [];%特征值向量
for i = 1 : size(V,2)%對每個特征向量
if( D(i,i)>1 )%特征值大于1時
L_eig_vec = [L_eig_vec V(:,i)];%集中對應的特征向量
end
end
Eigenfaces = A * L_eig_vec; % 計算機協方差矩陣C的特征向量,得到降維了的特征,A為每一張圖像與均值圖像的方差構成的矩陣
Recognition.m
function OutputName = Recognition(TestImage, m, A, Eigenfaces)
ProjectedImages = [];%映射圖像
Train_Number = size(Eigenfaces,2);%列,降維后,
for i = 1 : Train_Number%對于每一個訓練特征
temp = Eigenfaces'*A(:,i);
ProjectedImages = [ProjectedImages temp]; %得到 L_eig_vec;
end
InputImage = imread(TestImage);%讀入測試圖片
temp = rgb2gray(InputImage);%取其中的一維來處理
ProjectedTestImage = Eigenfaces'*Difference; % 測試圖像的特征向量
Euc_dist = [];
for i = 1 : Train_Number%對每列
q = ProjectedImages(:,i);%取出訓練圖像
temp = ( norm( ProjectedTestImage - q ) )^2;%歐氏距離
Euc_dist = [Euc_dist temp];%
end
[Euc_dist_min , Recognized_index] = min(Euc_dist);%得到差值最小的圖像的索引號
OutputName = strcat(int2str(Recognized_index),'.jpg');%得到文件名
% You can customize and fix initial directory paths
TrainDatabasePath = uigetdir('D:\人臉庫\PCA_based Face Recognition System',...
'Select training database path' );
TestDatabasePath = uigetdir('D:\人臉庫\\PCA_based Face Recognition System',...
'Select test database path');
prompt = {'Enter test image name (a number between 1 to 10):'};
dlg_title = 'Input of PCA-Based Face Recognition System';
num_lines= 1;
def = {'1'};
TestImage = inputdlg(prompt,dlg_title,num_lines,def);
TestImage = strcat(TestDatabasePath,'\',char(TestImage),'.jpg');
im = imread(TestImage);
T = CreateDatabase(TrainDatabasePath);
[m, A, Eigenfaces] = EigenfaceCore(T);
OutputName = Recognition(TestImage, m, A, Eigenfaces);
SelectedImage = strcat(TrainDatabasePath,'\',OutputName);
SelectedImage = imread(SelectedImage);
imshow(im)
title('測試圖像');
figure,imshow(SelectedImage);
title('識別圖像');
str = strcat('Matched image is : ',OutputName);
disp(str)
總結
以上是生活随笔為你收集整理的MATLAB人脸识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springmvc-带预览的异步上传图片
- 下一篇: Python整理PEER所下载的地震波源