数字图象处理
Ⅰ实验题目:基于matlab的人脸识别
Ⅱ实验内容:
一:研究背景
随着人工智能技术的兴起,以及人类视觉研究的进展,人们逐渐对人脸图像的机器识别投入很大的热情,并形成了一个人脸图像识别研究领域,这一领域除了它的重大理论价值外,也极具实用价值。
如同人的指纹一样,人脸也具有唯一性,也可用来鉴别一个人的身份。人脸图像的自动识别系统较之指纹识别系统、DNA鉴定等更具方便性,开发研究的实际意义更大。然而人脸图像受很多因素的干扰,给识别带来很大难度。国外对于人脸图像识别的研究较早,现己有实用系统面世,只是对于成像条件要求较苛刻,应用范围也就较窄,国内也有许多科研机构从事这方而的研究,并己取得许多成果。
- 应用前景
人脸图像识别除了具有重大的理论价值以及极富挑战性外,还其有许多潜在的应用前景,利用人脸图像来进行身份验证,可以不与目标相接触就取得样本图像,而其它的身份验证手段,如指纹、眼睛虹膜等必须通过与目标接触或相当接近来取得样木,在某些场合,这些识别手段就会有不便之处。
就从目前和将来来看,可以预测到人脸图像识别将具有广阔的应用前景,如表中所列举就是其中已经实现或逐步完善的应用。
![v2-706768de3978defec0cabb502c7fa7e2_b.jpg](https://img-blog.csdnimg.cn/img_convert/8383b9bf465a0052a87163e7acc49e32.png)
- 框架
图像获取
人脸定位
图像预处理
人脸识别
(1)人脸图像的获取
一般来说,图像的获取都是通过摄像头摄取,但摄取的图像可以是真人,也可以是人脸的图片或者为了相对简单,可以不考虑通过摄像头来摄取头像,而是直接给定要识别的图像。
(2)人脸的检测
人脸检测的任务是判断静态图像中是否存在人脸。若存在人脸,给出其在图像中的坐标位置、人脸区域大小等信息。而人脸跟踪则需要进一步输出所检测到的人脸位置、大小等状态随时间的连续变化情况。
(3)特征提取
通过人脸特征点的检测与标定可以确定人脸图像中显著特征点的位置(如眼睛、眉毛、鼻子、嘴巴等器官),同时还可以得到这些器官及其面部轮廓的形状信息的描述。根据人脸特征点检测与标定的结果,通过某些运算得到人脸特征的描述。
(4)基于人脸图像比对的身份识别
通过将输入人脸图像与人脸数据库中的所有已知原型人脸图像计算相似度并对其排序来给出输入人脸的身份信息。这包括两类识别问题:一类是闭集人脸识别问题,即假定输入的人脸一定是人脸库中的某个个体;另一类是开集识别,即首先要对输入人脸是否在已知人脸库中做出判断,如果是,则给出其身份。
(5)基于人脸图像比对的身份验证
即人脸确认问题。系统在输入人脸图像的同时输入一个用户宣称的该人脸的身份信息,系统要对该输入人脸图像的身份与宣称的身份是否相符作出判断。
四、人脸定位
对人脸图像打上网格,对区域块图像做二值分析,通过像素比例来做处理,进而得到人脸区域。
在彩色图像中,颜色是人脸表面最为显著的特征之一,利用颜色检测人脸是很自然的想法。研究人员在考察了不同种族、不同个体的肤色后,认为人类的肤色能在颜色空间中聚成单独的一类,而影响肤色值变化的最主要因素是亮度变化。因此他们采用广泛使用的RGB颜色空间,在滤去亮度值的图像中通过比较像素点的r、g值与肤色范围来推断该像素点及其邻域是否属于人脸区域。除了RGB颜色空间,还有诸如HIS,LUV,GLHS等其它颜色空间被使用。寻找到肤色区域后,必须进行验证,排除类肤色区域。利用肤色像素的连通性分割出区域,使用椭圆拟合各个区域,根据椭圆长短轴的比率判断是否为人脸。
- 图像预处理
①滤波去噪:空域滤波按照空域滤波器的功能又可分为平滑滤波器和锐化滤波器。平滑滤波器可以用低通滤波实现,目的在于模糊图像或消除噪声;锐化滤波器是用高通滤波来实现,目的在于强调图像被模糊的细节。
②灰度变换:有多种方法可以实现图像的灰度变换,其中最常用的就是直方图变换的方法,即直方图的均衡化。这种方法是一种使输出图像直方图近似服从均匀分布的变换算法。
③边缘检测:数字图像的边缘检测是图像分割、目标区域识别、区域形状提取等图像分析领域十分重要的基础,也是图像识别中提取图像特征的一个重要属性。边缘检测算子可以检查每个像素的邻域并对灰度变化率进行量化,也包括对方向的确定,其中大多数是基于方向导数掩模求卷积的方法。常用的有Sobel算子,Prewitt算子,Roberts算子,Log算子等。
六、人脸识别
通过判别图像中所有可能区域是否属于“人脸模式”的方法来实现人脸检测。这类方法有:特征脸法、人工神经网络法、支持向量机法;积分图像法。
①特征脸法(PCA):把单个图像看成一维向量,众多的一维向量形成了人脸图像特征空间,再将其变换到一个新的相对简单的特征空间,通过计算矩阵的特征值和特征向量,利用图像的代数特征信息,寻找“人脸”、“非人脸”两种模式在该特征空间中的分布规律。
②人工神经网络(ANN)法:通过训练一个网络结构,把模式的统计特性隐含在神经网络的结构和参数之中。基于人工神经网络的方法对于复杂的、难以显式描述的模式,具有独特的优势。
③支撑向量机(SVM)法:在统计学习理论基础上发展出的一种新的模式识别方法,它基于结构风险最小化的原理,较之于基于经验风险最小化的人工神经网络,一些难以逾越的问题,如:模型选择和过学习问题、非线性和维数灾难问题、局部极小点问题等都得到了很大程度上的解决。但是直接使用SVM方法进行人脸识别有两方面的困难:第一,训练时需要求解二次规划问题计算复杂度高,内存需求量巨大;第二,在非人脸样本不受限制时,需要极大规模的训练集合,得到的支持向量会很多,使得分类器的计算量过高。
④基于积分图像特征的人脸检测方法:是Viola等新近提出的一种算法,它综合使用了积分图像描述方法、Adaboost学习算法及训练方法、级联弱分类器。
Ⅲ实验方法——特征脸法(PCA)
传统主成成份分析方法的基本原理是:利用K-L变换抽取人脸的主要成分,构成特征脸空间,识别时将测试图像投影到此空间,得到一组投影系数,通过与各个人脸图像比较进行识别。
对于一幅M*N的人脸图像,将其每列相连构成一个大小为D=M*N维的列向量。D就是人脸图像的维数,即是图像空间的维数。
设n是训练样本的数目;Xj表示第j幅人脸图像形成的人脸向量,则所需样本的协方差矩阵为:
![v2-f91ec3bbdcd975657b36f823e3e154f4_b.jpg](https://img-blog.csdnimg.cn/img_convert/01d9184bd6134ff26c283803e6789c26.png)
其中U为训练样本的平均图像向量:
![v2-9571617c4160ad2f4562ac518803ffa7_b.jpg](https://img-blog.csdnimg.cn/img_convert/93735e443706a63b4fa3393fc9f69698.png)
令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为:
![v2-e6310262a60e175f4a9139a698de07eb_b.jpg](https://img-blog.csdnimg.cn/img_convert/74e04a7a0921710c48f2dca61c5939e6.png)
则“特征脸”空间为:w=(U1,U2,...,Un)
将训练样本投影到“特征脸”空间,得到一组投影向量Ω=wTu,构成人脸识别的数据库。在识别时,先将每一幅待识别的人脸图像投影到“特征脸”空间,再利用最邻近分类器比较其与库中人脸的位置,从而识别出该图像是否是库中的人脸,如果是,是哪一幅人脸。
Ⅳ实验代码
Img = imread('c:\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; % 对应列初始化
for j = 1:10
if (y2<=c || y2>=9*c) || (x1==1 || x2==r*10)
% 如果是在四周区域
loc = find(BW(x1:x2, y1:y2)==0);
[p, q] = size(loc);
pr = p/s*100; % 黑色像素所占的比例数
if pr <= 100
BW(x1:x2, y1:y2) = 0;
end
end
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)
if not(strcmp(TrainFiles(i).name,'.')|strcmp(TrainFiles(i).name,'..')|strcmp(TrainFiles(i).name,'Thumbs.db'))
Train_Number = Train_Number + 1; %统计训练集中的图片,
end
end
T = [];
for i = 1 : Train_Number %对每一张图片
str = strcat('\',int2str(i),'.jpg');%字符串拼接,得到\i.jpg
str = strcat(TrainDatabasePath,str);%字符串拼接,得到每一张训练图片的完整路径。
img = imread(str);%读入训练图片
img = rgb2gray(img);%转为灰度
[irow icol] = size(img);%得到图片大小
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);%取其中的一维来处理
[irow icol] = size(temp);%测试图片大小
InImage = reshape(temp,irow*icol,1);%转置后转为一维
Difference = double(InImage)-m; % L_eig_vec'
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');%得到文件名
Example.m
% A sample script, which shows the usage of functions, included in
% PCA-based face recognition system (Eigenface method)
%
% See also: CREATEDATABASE, EIGENFACECORE, RECOGNITION
% Original version by Amir Hossein Omidvarnia, October 2007
% Email: aomidvar@ece.ut.ac.ir
clear all
clc
close all
% You can customize and fix initial directory paths
TrainDatabasePath = uigetdir('D:\Matlab编程实例\pca和fisher算法用于人脸识别\PCA_based Face Recognition System',...
'Select training database path' );
TestDatabasePath = uigetdir('D:\Matlab编程实例\pca和fisher算法用于人脸识别\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('Test Image');
figure,imshow(SelectedImage);
title('Equivalent Image');
str = strcat('Matched image is : ',OutputName);
disp(str)
Ⅴ实验截图
![v2-43f4ad13099a1415812b111e43c8d50c_b.jpg](https://img-blog.csdnimg.cn/img_convert/3d33de640d7e319a1cdcfaf646a65ae1.png)
![v2-c2c6ad612ed1bd15b155962e9d2f401b_b.jpg](https://img-blog.csdnimg.cn/img_convert/cebece34a65fec89587a1e112d4b0854.png)
![v2-1ee6389981b71f9a80f92b13380838cd_b.jpg](https://img-blog.csdnimg.cn/img_convert/f7cf138f28cfa6a51b7c6465e3ddbaa2.png)
![v2-e971361bf12ba29722a3290898a3caaf_b.jpg](https://img-blog.csdnimg.cn/img_convert/b83a072c47f27392f96cd5ca7888fc9a.png)
总结
人脸识别的优势在于其自然性和不被被测个体察觉的特点。
人脸识别的困难主要是人脸作为生物特征的特点所带来的。
相似性:不同个体之间的区别不大,所有的人脸的结构都相似,甚至人脸器官的结构外形都很相似。这样的特点对于利用人脸进行定位是有利的,但是对于利用人脸区分人类个体是不利的。
易变性:人脸的外形很不稳定,人可以通过脸部的变化产生很多表情,而在不同观察角度,人脸的视觉图像也相差很大,另外人脸识别还受光照条件、人脸的很多遮盖物、年龄等多方面因素的影响。
特征脸算法(PCA)使得压缩前后的均方误差最小,且变换后的低维空间有很好的分辨能力,但是在种方法在处理人脸图像时,要将二维图像矩阵转换成一维的列向量,使图像的维数达到上万维,计算工作量非常大,特征提取速度慢。
为了克服传统PCA的不足,研究者们相继提出了二维PCA(2DPCA)方法、PCA+2DPCA等一些方法。
这些方法的提出不仅有效地解决了图像处理的高维问题,而且大大提高了人脸的识别率。
通过本学期对数字图象处理课程的学习,是我对数字图像处理领域有了一定的了解与体会,熟悉了图像处理的流程与方式方法,加深了我对数字领域的理解。通过matlab实验,是我对matlab应用有了更进一步的掌握与学习,为下一步学习打下了良好的基础。