【人脸识别】基于matlab小波不变矩人脸识别【含Matlab源码 1355期】

举报
海神之光 发表于 2022/05/29 00:51:13 2022/05/29
【摘要】 一、小波不变矩简介 1 引言 人脸识别是目前模式识别与计算机视觉非常活跃的一个研究方向, 它可以广泛应用于公安、交通、银行、商业和海关等部门。人脸识别技术在90年代以来取得了很大的进展, 人们从不同的角...

一、小波不变矩简介

1 引言
人脸识别是目前模式识别与计算机视觉非常活跃的一个研究方向, 它可以广泛应用于公安、交通、银行、商业和海关等部门。人脸识别技术在90年代以来取得了很大的进展, 人们从不同的角度加以研究, 提出了各种各样的算法。这些算法的有效性都依赖于两个方面:特征选择和特征分类。人脸图像由于受光照、表情以及姿态等因素的影响, 同一个人的人脸图像矩阵差异也会比较大。因此, 进行人脸识别时, 所选取的特征必须对这些因素具备一定稳定性和不变性。PCA和LDA是两种有效的特征提取方法, 在人脸识别中有着广泛的应用。“Eigenface” 方法和“Fishferface”方法就是分别以PCA和LDA为基础的。将人脸图像表示成一个列向量, 经过PCA或是LDA变换后, 不仅可以有效的降低其维数, 同时又能保留所需要的识别信息, 这些信息能较好地反应人脸图像的全局特征和局部特征, 对光照、表情以及姿态具有一定的不变性。但是这两种方法存在着一个共同的缺点:即它们的性能在很大程度上取决于人脸定位的精确性, 当定位的误差增大时, 识别率将急剧下降。这一点在很大程度上阻碍了它们在实际场合中的应用。

矩是一种线性特征, 可以用来对区域进行描述。不变矩由于在尺度、平移和旋转等条件下的稳定性被广泛用于模式识别领域。但传统的不变矩方法由于只能用于区别外形差异很大的对象并且高阶矩对噪声等因素敏感, 矩描述子的应用具有一定的局限性。本文提出了一种新颖的不变矩矢量的概念, 并将其应用于人脸识别领域。人脸图像被延伸为一系列同心的圆形图像, 计算这些图像的不变矩φ1, 形成不变矩矢量[φ1 (r1) , φ1 (r2) , …, φ1 (rn) ], 作为人脸图像的特征矢量, 在此基础上进行特征分类。我们利用ORL的人脸数据库进行测试并取得了良好的效果, 实验结果证实了算法的有效性。

2 不变矩与不变矩矢量
在本节中, 我们将在简要回顾矩、不变矩的定义的基础上, 提出不变矩矢量的概念, 并通过实验证明了不变矩矢量对人脸图像描述的有效性。

2.1 不变矩
设f (x, y) 为二维离散图像函数, 其 (p+q) 阶矩定义为
在这里插入图片描述
相应的 (p+q) 阶中心矩为
在这里插入图片描述
用零阶中心矩对其余各阶中心矩进行归一化, 可以得到图像的归一化的中心矩
在这里插入图片描述
为了使矩描述子与平移、大小、旋转等因素无关, Hu提出了一组七个基于二、三阶矩的不变矩
在这里插入图片描述
2.2 不变矩的局限性
研究表明, 只有基于二阶矩的不变矩对二维物体的描述才是真正的与旋转, 平移和尺度无关的。较高阶的矩对于成像过程中的误差, 微小的变形, 摄像机的非线性和摄像机位置的不理想等因素非常敏感。所以相应的不变矩基本上不能用于有效的物体识别。

在Hu[5]的不变矩组中, 只有两个不变矩φ1, φ2是基于二阶矩的, 其余φ3~φ7都是基于三阶矩的。即使是基于二阶矩的不变矩φ1, φ2, 它们只能用来识别外形相差特别大的物体, 否则它们的不变矩的值会因为很相似而不能识别。

2.3 不变矩矢量
在这里插入图片描述
图1 人脸图像及其同心圆系列
为了提高矩描述子的分辨率, 我们提出了一种新颖的基于矩的描述子, 称为不变矩矢量, 其基本原理如图1, 2所示。人脸图像Ω被延伸为一组同心圆图像Ω1, Ω2, …, Ωn。它们的半径r1, r2, …, rn组成一个等差数列。我们选择两个眼睛的中点为同心圆的圆心, 选择从圆心到人脸图像边缘最近的矩离为最大的半径rn, 因此其余的半径可以表示为ri=inrn,i=1,2,⋯,n−1 (如图1所示) 。通过这种方法, 人脸图像就被延伸为一组同心的圆形图像系列 (如图2所示) 。分别计算出这组图像中每个图像的二阶不变矩φ1得到φ1 (r1) , φ1 (r2) , …, φ1 (rn) 。矢量[φ1 (r1) , φ1 (r2) , …, φ1 (rn) ]就可以用来描述原人脸图像Ω的灰度分布, 称为不变矩矢量。
在这里插入图片描述
图2 从人脸图像中衍生的同心圆组

