1. 程式人生 > 實用技巧 >基matlab的人臉識別系統設計與模擬

基matlab的人臉識別系統設計與模擬

由Math Work公司開發的Matlab語言語法限制不嚴格,程式設計自由度大,程式的可移植性好。Matlab還推出了功能強大的適應於影象分析和處理的工具箱,常用的有影象處理工具箱、小波分析工具箱及數字訊號處理工具箱。利用這些工具箱,我們可以很方便的從各個方面對影象的性質進行深入的研究。Matlab影象處理工具箱支援索引影象、RGB影象、灰度影象、二進位制影象並能操作.bmp、.jpg、.tif等多種影象格式檔案。

2.2 數字影象處理及過程

影象是人類獲取資訊、表達資訊和傳遞資訊的重要手段。利用計算機對影象進行去除噪聲、增強、復原、分割、提取特徵等的理論、方法和技術稱為數字影象處理。數字影象處理技術已經成為資訊科學、電腦科學、工程科學、地球科學等諸多方面的學者研究影象的有效工具。數字影象處理主要包括影象變換、影象增強、影象編碼、影象復原、影象重建、影象識別以及影象理解等內容。

2.2.1影象處理的基本操作

讀取和顯示影象可以通過imread()和imshow()來實現;影象的輸出用imwrite()函式就可以很方便的把影象輸出到硬碟上;另外還可以用imcrop()、imrisize()、imrotate()等來實現影象的裁剪、縮放和旋轉等功能。

2.2.2影象型別的轉換

Matlab支援多種影象型別,但在某些影象操作中,對影象的型別有要求,所以要涉及到對影象型別進行轉換。Matlab7.0影象處理工具箱為我們提供了不同影象型別相互轉換的大量函式,如mat2gray()函式可以將矩陣轉換為灰度影象,rgb2gray()轉換RGB影象或顏色映像表為灰度影象。在型別轉換的時候,我們還經常遇到資料型別不匹配的情況,針對這種情況,Matlab7.0工具箱中,也給我們提供了各種資料型別之間的轉換函式,如double()就是把資料轉換為雙精度型別的函式。

2.2.3影象增強

影象增強的目的是為了改善影象的視覺效果,提高影象的清晰度和工藝的適應性,以及便於人與計算機的分析和處理,以滿足影象複製或再現的要求。影象增強的方法分為空域法和頻域法兩大類,空域法主要是對影象中的各個畫素點進行操作;而頻域法是在影象的某個變換域內對整個影象進行操作,並修改變換後的係數,如傅立葉變換、DCT變換等的係數,然後再進行反變換,便可得到處理後的影象。下面以空域增強法的幾種方法加以說明。

(1).灰度變換增強

有多種方法可以實現影象的灰度變換,其中最常用的就是直方圖變換的方法,即直方圖的均衡化。這種方法是一種使輸出影象直方圖近似服從均勻分佈的變換演算法。Matlab7.0影象處理工具箱中提供了影象直方圖均衡化的具體函式histeq(),同時我們可以用函式imhist()函式來計算和顯示影象的直方圖。

(2).空域濾波增強

空域濾波按照空域濾波器的功能又可分為平滑濾波器和銳化濾波器。平滑濾波器可以用低通濾波實現,目的在於模糊影象或消除噪聲;銳化濾波器是用高通濾波來實現,目的在於強調影象被模糊的細節。在Matlab中,各種濾波方法都是在空間域中通過不同的濾波運算元實現,可用fspecial()函式來建立預定義的濾波運算元,然後可以使用imfilter()或filter2()函式呼叫建立好的濾波器對影象進行濾波。

2.2.4邊緣檢測

數字影象的邊緣檢測是影象分割、目標區域識別、區域形狀提取等影象分析領域十分重要的基礎,也是影象識別中提取影象特徵的一個重要屬性。邊緣檢測運算元可以檢查每個畫素的鄰域並對灰度變化率進行量化,也包括對方向的確定,其中大多數是基於方向導數掩模求卷積的方法。常用的有Sobel運算元,Prewitt運算元,Roberts運算元,Log運算元等。Matlab7.0工具箱中提供的edge()函式可以進行邊緣檢測,在其引數裡面,可以根據需要選擇合適的運算元及其引數。

2.3影象處理功能的Matlab實現例項

本文通過運用影象處理工具箱的有關函式對一人臉的彩色影象進行處理。

1)影象型別的轉換

因後面的影象增強,邊緣檢測都是針對灰度影象進行的,而我們的原圖是RGB影象,所以首先我們要對原圖型別進行轉換。實現過程程式碼如下:

