基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