青岛大学本科生毕业论文(设计)
3.3 图像平滑滤波
人脸图像在采集过程中,受到各种因素的干扰,并将收到干扰的信息保留在图像中。为了避免噪声对图像的特征抽取的影响,需要消除噪声,消除噪声的主要方法分为两类:一类是全局处理,包括Wiener滤波、Kal-man滤波等方法。二类是使用局部算法,如均值滤波、中值滤波、梯度倒数加权滤波等经典算法。基于实现方式的简易度,我们采用的是均值滤波的方式。
均值滤波就是每一个像素值用其局部邻域内的所有值的平均值来代替,数学公式如下:
1f(k,l) (3-5) ?m(k,l)?N其中m为邻域内像素点的总数。如在像素点(i,j)处取3x3的邻域,这样得到公式如下:
h(i,j)?1i?1j?1h(i,j)???f(k,l) (3-6)
9k?i?1l?j?1其中值得注意的是邻域N控制着滤波程度,对应卷积模板的大尺度会加大滤波能力,但是这样会导致图像细节的损失。
设计线性平滑滤波器时,为使得滤波器只有一个峰值要合适的选择滤波权值,并且权值模版在水平和垂直方向上都是对称的,以下就是一个典型3x3平滑滤波器的权值模板:
?1?16??1?8?1???161814181?16??1? 8??1??16?线性平滑滤波器过滤掉了高频成分和图像中的锐化细节。如把阶跃变化过渡,平滑成逐渐变化,使得精确定位的能力下降[4]。
程序中实现的核心代码如下: average=(1/4*data[i*width+j]+
1/8*data[i*width+j-1]+ 1/8*data[i*width+j+1]+ 1/8*data[(i-1)*width+j]+ 1/16*data[(i-1)*width+j-1]+ 1/16*data[(i-1)*width+j+1]+ 1/8*data[(i+1)*width+j]+ 1/16*data[(i+1)*width+j-1]+ 1/16*data[(i+1)*width+j+1])/9;
filterData[i*width+j]=(int)(average) filterData[i]=(filterData[i]-min)*255/(max-min);
3.4 边缘检测
图像的边缘是图像非常重要的特征因为原始图像中的大部分相当重要的信息保留在了图像的边缘中。为了使得总的数据量减少,同时为后续特征提取的计算量减少,因此使
10
青岛大学本科生毕业论文(设计)
用图像边缘检测技术。提取图像边缘的标准是在灰度图像中灰度值变化剧烈的地方。
边缘的衡量常由灰度值的剧烈变化来表示,由此我们想到在数学上,最直观的模型就是微分。在进行微分之前,我们应该对要输入的图像进行噪声消除处理,以来保证图像中的高频成分与原始图像中的一致。
比较经典的常用的算法有:差分边缘检测、Roberts边缘检测算子、Sobel边缘检测算子、Prewitt边缘检测算子等。本文就是采用Sobel算子进行图像的边缘检测。
对于数字图像而言,可以用一阶差分来代替一阶微分。对图像x, y两个方向进行差分:
?xf(x,y)?f(x,y)?f(x?1,y) (4-7)
?yf(x,y)?f(x,y)?f(x,y?1) (4-8) 求梯度时,对平方和的开方运算,可以用两个分量的绝对值之和来表示。如下公式:
Gf(x,y)?(?xf(x,y))2?(?yf(x,y))2?xf(x,y)+?yf(x,y) (4-9)
Sobel算子是一种基于梯度幅值的计算方法,通过对数字图像f(x ,y)的每一个像素的四邻域点的灰度值的加权差,与邻点的权值大小。先做成加权平均,再微分,再求梯度。具体的算法表达如下:
?xf(x,y)?f(x?1,y?1)?2f(x,y?1)?f(x?1,y?1) (4-10)
?f(x?1,y?1)?2f(x,y?1)?f(x?1,y?1)?yf(x,y)?f(x?1,y?1)?2f(x?1,y)?f(x?1,y?1) (4-11)
?f(x?1,y?1)?2f(x?1,y)?f(x?1,y?1)根据以上推论,定义Sobel算子如下:
s(x,y)??xf(x,y)??yf(x,y) (4-12)
Sobel算子通过这两个模板在图像区域中移动,完成图像中每个像素点与这两个卷积核的卷积运算,其核心是两个3x3的卷积和。 Sobel算子的卷积和如下:
??101???Sx???202?,??101????121???Sy??000?
??1?2?1???鉴于算法的复杂度非常大,本文采用库函数实现图像的边缘检测,具体实现核心代码如下:
pImgSobelgray = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_16S,1); cvSobel(pImg8uSmooth,pImgSobelgray,0,1,3);
3.5 人脸部位提取
由于用手机提取照片时,提取的照片中常常含有丰富的背景信息,这就为后续的识别步骤带来了困难。本文将通过编程实现检测函数,对人脸部位进行检测,并将人脸部位保
11
青岛大学本科生毕业论文(设计)
存为图像存储下来供后面识别,这样就减少了背景对识别的影响。
检测图像中的人脸,利用库函数vHaarDetectObjects( ),函数原型如下: CvSeq*cvHaarDetectObjects(constCvArr*image, CvHaarClassifierCascade*cascade, CvMemStorage* storage, double scale_factor=1.1, int min_neighbors=3, int flags=0, CvSize min_size=cvSize(0,0) );
12
青岛大学本科生毕业论文(设计)
第四章 基于Android的人脸检测技术原理
4.1 Android编程平台
4.1.1 Android 开发平台搭建
本文android开发平台是在Windows环境下搭建的,具体方法步骤如下:
在Oracle官方网站上可以免费下载最新的JDK安装程序包,网址为:http://www.oracle.com.下载完成后打开,按照默认路径安装JDK软件包。点开开始菜单,在CMD命令窗口输入java -version命令检查是否成功安装程序包。若成功安装会显示出JDK版本号等相关信息。下一步就是配置环境变量:在系统环境变量里添加PATH变量,内容为JDK安装目录中bin文件夹下,并同时增加CLASSPATH变量,内容为JDK安装目录中lib和demo的路径。是用;来做分隔符的。
登陆Android官方网站http://developer.android.com,下载最新版本的SDK安装包,也可下载以往版本的SDK安装包。下载完成后解压,不需要安装。但是要同样需要配置环境变量。将SDK解压后的目录下的tools目录的绝对路径添加到系统Path中,然后同样用DOS CMD 命令 android –h检查是否安装成功。
登陆Eclipse官方网站http://www.eclipse.org,下载适用版本的Eclipse。将下载完成的Eclipse安装包解压硬盘。双击eclipse.exe打开eclipse软件,在Help->Install New Software,安装ADT。完成后重启,在Widows->Preferences下选择android->Browse添加android SDK路径,单击OK完成。
这样android开发环境基本搭建完成。Android开发环境搭建好了就可已进行android应用程序的开发了。
4.1.2 Android开发简介
Android平台是在Linux 2.6.25 版本的基础上改造的,提供了各种的函数库和应用程序的完整框架。Android大体上分为4层:Linux内核,程序库,应用程序框架以及应用程序。具体参看图4.1:Android平台架构图。
13
青岛大学本科生毕业论文(设计)
图4.1 Android平台架构图
应用程序是包括Android平台配置的一套应用程序集,以及用户基于Android平台的应用程序框架,使用Java语言自行开发的程序。
应用程序框架:开发者可以完成使用与那些内核应用程序相同的,用于简化和重用应用程序的组件的框架。通过应用程序,用户自定义的程序可以执行用户程序之外的预设功能,这样可以极大的减少用户程序的额外工作量。
系统开发库:Android定义了一套C/C++ 库供 Android 平台的其他组件使用。这些功能通过Android应用程序框架提供给开发者,开发者不能直接使用这些库[14]。
Linux内核:Android的核心系统服务依赖于Linux2.6内核,如内存管理、进程管理、驱动模型等。Linux内核也同时作为硬件和软件栈之间的抽象层[14]。
4.2 人脸图像获取
4.2.1 Android 应用程序组件(Activity简介)
在 android 中,Activity 拥有四种基本状态,即Active/Running状态、Paused状态、Stopped状态、Killed 状态。
14