i=imread('f:\face1.jpg');j=rgb2gray(i);

imshow(j);imwrite(j,'f:\face1.tif')

2)影象增強

(1)灰度影象直方圖均衡化

通過比較原圖和直方圖均衡化後的影象可見,影象變得更清晰,而且均衡化後的直方圖比原直方圖的形狀更理想。該部分的程式程式碼如下:

i=imread('f:\face1.tif');

j=histeq(i);imshow(j);

figure,subplot(1,2,1),imhist(i);

subplot(1,2,2),imhist(j)

(2)灰度影象平滑與銳化處理

平滑濾波器的目的在於模糊影象或消除噪聲,Matlab7.0影象處理工具箱提供了medfilter2()函式用於實現中值濾波,wiener2()實現對影象噪聲的自適應濾波。在本文例項中,為了使濾波效果更明顯,我們事先為影象認為增加濾波,然後用自適應濾波方法對影象進行濾波。銳化處理的目的在於強調影象被模糊的細節,在本例項中採用了預定義高斯濾波器的方法對影象進行銳化濾波。功能實現的程式碼如下:

i=imread('f:\fae1.tif');

j=imnoise(i,'guassian',0,0.02);

subplot(1,2,1),imshow(j);

j1=wiener2(j);subplot(1,2,2),imshow(j1);

h=fspecial('gaussian',2,0.05);j2=imfilter(i,h);figure,subplot(1,2,1),imshow(i)

subplot(1,2,2),imshow(j2)


3)邊緣檢測

Matlab7.0影象處理工具箱提供了edge()函式實現邊緣檢測,還

有各種方法運算元供選擇,在本例項中採用了canny運算元來進行邊緣檢

測,

程式程式碼如下:

i=imread('f:face.tif');

j=edge(i,'canny',[0.04,0.25],1.5);

imshow(j)

計算機人臉識別是一個非常活躍的研究領域,因其在公安刑偵破案、銀行密碼系統、計算機安全系統以及動態監視系統等方面都有廣泛應用,已成為當前模式識別、計算機視覺領域的研究熱點。人臉識別系統一般包括人臉檢測與定位、人臉影象預處理、特徵提取和匹配識別四個組成部分。其中,人臉影象預處理,作為特徵提取和識別的前提步驟,是計算機人臉識別系統中的必要環節。其目的是在去除噪聲,加強有用資訊,對輸入裝置或其他因素造成的退化現像進行復原,為後續的特徵提取和識別作準備。

不同的人臉識別系統根據其採用的影象來源和識別演算法需要不同,採用的預處理方法也不同。常用的人臉影象預處理方法有:濾波去噪、灰度變換、影象二值化、邊緣檢測、尺寸歸一化、灰度歸一化等。用在同一系統中的可能只有其中一種或幾種預處理方法,但一旦庫中採集到的原始影象質量發生較大變化(如人臉大小、光照強度、拍攝條件、成像系統等方面變化),原有的預處理模組便不能滿足特徵提取的需要,還要更新,這是極不方便的。

鑑於此,作者在總結分析了灰度變換、濾波去噪、邊緣檢測三種廣泛應用於不同人臉識別系統中的預處理方法基礎上,設計了一個通用的人臉影象預處理模擬系統。該系統可對不同條件下的原始影象進行相應的預處理。如,使用者可根據需要選擇使用不同的濾波方法去除噪聲、不同的邊緣檢測運算元檢測人臉邊緣、選擇不同的灰度變換演算法實現影象的灰度校正和灰度歸一化,模擬系統同時還實現了尺寸歸一化、二值化等其他常用的影象預處理演算法。

3.2系統基本機構

人臉識別是一個複雜的過程,一個計算機人臉識別的流程如圖3-1所示。它包括幾個步驟:對採集到的影象,首先進行人臉檢測(在輸入影象中尋找人臉),給出人臉有無的結果;然後進行人臉定位,確定人臉的位置並提取出來。對人臉的定位在輸入是影象序列時一般也稱之為人臉跟蹤。通常檢測和定位結合進行。對提取出來的人臉藉助人臉描述就可以進行(狹義的)人臉識別,即通過提取特徵來確定其身份。

圖3.1 基本框架圖

3.3 人臉檢測定位演算法

人臉檢測定位演算法大致可分為兩大類:基於顯式特徵的方法和基於隱式特徵的方法。

