赞
踩
一 课题的来源
随着安全入口控制和金融贸易方面应用需要的快速增长,生物统计识别技术得到了新的重视。目前,微电子和视觉系统方面取得的新进展,使该领域中高性能自动识别技术的实现代价降低到了可以接受的程度。而人脸识别是所有的生物识别方法中应用最广泛的技术之一,人脸识别技术是一项近年来兴起的,但不大为人所知的新技术。人们更多的是在电影中看到这种技术的神奇应用:警察将偷拍到的嫌疑犯的脸部照片,输入到电脑中,与警方数据库中的资料进行比对,并找出该嫌犯的详细资料和犯罪记录。这并非虚构的情节。在国外,人脸识别技术早已被大量使用在国家重要部门以及军警等安防部门。在国内,对于人脸识别技术的研究始于上世纪90年代,目前主要应用在公安、金 融、网络安全、物业管理以及考勤等领域。
二 人脸识别技术的研究意义
1、富有挑战性的课题
人脸识别是机器视觉和模式识别领域最富有挑战性的课题之一,同时也具有较为广泛的应用意义。人脸识别技术是一个非常活跃的研究领域,它覆盖了数字图像处理、模式识别、计算机视觉、神经网络、心理学、生理学、数学等诸多学科的内容。如今,虽然在这方面的研究已取得了一些可喜的成果,但是FRT在实用应用中仍面临着很严峻的问题,因为人脸五官的分布是非常相似的,而且人脸本身又是一个柔性物体,表情、姿态或发型、化妆的千变万化都给正确识别带来了相当大的麻烦。如何能正确识别大量的人并满足实时性要求是迫切需要解决的问题。
2、面部关键特征定位及人脸2D形状检测技术
在人脸检测的基础上,面部关键特征检测试图检测人脸上的主要的面部特征点的位置和眼睛和嘴巴等主要器官的形状信息。灰度积分投影曲线分析、模板匹配、可变形模板、Hough变换、Snake算子、基于Gabor小波变换的弹性图匹配技术、主动性状模型和主动外观模型是常用的方法。
可变形模板的主要思想是根据待检测人脸特征的先验的形状信息,定义一个参数描述的形状模型,该模型的参数反映了对应特征形状的可变部分,如位置、大小、角度等,它们最终通过模型与图像的边缘、峰、谷和灰度分布特性的动态地交互适应来得以修正。由于模板变形利用了特征区域的全局信息,因此可以较好地检测出相应的特征形状。由于可变形模板要采用优化算法在参数空间内进行能量函数极小化,因此算法的主要缺点在于两点:一、对参数初值的依赖程度高,很容易陷入局部最小;二、计算时间长。针对这两方面的问题,我们采用了一种由粗到细的检测算法:首先利用人脸器官构造的先验知识、面部图像灰度分布的峰谷和频率特性粗略检测出眼睛、鼻子、嘴、下巴的大致区域和一些关键的特征点;然后在此基础上,给出了较好的模板的初始参数,从而可以大幅提高算法的速度和精度。
眼睛是面部最重要的特征,它们的精确定位是识别的关键。基于区域增长的眼睛定位技术,该技术在人脸检测的基础上,充分利用了眼睛是面部区域内脸部中心的左上方和右上方的灰度谷区这一特性,可以精确快速的定位两个眼睛瞳孔中心位置。该算法采用了基于区域增长的搜索策略,在人脸定位算法给出的大致人脸框架中,估计鼻子的初始位置,然后定义两个初始搜索矩形,分别向左右两眼所处的大致位置生长。该算法根据人眼灰度明显低于面部灰度的特点,利用搜索矩形找到眼部的边缘,最后定位到瞳孔的中心。实验表明,本算法对于人脸大小、姿态和光照的变化,都有较强的适应能力,但在眼部阴影较重的情况下,会出现定位不准。佩戴黑框眼镜,也会影响本算法的定位结果。
3、面部感知系统的重要内容
基于视觉通道信息的面部感知系统,包括人脸检测和跟踪、面部特征定位、面部识别、人脸归类(年龄、种族、性别等的判别)、表情识别、唇读等分系统,如图1-1所式,可以看出,继人脸检测和跟追之后,面部特征定位通常是面部感知的一个必备环节,是后续工作的基础,具有重要的意义。尽管人脸识别不能说是其他面部感知模块的必备功能,但是, 可以肯定的是,利用已知的身份信息,结合特定人的先验知识,可以提高表情分析、唇读和语音识别、手势识别乃至手写体识别的可靠性。而计算机对使用者身份确认的最直接的应用就是基于特定使用者的环境设置:如使用者的个性化工作环境,信息的共享和隐私保护等等。
图1-1面部感知系统结构图
第二节 人脸识别的国内外发展概况
现在人脸识别技术已经应用在许多领域中,并起到了举足轻重的作用,人脸识别研究开始于1966年PRI的Bledsoe的工作,经过三十多年的发展,人脸识别技术取得了长足的进步, 现在就目前国内外的发展情况来进行展述。
一 国外的发展概况[1]
见诸文献的机器自动人脸识别研究开始于1966年PRI的Bledsoe的工作,1990年日本研制的人像识别机,可在1秒钟内中从3500人中识别到你要找的人。1993年,美国国防部高级研究项目署 (Advanced Research Projects Agency)和美国陆军研究实验室(Army Research Laboratory)成立了Feret(Face Recognition Technology) 项目组,建立了feret 人脸数据库,用于评价人脸识别算法的性能。
美国陆军实验室也是利用vc++开发,通过软件实现的,并且FAR为49%。在美国的进行的公开测试中,FAR,为53%。美国国防部高级研究项目署,利用半自动和全自动算法。这种算法需要人工或自动指出图像中人的两眼的中心坐标,然后进行识别。在机场开展的测试中,系统发出的错误警报太多,国外的一些高校(卡内基梅隆大学(Carnegie Mellon University)为首,麻省理工大学(Massachusetts Institute of Technology )等,英国的雷丁大学(University of Reading))和公司(Visionics 公司Facelt 人脸识别系统、Viiage 的FaceFINDER 身份验证系统、Lau Tech 公司Hunter系统、德国的BioID 系统等)的工程研究工作也主要放在公安、刑事方面,在考试验证系统的实现方面深入研究并不多。
二 国内的发展概况 [2]
人脸识别系统现在在大多数领域中起到举足轻重的作用,尤其是用在机关单位的安全和考勤、网络安全、银行、海关边检、物业管理、军队安全、智能身份证、智能门禁、司机驾照验证、计算机登录系统。我国在这方面也取得了较好的成就,国家863项目“面像检测与识别核心技术”通过成果鉴定并初步应用,就标志着我国在人脸识别这一当今热点科研领域掌握了一定的核心技术。北京科瑞奇技术开发股份有限公司在2002年开发了一种人脸鉴别系统,对人脸图像进行处理,消除了照相机的影响,再对图像进行特征提取和识别。这对于人脸鉴别特别有价值,因为人脸鉴别通常使用正面照,要鉴别的人脸图像是不同时期拍摄的,使用的照相机不一样。系统可以接受时间间隔较长的照片,并能达到较高的识别率,在计算机中库藏2300人的正面照片,每人一张照片,使用相距1--7年、差别比较大的照片去查询,首选率可以达到50%,前20张输出照片中包含有与输入照片为同一人的照片的概率可达70% 。 2005年1月18日,由清华大学电子系人脸识别课题组负责人苏光大教授主持承担的国家"十五"攻关项目《人脸识别系统》通过了由公安部主持的专家鉴定。鉴定委员会认为,该项技术处于国内领先水平和国际先进水平。
本论文主要对该人脸识别系统进行模块划分,并介绍各模块的功能,重点介绍图像预处理模块,对其内的子模块的功能和算法进行详细讲述,主要介绍光线补偿、图像灰度化、高斯平滑、均衡直方图、图像对比度增强,图像预处理模块在整个系统中起着极其关键的作用,图像处理的好坏直接影响着后面的定位和识别工作。
第二章 系统的需求分析与方案选择
人脸识别系统现在应用于许多领域中,但是人脸识别技术也是一项近年来兴起的,且不大为人所知的新技术。在我国以及其他国家都有大量的学者正在研究之中,不断的更新人脸识别技术,以便系统的识别准确率达到新的高度。
第一节 可行性分析
在开发该人脸识别软件之前,我们查询了前人所写过的诸多论文以及源程序,在开发之时,结合了资料中的算法并揉进了自己的一些思想,使程序可以对人脸图片进行简易识别。
一 技术可行性
图像的处理方法很多,我们可以根据需要,有选择地使用各种方法。
在确定脸部区域上,通常使用的方法有肤色提取。肤色提取,则对脸部区域的获取则比较准确,成功率达到95%以上,并且速度快,减少很多工作。
图像的亮度变化,由于图像的亮度在不同环境的当中,必然受到不同光线的影响,图像就变得太暗或太亮,我们就要对它的亮度进行调整,主要采取的措施是对图像进行光线补偿。
高斯平滑:在图像的采集过程中,由于各种因素的影响,图像中往往会出现一些不规则的随机噪声,如数据在传输、存储时发生的数据丢失和损坏等,这些都会影响图像的质量,因此需要将图片进行平滑操作以此来消除噪声。
灰度变换:进行灰度处理,我们要保证图像信息尽可能少的丢失。同样在进行灰度变换前,我们也要对图像的信息进行统计,找出一个比较合理的灰度值,才能进行灰度变换。
灰度均衡:灰度变换后,就要进行灰度均衡,可以根据灰度分布来进行灰度均衡。
对比度增强:将所要处理的区域和周围图像区域进一步拉开他们的对比度,使它们更加明显,主要通过像素的聚集来实现。
二 操作可行性
该人脸识别软件需要如下的运行环境:CPU:500M及以上;内存:64 M及以上。安装有Windows 98、Windows Me、Windows 2000、Windows NT等操作系统中的其中一种。另还装有摄像头可进行随机拍照和识别。因此,从操作可行性来看,只要系统用户的硬件软件设备满足以上条件,即可用该人脸识别软件进行人脸的识别。
第二节 需求分析
一 应用程序的功能需求分析
该软件最主要的功能就是要能识别出人脸,首先该系统需要对通过摄像头拍照而获取到的原始的人脸图片进行一系列处理才可进行下一步的工作,该处理过程也称图像预处理。预处理这个模块在整个人脸识别系统的开发过程中占有很重要的地位,只有预处理模块做的好,才可能很好的完成后面的人脸定位和特征提取这两大关键模块。因此本设计中所要完成的主要功能如下所述:
图像获取功能:
该模块主要是从摄像头拍照后进行获取图片,也可以从图片库中获取,获取后的图片可以在软件的界面中显示出来以便进行识别。
图像预处理功能:
该模块主要包括图像光线补偿、图像变成灰色、高斯平滑、均衡直方图、实现图像对比度增强、二值化变换等。
人脸定位功能:
该模块主要是将处理后的人脸图片进行定位,将眼睛、鼻子、嘴巴标记出来,以便进行特征提取。
特征提取功能:
该模块是在定位后的人脸图片中将眼睛、鼻子、嘴巴的特征值提取出来。
识别功能:
该模块是将从图片中提取的特征值和后台数据库中的值进行比较来完成识别功能。
二 开发环境需求分析
1、硬件环境
(1)硬件配置原则
具有可靠性,可用性和安全性,具有完善的技术支持。能够满足个人学习和设计需要。
(2)运行本软件所需的硬件资源
CPU: 800M及以上;内存: 128M及以上
2、软件环境
(1)系统软件配置原则
能够满足该软件的可靠性,可用性和安全性的要求
(2)系统软件配置方案
① 配置有持续工作能力、高稳定性、高度可集成的开放式标准的操作系统,如Windows2000,Windows NT,UNIX,Linux等。
② 配备符合ANSI/ISO标准的高级程序设计语言处理软件。如:Visual C++ 6.0。
③ 熟悉C++高级程序设计语言。
3、 运行环境需求分析
(1)、硬件环境
CPU:500M及以上;内存:64 M及以上。
(2)、软件环境
可以运行在微软公司近年来所出的各种操作系统。如Windows 98、Windows Me、Windows 2000、Windows NT等。
第三节 预处理方案选择
一 设计方案原则的选择
本应用程序的设计方案原则如下:
1、采用较为先进的技术力量,保证应用程序在技术上具备一定的优势。
2、采用成熟的技术,保证应用程序的安全性和可靠性。
3、应用程序便于扩展和维护,易于技术的更新。
4、应用程序充分利用现有的资源,尽量减少不必要的再投资。
5、编写的代码必须严谨易读,代码的解释必须清楚明白,为应用程序的再开发提供应尽的责任。
二 图像文件格式选择
在设计的过程中,为了定位和特征提取的方便,我们采用的是24位位图。
三 开发工具选择
本次设计所用的开发工具是Microsoft Visual C++ 6.0。 Visual C++ 6.0是Microsoft公司推出的一种可视化编程工具。它支持多平台和交叉平台的开发,将各种编程工具如编辑器、连接器、调试器等巧妙的结合在一起,构成一个完美的可视化开发环境。用户无需通过繁杂的编程操作,即可完成Windows下应用程序的编辑、编译、测试和细化等工作。
四 算法选择分析
本文主要研究的对象是图像预处理模块,该模块分为光线补偿、图像灰度化、高斯平滑、图像对比度增强、均衡直方图,每个小模块的实现都有许多相应的算法。下面将本系统采用的算法进行介绍:
·光线补偿 :由于光线原因,所照的图像可能会存在光线不平衡的情况而造成色彩偏差,为了抵消这种整个图像中存在的色彩偏差,本系统采用的解决方法是:将整个图像中的所有像素的亮度从高到低进行排列,取前5%的像素,然后线性放大,使这些像素的平均亮度达到255。实际上就是调整图片像素的RGB值。
·图像灰度化:图像灰度化是将图像变成灰色,本系统中采用以下步骤来实现图像的灰度化:彩色转换成灰度、灰度比例变换、灰度线性变换、灰度线性截断、灰度取反。
·高斯平滑:在图像的采集过程中,由于各种因素的影响,图像中往往会出现一些不规则的随机噪声,如数据在传输、存储时发生的数据丢失和损坏等,这些都会影响图像的质量,因此需要将图片进行平滑操作以此来消除噪声。但是如果平滑不当,就会使图像本身的细节如边界轮廓、线条等变的模糊不清,为了既平滑掉噪声有尽量保持图像细节,本系统采用高斯平滑。
·均衡直方图:使用该模块的目的是通过点运算使输入转换为在每一灰度级上都有相同的像素点数的输出图像。它的实现主要是利用灰度均衡的转换式
DB = f (DA)=
H(u)du 。(式1)
·图像对比度增强:为了将图像的特征一步一步显现出来,需要进行图像的对比度增强,它主要通过对图像的灰度值进行统计,对于小于Low则认为是有关的信息,则将它作为黑色处理,对于处于High以上的则认为是一些无关的信息,将它们去掉,而处于两者之间的,则进行对比度增强,将他们在总的灰度值里面的比例作为新的像素信息保存起来。
第三章 系统的概要设计
本章主要介绍系统的结构设计的流程以及系统各模块的功能及相关原理。
图3-1总体结构设计流程图
图3-2 预处理的层次图
第一节 各模块功能概述
以上是该系统的总体结构设计图以及图像预处理模块的层次图。下面介绍系统中的各模块的功能及算法:
图像获取模块
该模块主要是从摄像头拍照后进行获取图片,也可以从图片库中获取,获取后的图片可以在软件的界面中显示出来以便进行识别。
人脸区域获取
该系统中图像里人脸区域的获取,主要是根据肤色来进行获取,通过肤色非线形分段色彩变换来实现。这一非线性分段色彩变换得到的肤色模型属于色彩空间中的聚类模型,这一类肤色模型的建立首先要选取一种合适的色彩空间。
图像预处理模块
图像预处理就是对获取得来的图像进行适当的处理,使它具有的特征能够在图像中明显的表现出来。该模块中的子模块有如下5个,下面对它们进行概述:
·光线补偿[3]
因为系统得到的图片可能会存在光线不平衡的情况,这会影响我们对特征的提取,同时系统中要用到YcrCB色彩空间,所以有必要对图像进行光线补偿。尽可能将它的特征在图像中表现出来。YcrCB是一种色彩空间,它用于视频系统中,在该色彩空间中,Y分量表示像素的亮度,Cr表示红色分量,Cb表示蓝色分量,通常把Cr和Cb称为色度。YcrCB色彩空间是以演播室质量标准为目标的CC601编码方案中采用的彩色表示模型。
·灰度变化[4]
图像灰度化的过程就是把彩色图像转换为黑白色图像的过程,它也是为了将图像的信息更加具体、简单的表现出来,但是,这样做也将会丢失图像信息。因此,尽可能在转化的过程中用简单的方式表现图像复杂的信息。
·高斯平滑处理[5]
高斯平滑将对图像进行平滑处理,在图像采集过程中,由于各种因素的影响,图像往往会出现一些不规则的噪声,入图像在传输、存储等都有可能产生数据的丢失。从而影响图像的质量。处理噪声的过程称为平滑。平滑可以降低图像的视觉噪声,同时出去图像中的高频部分后,那些本来不明显的低频成分更容易识别。平滑可以通过卷积来实现。经过卷积平滑后的水平投影后,二值化提供了较好的图像效果。
·对比度增强[6]
对比度增强,就是对图像的进一步处理,将对比度再一次拉开。它针对原始图像的每一个像素直接对其灰度进行处理的,其处理过程主要是通过增强函数对像素的灰度级进行运算并将运算结果作为该像素的新灰度值来实现的。通过改变选用的增强函数的解析表达式就可以得到不同的处理效果。
·二值化[7]
二值化的目的是将采集获得的多层次灰度图像处理成二值图像,以便于分析理解和识别并减少计算量。二值化就是通过一些算法,通过一个阈值改变图像中的像素颜色,令整幅图像画面内仅有黑白二值,该图像一般由黑色区域和白色区域组成,可以用一个比特表示一个像素,“1”表示黑色,“0”表示白色,当然也可以倒过来表示,这种图像称之为二值图像。这便有利于我们对特征的提取。该设计中采用组内方差和组外方差来实现二值化。
·直方图均衡[8]
直方图均衡化的目的是使一输入图像转换为在每一灰度级上都有相同的象素点数,它的处理的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布,它的研究思路是:通过直方图变换式来进行直方图的均衡处理,直方图变换式是
但是直方图均衡化存在着两个缺点:
1)变换后图像的灰度级减少,某些细节消失;
2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。
人脸定位模块
人脸定位是将典型的脸部特征(如眼睛,鼻尖,嘴唇等等)标记出来,在本系统中,定位的特征是眼睛,鼻尖和嘴巴三个。由于眼睛具有对称性,因此可以很快就能标记出来,而鼻子是在眼睛下面,且嘴巴在鼻子下面,所以只要眼睛标记好,鼻子和嘴巴也能相应的标记出来。
特征提取模块
特征提取按以下4个步骤进行:
(1)、提取两只眼睛的距离
(2)、眼睛的倾角度
(3)、眼睛、嘴巴的重心
(4)、用一个矩形标出每一个特征
在特征提取完之后将会得到相应的特征值以便存入后台数据库。
识别模块
该模块通过与库存中的特征向量进行比较,找出与特征最相近的参数,再对该参数进一步分析。如果分析在我们所确认的范围内,我们就认为该人就是我们所要找的。然后从库存中提取出该人相关的信息,并显示出来。如果库存中没有,则给出提示是否对存库作为样本。
第四章 系统的详细设计
本章主要对图像处理这一模块进行详细介绍,对其子模块所用到的算法及具体实现进行详细讲述。
第一节 系统的运行流程图
图6-1 系统的运行流程图
第二节 图像处理详细设计
一 位图详细设计
1 设备无关位图(DIB)
VC++没有提供使用十分方便的DIB绘制方法,只好自己去创建一个实用的DIB类了。本系统中建立了一个专门的类DIB来处理设备无关位图,表4-1列出了对位图的操作函数。
函 数 | 功 能 |
ClearMemory() | 释放内存 |
CopyHandle() | 拷贝内存块 |
LoadDIB() | 加载位图信息 |
ReadDIBFile() | 读取位图文件信息 |
LightingCompensate() | 进行光线补偿 |
PixelOffset() | 修正像素值 |
PaintDIBTrue() | 绘制DIB对象 |
GetColorNumber() | 获取颜色总数 |
GetHeight() | 获取DIB高度 |
GetWidth() | 获取DIB宽度 |
GetSize() | 获取图像数据缓冲区中的字节数 |
GetBitCount() | 获取颜色位数 |
GetBiBitCount() | 获取字节数 |
表6-1 Dib类的部分功能
二 图像点处理详细设计
图像点运算是一种既简单又重要的技术,它能让用户改变图像数据占据的灰度范围,一幅输入图像经过点运算后将产生一幅新的输出图像,由输入像素点的灰度值决定相应的输出像素点的灰度值,点运算与局部运算的差别在于:后者每个输出像素的灰度值由对应输入像素的一个领域内几个像素的灰度值决定。所以,点运算不可以改变图像内的空间关系。
点运算可以按照预定的方式改变一幅图的灰度直方图。除了灰度级的改变是根据某种特定的灰度变换函数进行之外,点运算可以看作是“从像素到像素”的复制操作。如果输入图像为A(x,y),输出图像为B(x,y),则点运算可表示为:
B(x,y) = f[A(x,y)] (式2)
其中函数f(D)被称为灰度变换(Gray Scale Transformation ,GST)函数,它描述了输入灰度值和输出灰度值之间的转换关系,一旦灰度变换函数确定,该点运算就完全被确定下来了。
点运算有时又称为对比度增强、对比度拉伸或灰度变换,它是图像数字化软件和图像显示软件的重要组成部分。下面将对本设计解决各图像点处理模块运用进行到的理论和编程实现进行详细讲述。
1、光线补偿
(1)算法思想:
光线补偿的想法的提出主要是考虑到肤色等色彩信息经常受到光源颜色、图像采集设备的色彩偏差等因素的影响,而在整体上偏离本质色彩而向某一方向移动,即我们通常所说的色彩偏冷、偏暖、照片偏黄、便蓝等等。这种现象在艺术照片中更为常见。所以Anil K.Jain等提出,为了抵消这种整个图像中存在着的色彩偏差,我们将整个图像中所有像素亮度(是经过了非线形r-校正后的亮度)从高到低进行排列,取前5%的像素,如果这些像素的数目足够多(例如,大于100),我们就将它们的亮度作为“参考白”(Reference White),也即将它们的色彩的R、G、B分量值都调整为255。整幅图像的其他像素点的色彩值也都按这一调整尺度进行交换。
(2) 具体实现光线补偿功能:
明白了光线补偿这功能的算法及思想,就可以编码实现其功能了,实现过程如下:
①、 编辑菜单IDR_MAINFRAM,先在其中添加一菜单项,将其命名为“预处理”,并在其属性栏中将其设为“弹出”菜单,点击预处理该菜单项将会弹出一个新的子菜单,此时把该子菜单命名为“光线补偿”,并把其ID设为ID_READY_LIGHTINGCONPENSATE,对应文件FaceDetectView.Cpp中的函数ReadyLightingconpensate()实现,并在void CFaceDetectView:: OnReadyLightingconpensate()中添加如下代码:
hDIBTemp = gDib.CopyHandle(hDIB);
gDib.LightingCompensate(hDIB);
GlobalUnlock(hDIB);
Invalidate();
光线补偿功能实质上是用上段代码中的LightingCompensate()函数来进行实现。函数LightingCompensate()是类DIB的一个成员函数。其核心代码如下所述:
//下面的循环对图像进行光线补偿
for(i =0;i<height;i++)
for(int j=0;j<width;j++)
{
//获取像素偏移
lOffset = this->PixelOffset(i,j,wBytesPerLine);
//得到蓝色分量
*(lpData+lOffset) = colorb;
//绿色分量
colorb = *(lpData+lOffset+1);
colorb *=co;
if(colorb >255)
colorb = 255;
*(lpData+lOffset+1) = colorb;
//红色分量
colorb = *(lpData+lOffset+2);
colorb *=co;
if(colorb >255)
colorb = 255;
*(lpData+lOffset+2) = colorb;
}
② 光线补偿的效果图如下所示 :
图 4-1 原图
图4-2 光线补偿效果图
2、 图像灰度化
(1)算法思想
① 彩色转换成灰度
将彩色图像转化为灰阶图像常采用如下的经验式:
gray=0.39×R+0.50×G+0.11×B(式3)
其中,gray为灰度值,R、G、B分别为红色、绿色和蓝色分量值。
② 灰度比例变换
灰度比例变换是把原像素的灰度乘以一个缩放因子,并最后截至[0,255]。
③ 灰度线性变换
当图像由于成像时曝光不足或曝光过度,会产生对比度不足的弊病,从而使图像中的细节分辨不清。将图像灰度进行线性扩展,常能显著地改善图像的外观。灰度线性变换的计算式为:
g =
(式4)
f,其他
式中,f是原像素的灰度,g为变换后的灰度。该变换把属于[a,b]的灰度级变换至灰度区间[c,d],而没有在[a,b]区间的原像素灰度将保持不变。这里a,b,c,d,f,g均为[0,255]之间的整数值。可见,a被映射为c,b被映射为d。
④ 灰度线性截断
灰度线性截断的思想是:如果原像素的灰度小于a,则该像素的灰度等于c;如果原像素的灰度大于b,则该像素的灰度等于d。
(2)具体实现灰度化功能
在明白了灰度化的原理之后,就可进行编码来实现该功能。
① 编辑菜单IDR_MAINFRAM,先在其中添加一菜单项,将其命名为”图像灰度化”,并将其ID号设为ID_READY_SCALE, 对应文件FaceDetectView.Cpp中的函数ReadyLightingconpensate()实现.
② 现该模块的核心代码如下:
获取蓝色分量
ColorB=*(lpData + lOffset);
获取绿色分量
ColorG=*(lpData + lOffset+1);
获取红色分量
ColorR=*(lpData + lOffset+2);
计算灰度值
gray = (ColorG*50+ColorR*39+ColorB*11)/100;
显示灰度图像
*(lpData + lOffset)=gray ;
*(lpData + lOffset+1)=gray ;
*(lpData + lOffset+2)=gray ;
其中lpData是图片数据区,lOffset是图片像素的偏移,gray 是图像的灰度值
③ 图像灰度化效果图:
图 4-3 图像灰度化效果图
3、高斯平滑
(1) 算法思想
在介绍高斯平滑前,先介绍模板操作。模板操作是数字图像处理中经常用到的一种运算方法,图像的平滑、锐化以及细化、边缘检测都要用到模板操作。例如:有一种常见的平滑算法是将原图中一个像素的灰度值和它周围邻近八个像素的灰度值相加,然后求得的平均值(除以9)作为新图中该像素的灰度值,用如下方法来表示该操作:
1 1 1
1/9
1 1· 1
1 1 1
上式类似于矩阵,我们通常称之为模板。中间的黑点表示该元素中心元素,即该个元素是要进行处理的元素。如果模板是:
1· 1 1
1/9 1 1 1
1 1 1
则该操作应该描述为:将原图中一个像素的灰度值和它右下邻近的8个像素的灰度值相加,然后将求得的平均值9(除以9)作为新图中该像素的灰度值。如果模板为 2. ,
1
则表示将自身灰度值的2倍加下边的元素灰度值作为新值,而 2 则表示将自身
1.
灰度值加上边元素灰度值的2倍作为新灰度值。通常模板不允许移出边界,所以处理后的图像会比原图小,例如:当模板是 1. 0 原图灰度值矩阵是 1 1 1 1 1
0 2 2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
时,经过模板操作后的图像为 5 5 5 5 -
8 8 8 8 -
11 11 11 11 -
- - - - -
“-”表示边界上无法进行模板操作的点,一般的做法是复制原图的灰度值,不再进行任何其他的处理。模板操作实现了一种领域运算,即某个像素点的结果不仅和本像素灰度有关,而且和其领域点的值有关。下面对平滑的用途和解决方法进行详细介绍。
在图像的采集过程中,由于各种因素的影响,图像中往往会出现一些不规则的随机噪声,如数据在传输、存储时发生的数据丢失和损坏等,这些都会影响图像的质量。处理噪声点的过程称之为平滑,平滑可以降低图像的视觉噪声,同时除去图像中的高频部分后,那些本来不明显的低频成分更容易识别。而噪声点一般是孤
立的点,噪声点的像素灰度与它们的近邻像素有显著的区别,即灰度变化总在这附近有突变高频。平滑可用卷积来实现,平滑的频率截止点由卷积核的大小及卷积系数决定。用于平滑滤波的卷积核叫做低通过滤波器,低通过滤波器具有如下的特征:1卷积核的行、列数为奇数,通常为3×3的矩阵;2卷积系数以中心点为中心对称分布;3所有的卷积系数都为正数;4距离中心较远的卷积系数的值较小或保持不变;5卷积后的结果不改变图像的亮度。经过卷积平滑后给随后的水平投影、二值化提供了较好的图像效果。水平投影的曲线显得比较平滑,二值化后的图像孤立点比较少。以下是几个常用的卷积核:
1/9 1/9 1/9 1/10 1/10 1/10 1/16 2/16 1/16
1/9 1/9 1/9 1/10 1/5 1/10 2/16 4/16 2/16
1/9 1/9 1/9 1/10 1/10 1/10 1/16 2/16 1/16
L P1 LP2 LP3
通常的处理是:将中心点周围八个点的像素值乘于各自矩阵相应的系数后相加得到一个值,然后将这个值乘上中心点的系数,中心点的像素值赋为得到的最后值。一般来说,不同的噪声有各自针对性的卷积算法。本文使用的卷积算法是高斯卷积核,亦即上面卷积核的LP3。高斯卷积是通过采样2维高斯函数得到的。高斯平滑算法的优点是平滑后图像的失真少,算法更具备通用性,能去除不同的噪声干扰。需要注意的是:在平滑处理时,图像边界点无法处理,因此循环范围应设定在图像边界内。
(2) 具体实现高斯平滑功能
知道高斯平滑原理之后,可进行编码将其实现:
//进行模板操作
Template(tem ,3,3, xishu);
Invalidate(TRUE);
其中tem是模板参数,xishu是模板系数;Template()函数是实现高斯平滑的主要函数,其核心代码是:
for(m=i-((tem_h-1)/2);m<=i+((tem_h-1)/2);m++)
{
for(n=j-((tem_w-1)/2);n<=j+((tem_w-1)/2);n++)
注: 将以点(i,j)为中心,与模板大小相同的范围内的象素与模板对用位置的系数进行相乘并线形叠加
sum+=Gray[m][n]* tem[(m-i+((tem_h-1)/2))*tem_w+n-j+((tem_w-1)/2)];
}
将结果乘上总的模板系数
sum=(int)sum*xishu;
计算绝对值
sum = fabs(sum);
如果小于0,强制赋值为0
if(sum<0)
sum=0;
如果大于255,强制赋值为255
if(sum>255)
sum=255;
HeightTemplate[i][j] = sum;
图4-4 高斯平滑效果图
4、灰度均衡
(1)算法思想
灰度均衡也称直方图均衡,目的是通过点运算使输入转换为在每一灰度级上都有相同的像素点数的输出图像(即输出的直方图是平的)。这对于在进行图像比较或分割之前将图像转化为一级的格式是十分有效的。
按照图像的概率密度函数(PDF,归一化带单位面积的直方图)的定义:
P(x) =
* H(x)(式5)
其中H(x)为直方图,A0为图像的面积,设转换前图像的概率密度函数为
Pr(r),转换后图像的概率密度函数为Ps(S),转换函数为s = f(r),由概率论知识,我们可以得到:
Ps(S) = Pr(r)*
(式6)
这样,如果想使转换后图像的概率密度函数为1(即直方图是平的)则必须满足:
Pr(r)=
(式4-5)
等式两边积分,得:
S = f(r)= ∫0 rP2(u)du =
∫0 r H(u)du (式7)
该转换式被称为图像的累积分布函数
上面的式是被归一化后推导的对于没有归一化的情况,只要求以最大的灰度值(DMax,对于灰度图就是255)即可,灰度均衡的转换式为:
DB = f (DA)=
H(u)du (式1)
对于离散图像转换式为:
DB = f(DA)=
(式8)
式中Hi为第i级灰度的像素个数。
(2)编程实现
在灰度均衡操作同样不需要改变DIB的调色板和文件夹,只要把指向DIB像素起始位置的指针和DIB高度、宽度信息传递给子函数就可以完成灰度均衡变换工作,其核心代码如下:
*(lpData + lOffset)=state ; //显示灰度均衡
*(lpData + lOffset+1)=state ;
*(lpData + lOffset+2)=state ;
(3)效果图
图 4-5 灰度均衡效果图
5、图像对比度增强
在对图像均衡直方图处理以后,便可对图像进行对比度增强,进一步拉开对比度。它通过对图像的灰度值进行统计,对于比最小设定值小的则认为是有关的信息,则将它作为黑色处理,比最大设定值大的则认为是一些无关的信息,将它们去掉,而处于两者之间的,则进行对比度增强,将他们在总的灰度值里面的比例作为新的像素信息保存起来。
这个工作的主要目的是将图像的特征一步一步显现出来。
(2) 编码实现:
① 编辑菜单IDR_MAINFRAM,在菜单“预处理”中添加一子菜单项,命名为“实现图像对比度增强”,并将其ID设为ID_READY_ContrastEnhance。
lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
获取图像灰度增强函数
int state=IncreaseContrast(ZFT[k][k1], 100);
显示灰度增强后的图像
*(lpData + lOffset ) = state ;
*(lpData + lOffset+1) = state ;
*(lpData + lOffset+2) = state ;
其中IncreaseContras()函数是实现图像对比度增强的关键函数,该根据参数n来调节对比度,n越大,对比越强烈,其核心是:
如果数据很小,设置为0
if(pByte<=Low)
return 0;
获得中间数据,并进行对比增强处理
else if ((Low<pByte)&&(pByte<High))
return int(((pByte-Low)/Grad));
如果数据很大,设置为255
else
return 255;
图4-6 对比度增强效果图
第三节 编程时的问题解决
1、光线补偿
由于要改变每一个像素的亮度,开始,我通过对数幅图像使用一个固定的值进行测试,得到的效果都满理想,但是当对更多的图像处理时,该固定值就出现了明显的不足,最后不得不采用全局统计的方法,才能得到比较理想的效果。
2、高斯平滑
高斯平滑用于消除图片噪音,为了实现此功能,我们使用了模板操作,因此模板参数的选择是最重要的。高斯平滑效果的好坏取决与模板参数。在编程的时候,试探性的进行参数的选择,然后进行比较,看那组参数可以达到最好的效果。模板参数是
原先采用了
1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9
形式,但是,得到的效果却是令人失望。
后来又用了
1/10 1/10 1/10
1/10 1/5 1/10
1/10 1/10 1/10
形式,但是,结果仍然是未能达到预期的效果。
直到最后采用的
1/16 2/16 1/16
2/16 4/16 2/16
1/16 2/16 1/16
形式,才得到了比较合理的效果。
3、 均衡直方图
开始时,图像的会度一直都处于很散的状态,而且图像的特征不明显,原本想经过高斯平滑后进行灰度变换,但是并未能成功。经过了一翻苦战,最终找到均衡直方图的办法,经过多次尝试,效果一直处于比较理想的状态。
第五章 结构设计
在本系统中,起至关重要的类列举如下,并将它们的成员函数及其成员函数的功能和参数都一一简述:
1、CFaceDetectView :该类是在编程的过程中自动生成的。菜单项中的事件处理程序都是在该类对应的CFaceDetectView.h文件和CFaceDetectView.cpp文件中声明和实现的。表7-1列出了该类所封装的成员函数及其功能:
表7-1 类 CfaceDetectView的成员
函 数 | 功 能 |
IncreaseContrast () | 增强图像对比度 |
FixeEyes () | 眼睛定位 |
FixeNose() | 鼻子定位 |
FixeMouth () | 嘴巴定位 |
GetEyesParameter () | 获取眼睛参数 |
GetPartParameter() | 获取脸部特征 |
GetmouthParameter () | 获取嘴巴参数 |
Centerofgravity() | 获取眼、鼻子、嘴巴的重心 |
AverageDeviation () | 获取平均值的标准偏差 |
Template() | 对图像进行模板操作 |
DrawCrossX () | 画十字标记 |
各成员函数解析
函数名称 : IncreaseContrast
参数 : int pByte ---- 图像的灰度值
int n ---- 用于调节对比度的参数
返回值 : int ---- 新的灰度值
说明 : 该函数通过修图像的灰度值来增强图像的对比度
函数名称 : FixeEyes
参数 : 无
返回值 : bool
说明 : 该函数判断图片中是否有人脸,并对人脸图片进行眼睛定位
函数名称 : FixeNose
参数 : 无
返回值 : void
说明 : 该函数是在眼睛定位之后的前提下进行鼻子的定位
函数名称 : FixeMouth
参数 : 无
返回值 : void
说明 : 该函数是在眼睛和鼻子都定位之后的前提下再进行嘴巴的定位
函数名称 : GetEyesParameter
参数 : 无
返回值 : void
说明 : 该函数分别获取了眼睛、鼻子、嘴巴的重心之后,再根据两眼间的角度、鼻眼鼻所形成的角、鼻嘴鼻所形成的角、两个眼睛中心距与脸宽的比例来获取眼睛参数。
函数名称 : GetPartParameter
参数 : 无
返回值 : void
说明 : 该函数的功能是用于获取整个脸部的特征
函数名称 : Centerofgravity
参数 : 无
返回值 : void
说明 : 该函数的功能是找出眼睛、鼻子、嘴巴的重心并用十字将它们标记出来
函数名称 : AverageDeviation
参数 : double NewData ---- 新获取的数据
double OldData ---- 以前的数据
返回值 : double ----平均值的标准偏差
说明 : 该函数用于计算平均值的标准偏差
函数名称 : Template
参数 : double * tem ---- 指向模板的指针
HDIB hDIB ---- 图像的句柄
int tem_w ---- 模板的宽度
int tem_h ---- 模板的高度
double xishu ---- 模板的系数
返回值 : 无
说明 : 该函数对图像进行模板操作,但为了方便起见,模板的高度和宽度都是用奇数。
函数名称 : DrawCrossX
参数 : int x
int y
返回值 : 无
说明 : 该函数对已经做好预处理的人脸图像中的特征(眼睛、鼻子、嘴巴)用十字标记出来
表7-2 类ClikelyHood的成员
函 数 | 功 能 |
CalLikeHood () | 计算相似度 |
CalBinary () | 二值化图像 |
filter() | 实现滤波功能 |
CalParameter () | 训练参数 |
各成员函数解析
函数名称 : CalLikeHood
参数 : 无
返回值 : 无
说明 : 该函数用于计算相似度
函数名称 : CalBinary
参数 : 无
返回值 : bool
说明 : 该函数用于将图像二值化
函数名称 : filter
参数 : double** source
返回值 : bool
说明 : 该函数的功能是实现中值滤波
函数名称 : CalParameter
参数 : DirectPath —— Bmp文件路径
返回值 : bool
说明 : 该函数的功能是对参数进行训练
3 类CFaceDetectDoc
表7-3 类CFaceDetectDoc的成员
函 数 | 功 能 |
CopyBitMap () | 拷贝位图 |
MakeBitMap () | 生成新的位图 |
DrawCross () | 画十字形标记 |
Likehood () | 计算相似度 |
各成员函数解析
函数名称 : CopyBitMap
参数 : dest —— 目标位图指针
Source —— 源位图指针
返回值 : bool
说明 : 该函数的功能是拷贝位图
函数名称 : MakeBitMap
参数 : 无
返回值 : 无
说明 : 该函数的功能是生成一个新的位图
函数名称 : DrawCross
参数 : pDC-CDC指针
point-要画的点的坐标
crColor-标记得颜色
返回值 : 无
说明 : 该函数用于画十字形标记
函数名称 : Likehood
参数 : int m_WndWidth ——图片高度
int m_WndHeight —— 图片宽度
返回值 : 无
说明 : 该函数用于计算相似度
4、类DIB
函 数 | 功 能 |
CopyHandle() | 拷贝内存块 |
ReadDIBFile() | 读取位图文件信息 |
LightingCompensate() | 进行光线补偿 |
PixelOffset() | 修正像素值 |
GetHeight() | 获取DIB高度 |
GetBiBitCount() | 获取字节数 |
表7-4 类Dib的成员
各成员函数解析
函数名称 : CopyHandle
参数 : HANDLE hSrc —— 要拷贝的内存区域
返回值 : HANDLE —— 拷贝后的新内存区域
说明 : 该函数拷贝指定的内存区域,返回复制后的新内存区域,出错时返回NULL
函数名称 : ReadDIBFile
参数 : HANDLE hFile —— 要读取的文件hFile
返回值 : HDIB —— 成功返回DIB的句柄,否则返回NULL
说明 : 该函数拷贝指定的内存区域,返回复制后的新内存区域,出错时返回NULL
函数名称 : PixelOffset
参数 : int i,j
WORD wBytePerLine —— 图像每行的字节数
返回值 : long —— 图像像素数据的偏移
说明 : 该函数计算图像像素数据的偏移
函数名称 : GetHeight
参数 : 无
返回值 : long —— 图片高度
说明 : 该函数返回图像的高度
函数名称 : GetBitBitCount
参数 : 无
返回值 : int —— 图片字节数
说明 : 该函数返回图片字节数
第六章 测试
测试是为了找出程序的错误。正如测试的规则所确定的一样:测试是为了发现程序中的错误而执行程序的过程;好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;成功的测试是发现了迄今为止尚未发现的错误的测试。
第一节 测试的原则
1、应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。
2、测试用例应由测试输入数据和与之对应的预期输出结果两部分组成。 3、程序员应避免检查自己的程序。(注意不是指对程序的调试)
4、在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。不合理的输入条件是指异常的,临界的,可能引起问题异变的输入条件。
5、充分注意测试中的群集现象。经验表明,测试后程序残存的错误数目与该程序中以发现的错误数目或检错率成正比。应该对错误群集的程序段进行重点测试。
6、严格执行测试计划,排除测试的随意性。测试计划应包括:所测软件的功能,输入和输出,测试内容,各项测试的进度安排,资源要求,测试资料,测试工具,测试用例的选择,测试的控制方法和过程,系统的组装方式,跟踪规则,调试规则,以及回归测试的规定等等以及评价标准。
7、应当对每一个测试结果做全面的检查。
8、妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。
知道了测试的目的和测试的原则之后,现在进行软件的具体测试,对软件的功能实现进行详细的测试。
第二节 测试方案
本系统主要由图像处理、人脸定位、特征提取、识别四个部分组成,而图像处理对于后面的工作结果好坏起着至关重要的作用,因此从软件开发的最初阶段我们就要对软件进行不断的测试,对图像处理模块中的各个子模块进行测试以便检测经过处理后的图像效果是否达到预期的效果。下面对图像处理模块的测试过程进行描述:
图像处理模块 :该 模块分为光线补偿、图像变成灰色、均衡直方图、实现图像对比度增强、二值化处理。对该模块进行测试的方法是:采用多张24位的彩色图像来进行逐一测试,看这些图片经过处理后是否达到预期的效果,如光线补偿模块,则检测所测图片的亮度是否变强;图像灰度化模块的检测则需看所测的彩色图片是否变成灰色;高斯平滑的实现采用了模板操作,因此模板参数的选择对其十分重要,先用图片进行测试来检测平滑效果,如果效果不理想则继续选择模板参数,直至效果理想为止;图像对比度增强是为了将图像的特征一步一步显现出来,在测试的过程中,用含人脸的图片进行检测看是否图像的特征显示出来的是否足够明显。
经过测试之后,光线补偿模块将图像的像素亮度增强,并使图片中的光线达到平衡;图像灰度化模块达到了预期的效果,将图片转变为灰色;高斯平滑模块能有效的消除图像噪音,提高了图像质量;而增强图像对比度模块能够较好的把图像特征表现出来。
结束语
一 应用程序特点
1、人脸识别应用程序采用Visual C++6.0作为开发工具,利用MFC采用面向对象的方法,用C++语言编写程序。
2、应用程序的的各个类具有相同的编程模式,且都是一次性制作的,代码简洁,编程效率高。
3、将面向对象的
一 课题的来源
随着安全入口控制和金融贸易方面应用需要的快速增长,生物统计识别技术得到了新的重视。目前,微电子和视觉系统方面取得的新进展,使该领域中高性能自动识别技术的实现代价降低到了可以接受的程度。而人脸识别是所有的生物识别方法中应用最广泛的技术之一,人脸识别技术是一项近年来兴起的,但不大为人所知的新技术。人们更多的是在电影中看到这种技术的神奇应用:警察将偷拍到的嫌疑犯的脸部照片,输入到电脑中,与警方数据库中的资料进行比对,并找出该嫌犯的详细资料和犯罪记录。这并非虚构的情节。在国外,人脸识别技术早已被大量使用在国家重要部门以及军警等安防部门。在国内,对于人脸识别技术的研究始于上世纪90年代,目前主要应用在公安、金 融、网络安全、物业管理以及考勤等领域。
二 人脸识别技术的研究意义
1、富有挑战性的课题
人脸识别是机器视觉和模式识别领域最富有挑战性的课题之一,同时也具有较为广泛的应用意义。人脸识别技术是一个非常活跃的研究领域,它覆盖了数字图像处理、模式识别、计算机视觉、神经网络、心理学、生理学、数学等诸多学科的内容。如今,虽然在这方面的研究已取得了一些可喜的成果,但是FRT在实用应用中仍面临着很严峻的问题,因为人脸五官的分布是非常相似的,而且人脸本身又是一个柔性物体,表情、姿态或发型、化妆的千变万化都给正确识别带来了相当大的麻烦。如何能正确识别大量的人并满足实时性要求是迫切需要解决的问题。
2、面部关键特征定位及人脸2D形状检测技术
在人脸检测的基础上,面部关键特征检测试图检测人脸上的主要的面部特征点的位置和眼睛和嘴巴等主要器官的形状信息。灰度积分投影曲线分析、模板匹配、可变形模板、Hough变换、Snake算子、基于Gabor小波变换的弹性图匹配技术、主动性状模型和主动外观模型是常用的方法。
可变形模板的主要思想是根据待检测人脸特征的先验的形状信息,定义一个参数描述的形状模型,该模型的参数反映了对应特征形状的可变部分,如位置、大小、角度等,它们最终通过模型与图像的边缘、峰、谷和灰度分布特性的动态地交互适应来得以修正。由于模板变形利用了特征区域的全局信息,因此可以较好地检测出相应的特征形状。由于可变形模板要采用优化算法在参数空间内进行能量函数极小化,因此算法的主要缺点在于两点:一、对参数初值的依赖程度高,很容易陷入局部最小;二、计算时间长。针对这两方面的问题,我们采用了一种由粗到细的检测算法:首先利用人脸器官构造的先验知识、面部图像灰度分布的峰谷和频率特性粗略检测出眼睛、鼻子、嘴、下巴的大致区域和一些关键的特征点;然后在此基础上,给出了较好的模板的初始参数,从而可以大幅提高算法的速度和精度。
眼睛是面部最重要的特征,它们的精确定位是识别的关键。基于区域增长的眼睛定位技术,该技术在人脸检测的基础上,充分利用了眼睛是面部区域内脸部中心的左上方和右上方的灰度谷区这一特性,可以精确快速的定位两个眼睛瞳孔中心位置。该算法采用了基于区域增长的搜索策略,在人脸定位算法给出的大致人脸框架中,估计鼻子的初始位置,然后定义两个初始搜索矩形,分别向左右两眼所处的大致位置生长。该算法根据人眼灰度明显低于面部灰度的特点,利用搜索矩形找到眼部的边缘,最后定位到瞳孔的中心。实验表明,本算法对于人脸大小、姿态和光照的变化,都有较强的适应能力,但在眼部阴影较重的情况下,会出现定位不准。佩戴黑框眼镜,也会影响本算法的定位结果。
3、面部感知系统的重要内容
基于视觉通道信息的面部感知系统,包括人脸检测和跟踪、面部特征定位、面部识别、人脸归类(年龄、种族、性别等的判别)、表情识别、唇读等分系统,如图1-1所式,可以看出,继人脸检测和跟追之后,面部特征定位通常是面部感知的一个必备环节,是后续工作的基础,具有重要的意义。尽管人脸识别不能说是其他面部感知模块的必备功能,但是, 可以肯定的是,利用已知的身份信息,结合特定人的先验知识,可以提高表情分析、唇读和语音识别、手势识别乃至手写体识别的可靠性。而计算机对使用者身份确认的最直接的应用就是基于特定使用者的环境设置:如使用者的个性化工作环境,信息的共享和隐私保护等等。
图1-1面部感知系统结构图
第二节 人脸识别的国内外发展概况
现在人脸识别技术已经应用在许多领域中,并起到了举足轻重的作用,人脸识别研究开始于1966年PRI的Bledsoe的工作,经过三十多年的发展,人脸识别技术取得了长足的进步, 现在就目前国内外的发展情况来进行展述。
一 国外的发展概况[1]
见诸文献的机器自动人脸识别研究开始于1966年PRI的Bledsoe的工作,1990年日本研制的人像识别机,可在1秒钟内中从3500人中识别到你要找的人。1993年,美国国防部高级研究项目署 (Advanced Research Projects Agency)和美国陆军研究实验室(Army Research Laboratory)成立了Feret(Face Recognition Technology) 项目组,建立了feret 人脸数据库,用于评价人脸识别算法的性能。
美国陆军实验室也是利用vc++开发,通过软件实现的,并且FAR为49%。在美国的进行的公开测试中,FAR,为53%。美国国防部高级研究项目署,利用半自动和全自动算法。这种算法需要人工或自动指出图像中人的两眼的中心坐标,然后进行识别。在机场开展的测试中,系统发出的错误警报太多,国外的一些高校(卡内基梅隆大学(Carnegie Mellon University)为首,麻省理工大学(Massachusetts Institute of Technology )等,英国的雷丁大学(University of Reading))和公司(Visionics 公司Facelt 人脸识别系统、Viiage 的FaceFINDER 身份验证系统、Lau Tech 公司Hunter系统、德国的BioID 系统等)的工程研究工作也主要放在公安、刑事方面,在考试验证系统的实现方面深入研究并不多。
二 国内的发展概况 [2]
人脸识别系统现在在大多数领域中起到举足轻重的作用,尤其是用在机关单位的安全和考勤、网络安全、银行、海关边检、物业管理、军队安全、智能身份证、智能门禁、司机驾照验证、计算机登录系统。我国在这方面也取得了较好的成就,国家863项目“面像检测与识别核心技术”通过成果鉴定并初步应用,就标志着我国在人脸识别这一当今热点科研领域掌握了一定的核心技术。北京科瑞奇技术开发股份有限公司在2002年开发了一种人脸鉴别系统,对人脸图像进行处理,消除了照相机的影响,再对图像进行特征提取和识别。这对于人脸鉴别特别有价值,因为人脸鉴别通常使用正面照,要鉴别的人脸图像是不同时期拍摄的,使用的照相机不一样。系统可以接受时间间隔较长的照片,并能达到较高的识别率,在计算机中库藏2300人的正面照片,每人一张照片,使用相距1--7年、差别比较大的照片去查询,首选率可以达到50%,前20张输出照片中包含有与输入照片为同一人的照片的概率可达70% 。 2005年1月18日,由清华大学电子系人脸识别课题组负责人苏光大教授主持承担的国家"十五"攻关项目《人脸识别系统》通过了由公安部主持的专家鉴定。鉴定委员会认为,该项技术处于国内领先水平和国际先进水平。
本论文主要对该人脸识别系统进行模块划分,并介绍各模块的功能,重点介绍图像预处理模块,对其内的子模块的功能和算法进行详细讲述,主要介绍光线补偿、图像灰度化、高斯平滑、均衡直方图、图像对比度增强,图像预处理模块在整个系统中起着极其关键的作用,图像处理的好坏直接影响着后面的定位和识别工作。
第二章 系统的需求分析与方案选择
人脸识别系统现在应用于许多领域中,但是人脸识别技术也是一项近年来兴起的,且不大为人所知的新技术。在我国以及其他国家都有大量的学者正在研究之中,不断的更新人脸识别技术,以便系统的识别准确率达到新的高度。
第一节 可行性分析
在开发该人脸识别软件之前,我们查询了前人所写过的诸多论文以及源程序,在开发之时,结合了资料中的算法并揉进了自己的一些思想,使程序可以对人脸图片进行简易识别。
一 技术可行性
图像的处理方法很多,我们可以根据需要,有选择地使用各种方法。
在确定脸部区域上,通常使用的方法有肤色提取。肤色提取,则对脸部区域的获取则比较准确,成功率达到95%以上,并且速度快,减少很多工作。
图像的亮度变化,由于图像的亮度在不同环境的当中,必然受到不同光线的影响,图像就变得太暗或太亮,我们就要对它的亮度进行调整,主要采取的措施是对图像进行光线补偿。
高斯平滑:在图像的采集过程中,由于各种因素的影响,图像中往往会出现一些不规则的随机噪声,如数据在传输、存储时发生的数据丢失和损坏等,这些都会影响图像的质量,因此需要将图片进行平滑操作以此来消除噪声。
灰度变换:进行灰度处理,我们要保证图像信息尽可能少的丢失。同样在进行灰度变换前,我们也要对图像的信息进行统计,找出一个比较合理的灰度值,才能进行灰度变换。
灰度均衡:灰度变换后,就要进行灰度均衡,可以根据灰度分布来进行灰度均衡。
对比度增强:将所要处理的区域和周围图像区域进一步拉开他们的对比度,使它们更加明显,主要通过像素的聚集来实现。
二 操作可行性
该人脸识别软件需要如下的运行环境:CPU:500M及以上;内存:64 M及以上。安装有Windows 98、Windows Me、Windows 2000、Windows NT等操作系统中的其中一种。另还装有摄像头可进行随机拍照和识别。因此,从操作可行性来看,只要系统用户的硬件软件设备满足以上条件,即可用该人脸识别软件进行人脸的识别。
第二节 需求分析
一 应用程序的功能需求分析
该软件最主要的功能就是要能识别出人脸,首先该系统需要对通过摄像头拍照而获取到的原始的人脸图片进行一系列处理才可进行下一步的工作,该处理过程也称图像预处理。预处理这个模块在整个人脸识别系统的开发过程中占有很重要的地位,只有预处理模块做的好,才可能很好的完成后面的人脸定位和特征提取这两大关键模块。因此本设计中所要完成的主要功能如下所述:
图像获取功能:
该模块主要是从摄像头拍照后进行获取图片,也可以从图片库中获取,获取后的图片可以在软件的界面中显示出来以便进行识别。
图像预处理功能:
该模块主要包括图像光线补偿、图像变成灰色、高斯平滑、均衡直方图、实现图像对比度增强、二值化变换等。
人脸定位功能:
该模块主要是将处理后的人脸图片进行定位,将眼睛、鼻子、嘴巴标记出来,以便进行特征提取。
特征提取功能:
该模块是在定位后的人脸图片中将眼睛、鼻子、嘴巴的特征值提取出来。
识别功能:
该模块是将从图片中提取的特征值和后台数据库中的值进行比较来完成识别功能。
二 开发环境需求分析
1、硬件环境
(1)硬件配置原则
具有可靠性,可用性和安全性,具有完善的技术支持。能够满足个人学习和设计需要。
(2)运行本软件所需的硬件资源
CPU: 800M及以上;内存: 128M及以上
2、软件环境
(1)系统软件配置原则
能够满足该软件的可靠性,可用性和安全性的要求
(2)系统软件配置方案
① 配置有持续工作能力、高稳定性、高度可集成的开放式标准的操作系统,如Windows2000,Windows NT,UNIX,Linux等。
② 配备符合ANSI/ISO标准的高级程序设计语言处理软件。如:Visual C++ 6.0。
③ 熟悉C++高级程序设计语言。
3、 运行环境需求分析
(1)、硬件环境
CPU:500M及以上;内存:64 M及以上。
(2)、软件环境
可以运行在微软公司近年来所出的各种操作系统。如Windows 98、Windows Me、Windows 2000、Windows NT等。
第三节 预处理方案选择
一 设计方案原则的选择
本应用程序的设计方案原则如下:
1、采用较为先进的技术力量,保证应用程序在技术上具备一定的优势。
2、采用成熟的技术,保证应用程序的安全性和可靠性。
3、应用程序便于扩展和维护,易于技术的更新。
4、应用程序充分利用现有的资源,尽量减少不必要的再投资。
5、编写的代码必须严谨易读,代码的解释必须清楚明白,为应用程序的再开发提供应尽的责任。
二 图像文件格式选择
在设计的过程中,为了定位和特征提取的方便,我们采用的是24位位图。
三 开发工具选择
本次设计所用的开发工具是Microsoft Visual C++ 6.0。 Visual C++ 6.0是Microsoft公司推出的一种可视化编程工具。它支持多平台和交叉平台的开发,将各种编程工具如编辑器、连接器、调试器等巧妙的结合在一起,构成一个完美的可视化开发环境。用户无需通过繁杂的编程操作,即可完成Windows下应用程序的编辑、编译、测试和细化等工作。
四 算法选择分析
本文主要研究的对象是图像预处理模块,该模块分为光线补偿、图像灰度化、高斯平滑、图像对比度增强、均衡直方图,每个小模块的实现都有许多相应的算法。下面将本系统采用的算法进行介绍:
·光线补偿 :由于光线原因,所照的图像可能会存在光线不平衡的情况而造成色彩偏差,为了抵消这种整个图像中存在的色彩偏差,本系统采用的解决方法是:将整个图像中的所有像素的亮度从高到低进行排列,取前5%的像素,然后线性放大,使这些像素的平均亮度达到255。实际上就是调整图片像素的RGB值。
·图像灰度化:图像灰度化是将图像变成灰色,本系统中采用以下步骤来实现图像的灰度化:彩色转换成灰度、灰度比例变换、灰度线性变换、灰度线性截断、灰度取反。
·高斯平滑:在图像的采集过程中,由于各种因素的影响,图像中往往会出现一些不规则的随机噪声,如数据在传输、存储时发生的数据丢失和损坏等,这些都会影响图像的质量,因此需要将图片进行平滑操作以此来消除噪声。但是如果平滑不当,就会使图像本身的细节如边界轮廓、线条等变的模糊不清,为了既平滑掉噪声有尽量保持图像细节,本系统采用高斯平滑。
·均衡直方图:使用该模块的目的是通过点运算使输入转换为在每一灰度级上都有相同的像素点数的输出图像。它的实现主要是利用灰度均衡的转换式
DB = f (DA)=
H(u)du 。(式1)
·图像对比度增强:为了将图像的特征一步一步显现出来,需要进行图像的对比度增强,它主要通过对图像的灰度值进行统计,对于小于Low则认为是有关的信息,则将它作为黑色处理,对于处于High以上的则认为是一些无关的信息,将它们去掉,而处于两者之间的,则进行对比度增强,将他们在总的灰度值里面的比例作为新的像素信息保存起来。
第三章 系统的概要设计
本章主要介绍系统的结构设计的流程以及系统各模块的功能及相关原理。
图3-1总体结构设计流程图
图3-2 预处理的层次图
第一节 各模块功能概述
以上是该系统的总体结构设计图以及图像预处理模块的层次图。下面介绍系统中的各模块的功能及算法:
图像获取模块
该模块主要是从摄像头拍照后进行获取图片,也可以从图片库中获取,获取后的图片可以在软件的界面中显示出来以便进行识别。
人脸区域获取
该系统中图像里人脸区域的获取,主要是根据肤色来进行获取,通过肤色非线形分段色彩变换来实现。这一非线性分段色彩变换得到的肤色模型属于色彩空间中的聚类模型,这一类肤色模型的建立首先要选取一种合适的色彩空间。
图像预处理模块
图像预处理就是对获取得来的图像进行适当的处理,使它具有的特征能够在图像中明显的表现出来。该模块中的子模块有如下5个,下面对它们进行概述:
·光线补偿[3]
因为系统得到的图片可能会存在光线不平衡的情况,这会影响我们对特征的提取,同时系统中要用到YcrCB色彩空间,所以有必要对图像进行光线补偿。尽可能将它的特征在图像中表现出来。YcrCB是一种色彩空间,它用于视频系统中,在该色彩空间中,Y分量表示像素的亮度,Cr表示红色分量,Cb表示蓝色分量,通常把Cr和Cb称为色度。YcrCB色彩空间是以演播室质量标准为目标的CC601编码方案中采用的彩色表示模型。
·灰度变化[4]
图像灰度化的过程就是把彩色图像转换为黑白色图像的过程,它也是为了将图像的信息更加具体、简单的表现出来,但是,这样做也将会丢失图像信息。因此,尽可能在转化的过程中用简单的方式表现图像复杂的信息。
·高斯平滑处理[5]
高斯平滑将对图像进行平滑处理,在图像采集过程中,由于各种因素的影响,图像往往会出现一些不规则的噪声,入图像在传输、存储等都有可能产生数据的丢失。从而影响图像的质量。处理噪声的过程称为平滑。平滑可以降低图像的视觉噪声,同时出去图像中的高频部分后,那些本来不明显的低频成分更容易识别。平滑可以通过卷积来实现。经过卷积平滑后的水平投影后,二值化提供了较好的图像效果。
·对比度增强[6]
对比度增强,就是对图像的进一步处理,将对比度再一次拉开。它针对原始图像的每一个像素直接对其灰度进行处理的,其处理过程主要是通过增强函数对像素的灰度级进行运算并将运算结果作为该像素的新灰度值来实现的。通过改变选用的增强函数的解析表达式就可以得到不同的处理效果。
·二值化[7]
二值化的目的是将采集获得的多层次灰度图像处理成二值图像,以便于分析理解和识别并减少计算量。二值化就是通过一些算法,通过一个阈值改变图像中的像素颜色,令整幅图像画面内仅有黑白二值,该图像一般由黑色区域和白色区域组成,可以用一个比特表示一个像素,“1”表示黑色,“0”表示白色,当然也可以倒过来表示,这种图像称之为二值图像。这便有利于我们对特征的提取。该设计中采用组内方差和组外方差来实现二值化。
·直方图均衡[8]
直方图均衡化的目的是使一输入图像转换为在每一灰度级上都有相同的象素点数,它的处理的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布,它的研究思路是:通过直方图变换式来进行直方图的均衡处理,直方图变换式是
但是直方图均衡化存在着两个缺点:
1)变换后图像的灰度级减少,某些细节消失;
2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。
人脸定位模块
人脸定位是将典型的脸部特征(如眼睛,鼻尖,嘴唇等等)标记出来,在本系统中,定位的特征是眼睛,鼻尖和嘴巴三个。由于眼睛具有对称性,因此可以很快就能标记出来,而鼻子是在眼睛下面,且嘴巴在鼻子下面,所以只要眼睛标记好,鼻子和嘴巴也能相应的标记出来。
特征提取模块
特征提取按以下4个步骤进行:
(1)、提取两只眼睛的距离
(2)、眼睛的倾角度
(3)、眼睛、嘴巴的重心
(4)、用一个矩形标出每一个特征
在特征提取完之后将会得到相应的特征值以便存入后台数据库。
识别模块
该模块通过与库存中的特征向量进行比较,找出与特征最相近的参数,再对该参数进一步分析。如果分析在我们所确认的范围内,我们就认为该人就是我们所要找的。然后从库存中提取出该人相关的信息,并显示出来。如果库存中没有,则给出提示是否对存库作为样本。
第四章 系统的详细设计
本章主要对图像处理这一模块进行详细介绍,对其子模块所用到的算法及具体实现进行详细讲述。
第一节 系统的运行流程图
图6-1 系统的运行流程图
第二节 图像处理详细设计
一 位图详细设计
1 设备无关位图(DIB)
VC++没有提供使用十分方便的DIB绘制方法,只好自己去创建一个实用的DIB类了。本系统中建立了一个专门的类DIB来处理设备无关位图,表4-1列出了对位图的操作函数。
函 数 | 功 能 |
ClearMemory() | 释放内存 |
CopyHandle() | 拷贝内存块 |
LoadDIB() | 加载位图信息 |
ReadDIBFile() | 读取位图文件信息 |
LightingCompensate() | 进行光线补偿 |
PixelOffset() | 修正像素值 |
PaintDIBTrue() | 绘制DIB对象 |
GetColorNumber() | 获取颜色总数 |
GetHeight() | 获取DIB高度 |
GetWidth() | 获取DIB宽度 |
GetSize() | 获取图像数据缓冲区中的字节数 |
GetBitCount() | 获取颜色位数 |
GetBiBitCount() | 获取字节数 |
表6-1 Dib类的部分功能
二 图像点处理详细设计
图像点运算是一种既简单又重要的技术,它能让用户改变图像数据占据的灰度范围,一幅输入图像经过点运算后将产生一幅新的输出图像,由输入像素点的灰度值决定相应的输出像素点的灰度值,点运算与局部运算的差别在于:后者每个输出像素的灰度值由对应输入像素的一个领域内几个像素的灰度值决定。所以,点运算不可以改变图像内的空间关系。
点运算可以按照预定的方式改变一幅图的灰度直方图。除了灰度级的改变是根据某种特定的灰度变换函数进行之外,点运算可以看作是“从像素到像素”的复制操作。如果输入图像为A(x,y),输出图像为B(x,y),则点运算可表示为:
B(x,y) = f[A(x,y)] (式2)
其中函数f(D)被称为灰度变换(Gray Scale Transformation ,GST)函数,它描述了输入灰度值和输出灰度值之间的转换关系,一旦灰度变换函数确定,该点运算就完全被确定下来了。
点运算有时又称为对比度增强、对比度拉伸或灰度变换,它是图像数字化软件和图像显示软件的重要组成部分。下面将对本设计解决各图像点处理模块运用进行到的理论和编程实现进行详细讲述。
1、光线补偿
(1)算法思想:
光线补偿的想法的提出主要是考虑到肤色等色彩信息经常受到光源颜色、图像采集设备的色彩偏差等因素的影响,而在整体上偏离本质色彩而向某一方向移动,即我们通常所说的色彩偏冷、偏暖、照片偏黄、便蓝等等。这种现象在艺术照片中更为常见。所以Anil K.Jain等提出,为了抵消这种整个图像中存在着的色彩偏差,我们将整个图像中所有像素亮度(是经过了非线形r-校正后的亮度)从高到低进行排列,取前5%的像素,如果这些像素的数目足够多(例如,大于100),我们就将它们的亮度作为“参考白”(Reference White),也即将它们的色彩的R、G、B分量值都调整为255。整幅图像的其他像素点的色彩值也都按这一调整尺度进行交换。
(2) 具体实现光线补偿功能:
明白了光线补偿这功能的算法及思想,就可以编码实现其功能了,实现过程如下:
①、 编辑菜单IDR_MAINFRAM,先在其中添加一菜单项,将其命名为“预处理”,并在其属性栏中将其设为“弹出”菜单,点击预处理该菜单项将会弹出一个新的子菜单,此时把该子菜单命名为“光线补偿”,并把其ID设为ID_READY_LIGHTINGCONPENSATE,对应文件FaceDetectView.Cpp中的函数ReadyLightingconpensate()实现,并在void CFaceDetectView:: OnReadyLightingconpensate()中添加如下代码:
hDIBTemp = gDib.CopyHandle(hDIB);
gDib.LightingCompensate(hDIB);
GlobalUnlock(hDIB);
Invalidate();
光线补偿功能实质上是用上段代码中的LightingCompensate()函数来进行实现。函数LightingCompensate()是类DIB的一个成员函数。其核心代码如下所述:
//下面的循环对图像进行光线补偿
for(i =0;i<height;i++)
for(int j=0;j<width;j++)
{
//获取像素偏移
lOffset = this->PixelOffset(i,j,wBytesPerLine);
//得到蓝色分量
*(lpData+lOffset) = colorb;
//绿色分量
colorb = *(lpData+lOffset+1);
colorb *=co;
if(colorb >255)
colorb = 255;
*(lpData+lOffset+1) = colorb;
//红色分量
colorb = *(lpData+lOffset+2);
colorb *=co;
if(colorb >255)
colorb = 255;
*(lpData+lOffset+2) = colorb;
}
② 光线补偿的效果图如下所示 :
图 4-1 原图
图4-2 光线补偿效果图
2、 图像灰度化
(1)算法思想
① 彩色转换成灰度
将彩色图像转化为灰阶图像常采用如下的经验式:
gray=0.39×R+0.50×G+0.11×B(式3)
其中,gray为灰度值,R、G、B分别为红色、绿色和蓝色分量值。
② 灰度比例变换
灰度比例变换是把原像素的灰度乘以一个缩放因子,并最后截至[0,255]。
③ 灰度线性变换
当图像由于成像时曝光不足或曝光过度,会产生对比度不足的弊病,从而使图像中的细节分辨不清。将图像灰度进行线性扩展,常能显著地改善图像的外观。灰度线性变换的计算式为:
g =
(式4)
f,其他
式中,f是原像素的灰度,g为变换后的灰度。该变换把属于[a,b]的灰度级变换至灰度区间[c,d],而没有在[a,b]区间的原像素灰度将保持不变。这里a,b,c,d,f,g均为[0,255]之间的整数值。可见,a被映射为c,b被映射为d。
④ 灰度线性截断
灰度线性截断的思想是:如果原像素的灰度小于a,则该像素的灰度等于c;如果原像素的灰度大于b,则该像素的灰度等于d。
(2)具体实现灰度化功能
在明白了灰度化的原理之后,就可进行编码来实现该功能。
① 编辑菜单IDR_MAINFRAM,先在其中添加一菜单项,将其命名为”图像灰度化”,并将其ID号设为ID_READY_SCALE, 对应文件FaceDetectView.Cpp中的函数ReadyLightingconpensate()实现.
② 现该模块的核心代码如下:
获取蓝色分量
ColorB=*(lpData + lOffset);
获取绿色分量
ColorG=*(lpData + lOffset+1);
获取红色分量
ColorR=*(lpData + lOffset+2);
计算灰度值
gray = (ColorG*50+ColorR*39+ColorB*11)/100;
显示灰度图像
*(lpData + lOffset)=gray ;
*(lpData + lOffset+1)=gray ;
*(lpData + lOffset+2)=gray ;
其中lpData是图片数据区,lOffset是图片像素的偏移,gray 是图像的灰度值
③ 图像灰度化效果图:
图 4-3 图像灰度化效果图
3、高斯平滑
(1) 算法思想
在介绍高斯平滑前,先介绍模板操作。模板操作是数字图像处理中经常用到的一种运算方法,图像的平滑、锐化以及细化、边缘检测都要用到模板操作。例如:有一种常见的平滑算法是将原图中一个像素的灰度值和它周围邻近八个像素的灰度值相加,然后求得的平均值(除以9)作为新图中该像素的灰度值,用如下方法来表示该操作:
1 1 1
1/9
1 1· 1
1 1 1
上式类似于矩阵,我们通常称之为模板。中间的黑点表示该元素中心元素,即该个元素是要进行处理的元素。如果模板是:
1· 1 1
1/9 1 1 1
1 1 1
则该操作应该描述为:将原图中一个像素的灰度值和它右下邻近的8个像素的灰度值相加,然后将求得的平均值9(除以9)作为新图中该像素的灰度值。如果模板为 2. ,
1
则表示将自身灰度值的2倍加下边的元素灰度值作为新值,而 2 则表示将自身
1.
灰度值加上边元素灰度值的2倍作为新灰度值。通常模板不允许移出边界,所以处理后的图像会比原图小,例如:当模板是 1. 0 原图灰度值矩阵是 1 1 1 1 1
0 2 2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
时,经过模板操作后的图像为 5 5 5 5 -
8 8 8 8 -
11 11 11 11 -
- - - - -
“-”表示边界上无法进行模板操作的点,一般的做法是复制原图的灰度值,不再进行任何其他的处理。模板操作实现了一种领域运算,即某个像素点的结果不仅和本像素灰度有关,而且和其领域点的值有关。下面对平滑的用途和解决方法进行详细介绍。
在图像的采集过程中,由于各种因素的影响,图像中往往会出现一些不规则的随机噪声,如数据在传输、存储时发生的数据丢失和损坏等,这些都会影响图像的质量。处理噪声点的过程称之为平滑,平滑可以降低图像的视觉噪声,同时除去图像中的高频部分后,那些本来不明显的低频成分更容易识别。而噪声点一般是孤
立的点,噪声点的像素灰度与它们的近邻像素有显著的区别,即灰度变化总在这附近有突变高频。平滑可用卷积来实现,平滑的频率截止点由卷积核的大小及卷积系数决定。用于平滑滤波的卷积核叫做低通过滤波器,低通过滤波器具有如下的特征:1卷积核的行、列数为奇数,通常为3×3的矩阵;2卷积系数以中心点为中心对称分布;3所有的卷积系数都为正数;4距离中心较远的卷积系数的值较小或保持不变;5卷积后的结果不改变图像的亮度。经过卷积平滑后给随后的水平投影、二值化提供了较好的图像效果。水平投影的曲线显得比较平滑,二值化后的图像孤立点比较少。以下是几个常用的卷积核:
1/9 1/9 1/9 1/10 1/10 1/10 1/16 2/16 1/16
1/9 1/9 1/9 1/10 1/5 1/10 2/16 4/16 2/16
1/9 1/9 1/9 1/10 1/10 1/10 1/16 2/16 1/16
L P1 LP2 LP3
通常的处理是:将中心点周围八个点的像素值乘于各自矩阵相应的系数后相加得到一个值,然后将这个值乘上中心点的系数,中心点的像素值赋为得到的最后值。一般来说,不同的噪声有各自针对性的卷积算法。本文使用的卷积算法是高斯卷积核,亦即上面卷积核的LP3。高斯卷积是通过采样2维高斯函数得到的。高斯平滑算法的优点是平滑后图像的失真少,算法更具备通用性,能去除不同的噪声干扰。需要注意的是:在平滑处理时,图像边界点无法处理,因此循环范围应设定在图像边界内。
(2) 具体实现高斯平滑功能
知道高斯平滑原理之后,可进行编码将其实现:
//进行模板操作
Template(tem ,3,3, xishu);
Invalidate(TRUE);
其中tem是模板参数,xishu是模板系数;Template()函数是实现高斯平滑的主要函数,其核心代码是:
for(m=i-((tem_h-1)/2);m<=i+((tem_h-1)/2);m++)
{
for(n=j-((tem_w-1)/2);n<=j+((tem_w-1)/2);n++)
注: 将以点(i,j)为中心,与模板大小相同的范围内的象素与模板对用位置的系数进行相乘并线形叠加
sum+=Gray[m][n]* tem[(m-i+((tem_h-1)/2))*tem_w+n-j+((tem_w-1)/2)];
}
将结果乘上总的模板系数
sum=(int)sum*xishu;
计算绝对值
sum = fabs(sum);
如果小于0,强制赋值为0
if(sum<0)
sum=0;
如果大于255,强制赋值为255
if(sum>255)
sum=255;
HeightTemplate[i][j] = sum;
图4-4 高斯平滑效果图
4、灰度均衡
(1)算法思想
灰度均衡也称直方图均衡,目的是通过点运算使输入转换为在每一灰度级上都有相同的像素点数的输出图像(即输出的直方图是平的)。这对于在进行图像比较或分割之前将图像转化为一级的格式是十分有效的。
按照图像的概率密度函数(PDF,归一化带单位面积的直方图)的定义:
P(x) =
* H(x)(式5)
其中H(x)为直方图,A0为图像的面积,设转换前图像的概率密度函数为
Pr(r),转换后图像的概率密度函数为Ps(S),转换函数为s = f(r),由概率论知识,我们可以得到:
Ps(S) = Pr(r)*
(式6)
这样,如果想使转换后图像的概率密度函数为1(即直方图是平的)则必须满足:
Pr(r)=
(式4-5)
等式两边积分,得:
S = f(r)= ∫0 rP2(u)du =
∫0 r H(u)du (式7)
该转换式被称为图像的累积分布函数
上面的式是被归一化后推导的对于没有归一化的情况,只要求以最大的灰度值(DMax,对于灰度图就是255)即可,灰度均衡的转换式为:
DB = f (DA)=
H(u)du (式1)
对于离散图像转换式为:
DB = f(DA)=
(式8)
式中Hi为第i级灰度的像素个数。
(2)编程实现
在灰度均衡操作同样不需要改变DIB的调色板和文件夹,只要把指向DIB像素起始位置的指针和DIB高度、宽度信息传递给子函数就可以完成灰度均衡变换工作,其核心代码如下:
*(lpData + lOffset)=state ; //显示灰度均衡
*(lpData + lOffset+1)=state ;
*(lpData + lOffset+2)=state ;
(3)效果图
图 4-5 灰度均衡效果图
5、图像对比度增强
在对图像均衡直方图处理以后,便可对图像进行对比度增强,进一步拉开对比度。它通过对图像的灰度值进行统计,对于比最小设定值小的则认为是有关的信息,则将它作为黑色处理,比最大设定值大的则认为是一些无关的信息,将它们去掉,而处于两者之间的,则进行对比度增强,将他们在总的灰度值里面的比例作为新的像素信息保存起来。
这个工作的主要目的是将图像的特征一步一步显现出来。
(2) 编码实现:
① 编辑菜单IDR_MAINFRAM,在菜单“预处理”中添加一子菜单项,命名为“实现图像对比度增强”,并将其ID设为ID_READY_ContrastEnhance。
lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
获取图像灰度增强函数
int state=IncreaseContrast(ZFT[k][k1], 100);
显示灰度增强后的图像
*(lpData + lOffset ) = state ;
*(lpData + lOffset+1) = state ;
*(lpData + lOffset+2) = state ;
其中IncreaseContras()函数是实现图像对比度增强的关键函数,该根据参数n来调节对比度,n越大,对比越强烈,其核心是:
如果数据很小,设置为0
if(pByte<=Low)
return 0;
获得中间数据,并进行对比增强处理
else if ((Low<pByte)&&(pByte<High))
return int(((pByte-Low)/Grad));
如果数据很大,设置为255
else
return 255;
图4-6 对比度增强效果图
第三节 编程时的问题解决
1、光线补偿
由于要改变每一个像素的亮度,开始,我通过对数幅图像使用一个固定的值进行测试,得到的效果都满理想,但是当对更多的图像处理时,该固定值就出现了明显的不足,最后不得不采用全局统计的方法,才能得到比较理想的效果。
2、高斯平滑
高斯平滑用于消除图片噪音,为了实现此功能,我们使用了模板操作,因此模板参数的选择是最重要的。高斯平滑效果的好坏取决与模板参数。在编程的时候,试探性的进行参数的选择,然后进行比较,看那组参数可以达到最好的效果。模板参数是
原先采用了
1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9
形式,但是,得到的效果却是令人失望。
后来又用了
1/10 1/10 1/10
1/10 1/5 1/10
1/10 1/10 1/10
形式,但是,结果仍然是未能达到预期的效果。
直到最后采用的
1/16 2/16 1/16
2/16 4/16 2/16
1/16 2/16 1/16
形式,才得到了比较合理的效果。
3、 均衡直方图
开始时,图像的会度一直都处于很散的状态,而且图像的特征不明显,原本想经过高斯平滑后进行灰度变换,但是并未能成功。经过了一翻苦战,最终找到均衡直方图的办法,经过多次尝试,效果一直处于比较理想的状态。
第五章 结构设计
在本系统中,起至关重要的类列举如下,并将它们的成员函数及其成员函数的功能和参数都一一简述:
1、CFaceDetectView :该类是在编程的过程中自动生成的。菜单项中的事件处理程序都是在该类对应的CFaceDetectView.h文件和CFaceDetectView.cpp文件中声明和实现的。表7-1列出了该类所封装的成员函数及其功能:
表7-1 类 CfaceDetectView的成员
函 数 | 功 能 |
IncreaseContrast () | 增强图像对比度 |
FixeEyes () | 眼睛定位 |
FixeNose() | 鼻子定位 |
FixeMouth () | 嘴巴定位 |
GetEyesParameter () | 获取眼睛参数 |
GetPartParameter() | 获取脸部特征 |
GetmouthParameter () | 获取嘴巴参数 |
Centerofgravity() | 获取眼、鼻子、嘴巴的重心 |
AverageDeviation () | 获取平均值的标准偏差 |
Template() | 对图像进行模板操作 |
DrawCrossX () | 画十字标记 |
各成员函数解析
函数名称 : IncreaseContrast
参数 : int pByte ---- 图像的灰度值
int n ---- 用于调节对比度的参数
返回值 : int ---- 新的灰度值
说明 : 该函数通过修图像的灰度值来增强图像的对比度
函数名称 : FixeEyes
参数 : 无
返回值 : bool
说明 : 该函数判断图片中是否有人脸,并对人脸图片进行眼睛定位
函数名称 : FixeNose
参数 : 无
返回值 : void
说明 : 该函数是在眼睛定位之后的前提下进行鼻子的定位
函数名称 : FixeMouth
参数 : 无
返回值 : void
说明 : 该函数是在眼睛和鼻子都定位之后的前提下再进行嘴巴的定位
函数名称 : GetEyesParameter
参数 : 无
返回值 : void
说明 : 该函数分别获取了眼睛、鼻子、嘴巴的重心之后,再根据两眼间的角度、鼻眼鼻所形成的角、鼻嘴鼻所形成的角、两个眼睛中心距与脸宽的比例来获取眼睛参数。
函数名称 : GetPartParameter
参数 : 无
返回值 : void
说明 : 该函数的功能是用于获取整个脸部的特征
函数名称 : Centerofgravity
参数 : 无
返回值 : void
说明 : 该函数的功能是找出眼睛、鼻子、嘴巴的重心并用十字将它们标记出来
函数名称 : AverageDeviation
参数 : double NewData ---- 新获取的数据
double OldData ---- 以前的数据
返回值 : double ----平均值的标准偏差
说明 : 该函数用于计算平均值的标准偏差
函数名称 : Template
参数 : double * tem ---- 指向模板的指针
HDIB hDIB ---- 图像的句柄
int tem_w ---- 模板的宽度
int tem_h ---- 模板的高度
double xishu ---- 模板的系数
返回值 : 无
说明 : 该函数对图像进行模板操作,但为了方便起见,模板的高度和宽度都是用奇数。
函数名称 : DrawCrossX
参数 : int x
int y
返回值 : 无
说明 : 该函数对已经做好预处理的人脸图像中的特征(眼睛、鼻子、嘴巴)用十字标记出来
表7-2 类ClikelyHood的成员
函 数 | 功 能 |
CalLikeHood () | 计算相似度 |
CalBinary () | 二值化图像 |
filter() | 实现滤波功能 |
CalParameter () | 训练参数 |
各成员函数解析
函数名称 : CalLikeHood
参数 : 无
返回值 : 无
说明 : 该函数用于计算相似度
函数名称 : CalBinary
参数 : 无
返回值 : bool
说明 : 该函数用于将图像二值化
函数名称 : filter
参数 : double** source
返回值 : bool
说明 : 该函数的功能是实现中值滤波
函数名称 : CalParameter
参数 : DirectPath —— Bmp文件路径
返回值 : bool
说明 : 该函数的功能是对参数进行训练
3 类CFaceDetectDoc
表7-3 类CFaceDetectDoc的成员
函 数 | 功 能 |
CopyBitMap () | 拷贝位图 |
MakeBitMap () | 生成新的位图 |
DrawCross () | 画十字形标记 |
Likehood () | 计算相似度 |
各成员函数解析
函数名称 : CopyBitMap
参数 : dest —— 目标位图指针
Source —— 源位图指针
返回值 : bool
说明 : 该函数的功能是拷贝位图
函数名称 : MakeBitMap
参数 : 无
返回值 : 无
说明 : 该函数的功能是生成一个新的位图
函数名称 : DrawCross
参数 : pDC-CDC指针
point-要画的点的坐标
crColor-标记得颜色
返回值 : 无
说明 : 该函数用于画十字形标记
函数名称 : Likehood
参数 : int m_WndWidth ——图片高度
int m_WndHeight —— 图片宽度
返回值 : 无
说明 : 该函数用于计算相似度
4、类DIB
函 数 | 功 能 |
CopyHandle() | 拷贝内存块 |
ReadDIBFile() | 读取位图文件信息 |
LightingCompensate() | 进行光线补偿 |
PixelOffset() | 修正像素值 |
GetHeight() | 获取DIB高度 |
GetBiBitCount() | 获取字节数 |
表7-4 类Dib的成员
各成员函数解析
函数名称 : CopyHandle
参数 : HANDLE hSrc —— 要拷贝的内存区域
返回值 : HANDLE —— 拷贝后的新内存区域
说明 : 该函数拷贝指定的内存区域,返回复制后的新内存区域,出错时返回NULL
函数名称 : ReadDIBFile
参数 : HANDLE hFile —— 要读取的文件hFile
返回值 : HDIB —— 成功返回DIB的句柄,否则返回NULL
说明 : 该函数拷贝指定的内存区域,返回复制后的新内存区域,出错时返回NULL
函数名称 : PixelOffset
参数 : int i,j
WORD wBytePerLine —— 图像每行的字节数
返回值 : long —— 图像像素数据的偏移
说明 : 该函数计算图像像素数据的偏移
函数名称 : GetHeight
参数 : 无
返回值 : long —— 图片高度
说明 : 该函数返回图像的高度
函数名称 : GetBitBitCount
参数 : 无
返回值 : int —— 图片字节数
说明 : 该函数返回图片字节数
第六章 测试
测试是为了找出程序的错误。正如测试的规则所确定的一样:测试是为了发现程序中的错误而执行程序的过程;好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;成功的测试是发现了迄今为止尚未发现的错误的测试。
第一节 测试的原则
1、应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。
2、测试用例应由测试输入数据和与之对应的预期输出结果两部分组成。 3、程序员应避免检查自己的程序。(注意不是指对程序的调试)
4、在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。不合理的输入条件是指异常的,临界的,可能引起问题异变的输入条件。
5、充分注意测试中的群集现象。经验表明,测试后程序残存的错误数目与该程序中以发现的错误数目或检错率成正比。应该对错误群集的程序段进行重点测试。
6、严格执行测试计划,排除测试的随意性。测试计划应包括:所测软件的功能,输入和输出,测试内容,各项测试的进度安排,资源要求,测试资料,测试工具,测试用例的选择,测试的控制方法和过程,系统的组装方式,跟踪规则,调试规则,以及回归测试的规定等等以及评价标准。
7、应当对每一个测试结果做全面的检查。
8、妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。
知道了测试的目的和测试的原则之后,现在进行软件的具体测试,对软件的功能实现进行详细的测试。
第二节 测试方案
本系统主要由图像处理、人脸定位、特征提取、识别四个部分组成,而图像处理对于后面的工作结果好坏起着至关重要的作用,因此从软件开发的最初阶段我们就要对软件进行不断的测试,对图像处理模块中的各个子模块进行测试以便检测经过处理后的图像效果是否达到预期的效果。下面对图像处理模块的测试过程进行描述:
图像处理模块 :该 模块分为光线补偿、图像变成灰色、均衡直方图、实现图像对比度增强、二值化处理。对该模块进行测试的方法是:采用多张24位的彩色图像来进行逐一测试,看这些图片经过处理后是否达到预期的效果,如光线补偿模块,则检测所测图片的亮度是否变强;图像灰度化模块的检测则需看所测的彩色图片是否变成灰色;高斯平滑的实现采用了模板操作,因此模板参数的选择对其十分重要,先用图片进行测试来检测平滑效果,如果效果不理想则继续选择模板参数,直至效果理想为止;图像对比度增强是为了将图像的特征一步一步显现出来,在测试的过程中,用含人脸的图片进行检测看是否图像的特征显示出来的是否足够明显。
经过测试之后,光线补偿模块将图像的像素亮度增强,并使图片中的光线达到平衡;图像灰度化模块达到了预期的效果,将图片转变为灰色;高斯平滑模块能有效的消除图像噪音,提高了图像质量;而增强图像对比度模块能够较好的把图像特征表现出来。
结束语
一 应用程序特点
1、人脸识别应用程序采用Visual C++6.0作为开发工具,利用MFC采用面向对象的方法,用C++语言编写程序。
2、应用程序的的各个类具有相同的编程模式,且都是一次性制作的,代码简洁,编程效率高。
3、将面向对象的编程技术直接应用于图像处理知识,并按功能进行细化,建立通用的类,从而减少了繁琐性,增加代码的可重用性和可移植性,提高了效率。
4、本设计中建立的多层次类结构都是可以修改和维护的。所有的类都是开放的,可以向其中添加新方法以支持新功能,而不会对原有功能构成任何威胁。
5、使用操作界面友好,提示信息清晰,用户操作简便。可以用菜单、对话框选择不同的处理算法。
编程技术直接应用于图像处理知识,并按功能进行细化,建立通用的类,从而减少了繁琐性,增加代码的可重用性和可移植性,提高了效率。
4、本设计中建立的多层次类结构都是可以修改和维护的。所有的类都是开放的,可以向其中添加新方法以支持新功能,而不会对原有功能构成任何威胁。
5、使用操作界面友好,提示信息清晰,用户操作简便。可以用菜单、对话框选择不同的处理算法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。