3 人脸识别系统设计
实验所采用的人脸识别系统包括两个步骤:训练和识别部分。在训练阶段, 将训练图像分别表示成不变矩矢量, 并将它们存入样本库。在识别阶段, 首先求得待识别图像的不变矩矢量, 然后将其与样本库中的类别进行比对来完成识别任务。整个系统的模块图如图5所示, 其中不变矩矢量已经在上节所论述, 在这里将着重讨论其它部分。
在这里插入图片描述
图5 人脸识别系统的流程图
3.1 预处理
预处理是信号处理中的一个非常重要的环节。在本实验中, 预处理主要包括灰度归一化, 图像尺寸的调整, 眼睛位置的检测等。灰度归一化将将调整输入图像的灰度均值, 用以消除或者减轻不同光照对识别的影响。

眼睛位置的检测是为了导出不变矩矢量的需要, 两眼位置的中点将作为同心圆序列的原心。在试验中, 我们采用模板匹配的方法来定位眼睛。首先通过求取20幅人眼图像的平均值来得到人眼的模板图像, 然后在有限尺度上进行遍历。对于没能精确定位的人脸图像, 可以采用手工的方法进行修正。

3.2 小波变换
实验表明人的视觉系统是以多尺度的方式来处理视觉所感受的图像。早期的研究显示在人脸图像中, 空间的高频和低频分量所起的作用是不同的。面部表情和微小的遮挡将影响高频分量, 而低频分量在人脸的识别中起着主要的作用。
在这里插入图片描述
图6 人脸图像及其一级小波分解
小波变化可以同时在时域和频域中对信号进行分析, 这点是傅立叶变化等其它的变换所不具备的。在试验中, 我们利用小波变换将人脸图像分解为四个频域的分量。在小波的一级分解中, 可产生一个低频分量LL和三个高频分量LH, HL和HH (如图6所示) 。低频分量LL作为原图像的一个近似, 将用于识别工作的下个步骤, 这样就可以消除或者减少表情因素对人脸识别的影响。

3.3 相似性度量
在模式识别系统中, 相似性的度量是个重要的问题。在试验中, 我们采用欧拉距离来表征两个矢量之间的距离。

二、部分源代码