所謂顯式特徵是指對人類肉眼來說直觀可見的特徵,如膚色、臉部輪廓、臉部結構等。基於顯式特徵的方法是指由人通過肉眼觀察,總結出人臉區別於“非人臉”區域的特徵,然後根據被檢測區域是否滿足這些“人臉特徵”,來判定該區域是否包含人臉。根據所選擇的“人臉特徵”,基於顯式特徵的方法分以下三類:基於膚色模型的方法、模板匹配的方法、基於先驗知識的方法。

在彩色影象中,顏色是人臉表面最為顯著的特徵之一,利用顏色檢測人臉是很自然的想法。Yang等在考察了不同種族、不同個體的膚色後,認為人類的膚色能在顏色空間中聚成單獨的一類,而影響膚色值變化的最主要因素是亮度變化。因此他們採用廣泛使用的RGB顏色空間,在濾去亮度值的影象中通過比較畫素點的r、g值與膚色範圍來推斷該畫素點及其鄰域是否屬於人臉區域。除了RGB顏色空間,還有諸如HIS,LUV,GLHS等其它顏色空間被使用。尋找到膚色區域後,必須進行驗證,排除類膚色區域。Yoo等利用膚色畫素的連通性分割出區域,使用橢圓擬合各個區域,根據橢圓長短軸的比率判斷是否為人臉。

模板匹配的方法一般是人為地先定義一個標準人臉模板,計算輸入影象與模板的似然度;然後,確定一個似然度閾值,用以判斷該輸入影象中是否包含人臉。標準人臉模板可以是固定的樣板,也可以是帶參變數的曲線函式。

基於先驗知識的方法則採用符合人臉生理結構特徵的人臉鑲嵌圖(mosaic image)模型,並在分析了足夠多的人臉影象樣本的基礎上,針對人臉的灰度、邊緣、紋理等資訊,建立一種關於人臉的知識庫。在檢測中,首先抽取這些灰度、邊緣等資訊,然後檢驗它是否符合知識庫中關於人臉的先驗知識。

以上三種方法的優缺點比較見表3-1。

附錄 人臉識別matlab程式

function varargout = FR_Processed_histogram(varargin)

%這種演算法是基於直方圖處理的方法

%The histogram of image is calculated and then bin formation is done on the

%basis of mean of successive graylevels frequencies. The training is done on odd images of 40 subjects (200 images out of 400 images)

%The results of the implemented algorithm is 99.75 (recognition fails on image number 4 of subject 17)

gui_Singleton = 1;

gui_State = struct('gui_Name', mfilename, ...

'gui_Singleton', gui_Singleton, ...

'gui_OpeningFcn', @FR_Processed_histogram_OpeningFcn, ...

'gui_OutputFcn', @FR_Processed_histogram_OutputFcn, ...

'gui_LayoutFcn', [] , ...

'gui_Callback', []);

if nargin && ischar(varargin{1})

gui_State.gui_Callback = str2func(varargin{1});

end

if nargout

