超经典数字图像处理案例分享快来看,学习干货

MATLAB人脸识别

  1. 课题介绍

人脸识别是一门新兴的科研项目,起始于上个世纪60年代。经过几十年的发展,现已成为一项最有上升潜力的人体特征识别技术。具有广泛的应用前景,它的工作原理是借由的生物特征来确认生物个体,利用MATLAB软件实现人脸信息的检测、定位与识别,在输入的整幅图像中寻找人脸区域,把图像分割成两个部分——人脸区域和非人脸区域,从而为后续的应用作准备。PCA法实现人脸边缘检测,确定其分布范围,设定门限阀值,实现人脸区域与非人脸区域的分割。再结合长宽比、目标面积等计算方法在图像中分割出人脸区域,经试验该方法能较为精确地定位单人脸图像,对多人脸图像定位不准确。

  1. 图像处理的Matlab实现

人脸识别是图像识别的一个重要分支,其基本结构如图所示。为了保证人脸的位置一致性,在一定程度上克服了背景、头发等冗余信息的干扰,首先要对人脸库中的图像进行一些预处理操作。紧接着,进行特征抽取,将得到的人脸特征和训练样本进行对比,根据相似程序的高低决定最后的识别结果。

超经典数字图像处理案例分享快来看,学习干货_第1张图片
图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幅人脸图像形成的人脸向量,则所需样本的协方差矩阵为:

096d056ba36eef763ec82fcc57d2ca56.png

其中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为:

1ed2fd91617d9f553ae8da62c0a34d60.png

则“特征脸”空间为:w=(U1,U2,...,Un)

将训练样本投影到“特征脸”空间,得到一组投影向量Ω=wTu,构成人脸识别的数据库。在识别时,先将每一幅待识别的人脸图像投影到“特征脸”空间,再利用最邻近分类器比较其与库中人脸的位置,从而识别出该图像是否是库中的人脸,如果是,是哪一幅人脸。

以下为运行结果图:

超经典数字图像处理案例分享快来看,学习干货_第3张图片

超经典数字图像处理案例分享快来看,学习干货_第4张图片
图 1-2人脸定位图

超经典数字图像处理案例分享快来看,学习干货_第5张图片

超经典数字图像处理案例分享快来看,学习干货_第6张图片

超经典数字图像处理案例分享快来看,学习干货_第7张图片
图1-3人脸检测

不过该算法具有局限性,对于多张人脸基本上就不能准确定位如下图:

超经典数字图像处理案例分享快来看,学习干货_第8张图片
图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)

分享结束 有帮助请给安妮赞同哦!

你可能感兴趣的:(人脸识别,算法,计算机视觉,opencv,深度学习)