clc
clear all
close all
warning off
imgsize=[300,300];
[pathstr,~,~]= fileparts(mfilename('fullpath'));
pics1=dir([pathstr,'/faces/*.jpg']);MBS=length(pics1);
stImageSavePath  = strcat(pathstr,'/faceget/');
%%
%图像-读取-预处理-人脸获取—小波提取-Hu不变矩提取-数据库建立
if ~exist('face.mat','file')
disp('数据库生成中');
if MBS > 0                                           %批量读入图片,进行五官检测,再批量检测
for i = 1:MBS
iSaveNum      = int2str(i);
stImagePath   = pics1(i).name;
mImageCurrent = imread(strcat(pathstr,'/faces/',pics1(i).name));%获取人脸
rgb = mImageCurrent;
R=rgb(:,:,1);
G=rgb(:,:,2);
B=rgb(:,:,3);
maxR=im2double(max(max(R)));
maxG=im2double(max(max(G)));
maxB=im2double(max(max(B)));
k=(maxR+maxG+maxB)/3;
if k<0.9
rgb = imadjust(rgb,[0 0 0; k k k],[0 0 0;1 1 1],0.7);
end
myhsv=rgb2hsv(rgb);%对图像进行HSV处理
H=myhsv(:,:,1);
S=myhsv(:,:,2);
V=myhsv(:,:,3);
maxH=im2double(max(max(H)));
maxS=im2double(max(max(S)));
maxV=im2double(max(max(V)));
k=(maxH+maxS+maxV)/3;
if k<0.9
rgb = imadjust(rgb,[0 0 0; k k k],[0 0 0;1 1 1],0.7);
end
mFaceResult   = face_segment(rgb);
mFaceResult = imresize(mFaceResult,imgsize, 'bilinear');%双线性插值方法
imwrite(mFaceResult,strcat(stImageSavePath,iSaveNum,'.bmp')); 
[cA1, cH1, cV1, cD1] = dwt2(mFaceResult, 'haar');%小波分量提取分量
HU(:,i,1)=Humoment(cA1);
% HU(:,i,2)=Humoment(cH1);
% HU(:,i,3)=Humoment(cV1);
% HU(:,i,4)=Humoment(cD1);
end
end
save face.mat; 
disp('数据库建立完毕');
else
disp('已存在一个face.mat的数据库,如需更新将原有数据库删除重新运行本程序即可')
end
%%
%数据库导入Hu不变矩相似度计算-人脸识别
load('face.mat')
disp('已导入数据库');
[~,l,~]=size(HU);
[fn,pn,fi]=uigetfile('*.*','选择图片');%选择图片
face=imread([pn fn]);%读取原始图像
face = imresize(face,imgsize, 'bilinear');%双线性插值方法
[~,~,sizes]=size(face);
if sizes>2
face=rgb2gray(face);%彩色图像装化为二值图像
else
face =face;
end
figure(1);
imshow(face);%彩色原始图像
title('人脸原始图像')
figure(2);
[cA1, cH1, cV1, cD1] = dwt2(face, 'haar');%小波分量提取分量
subplot(221), imshow(cA1, []);title('近似系数')%显示近似系数
subplot(222), imshow(cH1, []);title('水平细节分量')%显示水平细节分量
subplot(223), imshow(cV1, []);title('垂直细节分量')%显示垂直细节分量
subplot(224), imshow(cD1, []);title('对角细节分量')%显示对角细节分量
figure(3)
A1=im2bw(cA1,0.5);
A2=im2bw(cH1,0.5);
A3=im2bw(cV1,0.5);
A4=im2bw(cD1,0.5);
subplot(221), imshow(A1, []);title('近似系数二值化图像')%显示近似系数
subplot(222), imshow(A2, []);title('水平细节分量二值化图像')%显示水平细节分量
subplot(223), imshow(A3, []);title('垂直细节分量二值化图像')%显示垂直细节分量
subplot(224), imshow(A4, []);title('对角细节分量二值化图像')%显示对角细节分量
figure(4);
img2=bwperim(A2);
img3=bwperim(A3);
img4=bwperim(A4);
subplot(221), imshow(A1, []);title('近似系数二值化图像轮廓')%显示近似系数
subplot(222), imshow(A2, []);title('水平细节分量二值化图像轮廓')%显示水平细节分量
subplot(223), imshow(A3, []);title('垂直细节分量二值化图像轮廓')%显示垂直细节分量
subplot(224), imshow(A4, []);title('对角细节分量二值化图像轮廓')%显示对角细节分量
HUtest(:,:,1)=Humoment(cA1).';
HUtest(:,:,2)=Humoment(cH1).';
HUtest(:,:,3)=Humoment(cV1).';
HUtest(:,:,4)=Humoment(cD1).';
for i=1:l
xsd1(i)=norm(abs(log(HUtest(1:7,1,1)))-abs(log(HU(1:7,i,1)))); %与训练样本进行匹配
% xsd2(i)=norm(abs(log(HUtest(1:7,1,2)))-abs(log(HU(1:7,i,2)))); %与训练样本进行匹配
% xsd3(i)=norm(abs(log(HUtest(1:7,1,3)))-abs(log(HU(1:7,i,3)))); %与训练样本进行匹配
% xsd4(i)=norm(abs(log(HUtest(1:7,1,4)))-abs(log(HU(1:7,i,4)))); %与训练样本进行匹配
end
xsd=xsd1;
answer=find(xsd==min(min(xsd)));
[pathstr,name,ext]= fileparts(mfilename('fullpath'));
fname=strcat(pathstr,'\faces\',pics1(answer).name);
fprintf('识别结果为%s\n',fname);
rgb=imread(fname);%
figure(5);
imshow(rgb);
title('识别结果');%显示图像 
%进行人脸检测
function mFaceResult = face_segment(mImageSrc)
%%%%%%%%%%%%%%%%%%%%将灰度图变为三通道图%%%%%%%%%%%%%%%%%%%%
if(size(mImageSrc,3) == 1)
    mImage2detect(:,:,1) = mImageSrc;
    mImage2detect(:,:,2) = mImageSrc;
    mImage2detect(:,:,3) = mImageSrc;
else
    mImage2detect = mImageSrc;
end

%%%%%%%%%%%%%%%%%%%%对图像进行人脸检测%%%%%%%%%%%%%%%%%%%%
FaceDetector               = buildDetector();
[bbox,bbimg,faces,bbfaces] = detectFaceParts(FaceDetector,mImage2detect,2);

%%%%%%%%%%%%%%%%%%%%输入图像灰度化%%%%%%%%%%%%%%%%%%%%
if 1 ~= size(mImageSrc,3)
    mImageSrc = rgb2gray(mImageSrc);
    mImageSrc = double(mImageSrc);
elseif 1     == size(mImageSrc,3)
    mImageSrc = double(mImageSrc);
end

%%%%%%%%%%%%%%%%%%%%得到人脸区域框的中心点%%%%%%%%%%%%%%%%%%%%
recFace.x          = bbox(1,1);
recFace.y          = bbox(1,2);
recFace.width      = bbox(1,3);
recFace.height     = bbox(1,4);

ptFaceCenter.x     = recFace.x + recFace.width / 2;
ptFaceCenter.y     = recFace.y + recFace.height / 2;

%%%%%%%%%%%%%%%%%%%%以中心点为基准进行外扩(即对人脸选框进行调整)%%%%%%%%%%%%%%%%%%%%
recFace.x         = ptFaceCenter.x - recFace.width * 0.4;
recFace.y         = ptFaceCenter.y - recFace.height * 0.35;
recFace.width     = recFace.width * 0.8 ;
recFace.height    = recFace.height * 0.8 ;

mFaceResult       = uint8(imcrop(mImageSrc,[recFace.x,recFace.y,recFace.width,recFace.height]));
end

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153

三、运行结果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]杜平,张燕昆,刘重庆.基于不变矩的人脸识别方法的研究[J].计算机仿真. 2002,(03)

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/120603401

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。