[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

else

gui_mainfcn(gui_State, varargin{:});

end

% End initialization code - DO NOT EDIT

%--------------------------------------------------------------------------

% --- Executes just before FR_Processed_histogram is made visible.

function FR_Processed_histogram_OpeningFcn(hObject, eventdata, handles, varargin)

% This function has no output args, see OutputFcn.

% hObject handle to figure

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% varargin command line arguments to FR_Processed_histogram (see VARARGIN)

% Choose default command line output for FR_Processed_histogram

handles.output = hObject;

% Update handles structure

guidata(hObject, handles);

% UIWAIT makes FR_Processed_histogram wait for user response (see UIRESUME)

% uiwait(handles.figure1);

global total_sub train_img sub_img max_hist_level bin_num form_bin_num;

total_sub = 40;

train_img = 200;

sub_img = 10;

max_hist_level = 256;

bin_num = 9;

form_bin_num = 29;

%--------------------------------------------------------------------------

% --- Outputs from this function are returned to the command line.

function varargout = FR_Processed_histogram_OutputFcn(hObject, eventdata, handles)

% varargout cell array for returning output args (see VARARGOUT);

% hObject handle to figure

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure

varargout{1} = handles.output;

%--------------------------------------------------------------------------

% --- Executes on button press in train_button.

function train_button_Callback(hObject, eventdata, handles)

% hObject handle to train_button (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

global train_processed_bin;

global total_sub train_img sub_img max_hist_level bin_num form_bin_num;

train_processed_bin(form_bin_num,train_img) = 0;

K = 1;

train_hist_img = zeros(max_hist_level, train_img);

for Z=1:1:total_sub

for X=1:2:sub_img %%%train on odd number of images of each subject

I = imread( strcat('ORL\S',int2str(Z),'\',int2str(X),'.bmp') );

[rows cols] = size(I);

for i=1:1:rows

for j=1:1:cols

if( I(i,j) == 0 )

train_hist_img(max_hist_level, K) = train_hist_img(max_hist_level, K) + 1;

else

train_hist_img(I(i,j), K) = train_hist_img(I(i,j), K) + 1;

end

end

end

K = K + 1;

end

end

[r c] = size(train_hist_img);

sum = 0;

for i=1:1:c

K = 1;

for j=1:1:r

if( (mod(j,bin_num)) == 0 )

sum = sum + train_hist_img(j,i);

train_processed_bin(K,i) = sum/bin_num;

K = K + 1;

sum = 0;

else

sum = sum + train_hist_img(j,i);

end

end

train_processed_bin(K,i) = sum/bin_num;

end

display ('Training Done')

save 'train' train_processed_bin;

%--------------------------------------------------------------------------

% --- Executes on button press in Testing_button.

function Testing_button_Callback(hObject, eventdata, handles)

% hObject handle to Testing_button (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

global train_img max_hist_level bin_num form_bin_num;

global train_processed_bin;

global filename pathname I

load 'train'

test_hist_img(max_hist_level) = 0;

test_processed_bin(form_bin_num) = 0;

[rows cols] = size(I);

for i=1:1:rows

for j=1:1:cols

if( I(i,j) == 0 )

test_hist_img(max_hist_level) = test_hist_img(max_hist_level) + 1;

else

test_hist_img(I(i,j)) = test_hist_img(I(i,j)) + 1;

end

end

end

[r c] = size(test_hist_img);

sum = 0;

K = 1;

for j=1:1:c

if( (mod(j,bin_num)) == 0 )

sum = sum + test_hist_img(j);

test_processed_bin(K) = sum/bin_num;

K = K + 1;

sum = 0;

else

sum = sum + test_hist_img(j);

end

end

test_processed_bin(K) = sum/bin_num;

sum = 0;

K = 1;

for y=1:1:train_img

for z=1:1:form_bin_num

sum = sum + abs( test_processed_bin(z) - train_processed_bin(z,y) );

end

img_bin_hist_sum(K,1) = sum;

sum = 0;

K = K + 1;

end

[temp M] = min(img_bin_hist_sum);

M = ceil(M/5);

getString_start=strfind(pathname,'S');

getString_start=getString_start(end)+1;

getString_end=strfind(pathname,'\');

getString_end=getString_end(end)-1;

subjectindex=str2num(pathname(getString_start:getString_end));

if (subjectindex == M)

axes (handles.axes3)

%image no: 5 is shown for visualization purpose

imshow(imread(STRCAT('ORL\S',num2str(M),'\5.bmp')))

msgbox ( 'Correctly Recognized');

else

display ([ 'Error==> Testing Image of Subject >>' num2str(subjectindex) ' matches with the image of subject >> ' num2str(M)])

axes (handles.axes3)

%image no: 5 is shown for visualization purpose

imshow(imread(STRCAT('ORL\S',num2str(M),'\5.bmp')))

msgbox ( 'Incorrectly Recognized');

end

display('Testing Done')

%--------------------------------------------------------------------------

function box_Callback(hObject, eventdata, handles)

% hObject handle to box (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of box as text

% str2double(get(hObject,'String')) returns contents of box as a double

%--------------------------------------------------------------------------

% --- Executes during object creation, after setting all properties.

function box_CreateFcn(hObject, eventdata, handles)

% hObject handle to box (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.

% See ISPC and COMPUTER.

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))

set(hObject,'BackgroundColor','white');

end

%--------------------------------------------------------------------------

% --- Executes on button press in Input_Image_button.

function Input_Image_button_Callback(hObject, eventdata, handles)

% hObject handle to Input_Image_button (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

global filename pathname I

[filename, pathname] = uigetfile('*.bmp', 'Test Image');

axes(handles.axes1)

imgpath=STRCAT(pathname,filename);

I = imread(imgpath);

imshow(I)

%--------------------------------------------------------------------------

% --- Executes during object creation, after setting all properties.

function axes3_CreateFcn(hObject, eventdata, handles)

% hObject handle to axes3 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles empty - handles not created until after all CreateFcns called

% Hint: place code in OpeningFcn to populate axes3

%Programmed by Usman Qayyum