初春岭:人脸面部特征提取技术的研究
第4章 系统详细设计
本章主要对图像处理这一模块进行详细介绍,对其子模块所用到的算法及具体实现进行详细讲述。
4.1 系统的运行流程图
? 启动本系 统,进入人脸识别系统界面。 ? 点击打开图象,选取所需要的图片 对图片进行光线补偿、将图片变成灰色、实现图片对比度增强,二值化变换等一系列预处理。 将处理好的人脸图片进行定位,标出眼睛、鼻尖和嘴巴。 图4-1 系统流程图
4.2 图像处理详细设计 4.2.1图像灰度化
彩色图像包含较多人脸特征信息,但是直接作为处理对象会使过程复杂化。相比之下灰度图像在保留了人脸主要特征信息的基础上,减少了总信息量。
(1) 算法思想
灰度化的处理方法主要有3种:
① 最大值法:使RGB的值等于3值中的最大一值,即,
R?G?B?max(R,G,B) 式(4.1) 14
2008届计算机科学与技术专业毕业设计(论文)
最大值法会完成亮度很高的灰度。
② 平均值法:取R,G,B的平均值,即,
R?G?B?(R?G?B)3 式(4.2)
平均值法会完成比较柔和的灰度。
③ 加权平均值法:根据重要性或其他指标给R,G,B赋予不同的权值,并使RGB的加权值平均,即,
R?G?B?(WRR?WGG?WBB)3
式(4.3) 其中WR,WG,WB分别为R,G,B的权值。实验和理论推导证明当
WR3?0.30,WG3?0.59,WB3?0.11 时,即当,
cgray?0.30R?0.59G?0.11B
式(4.4) R?G?B?cgray 式(4.5)
时,能得到最合理的灰度图像。
(2) 具体实现灰度化功能
① 在明白了灰度化的原理之后,就可进行编码来实现该功能。在编辑界面
中添加一个按钮控件,将其命名为‘灰度化’,并其ID号设为IDC_BTHD, 对应文件CFaceDetectDlg.Cpp中的函数OnBthd()实现.
②现该模块的核心代码如下:
//编写就算像素点灰度值的函数
int CPreProcess::CalGray1(int blue,int green,int red) {
15
初春岭:人脸面部特征提取技术的研究
//利用灰度计算公式
int ColorGray=(int)((green * 59 + red * 30 + blue * 11) / 100); }
return ColorGray;
//将像素值限制在0到255 if (ColorGray<0) { }
else if (ColorGray>255) { }
ColorGray=255; ColorGray=0;
//编写OnBtGray()函数 //获取红色分量
int ColorRed=m_tOriPixelArray[i][j].rgbRed;
//获取绿色分量
int ColorGreen=m_tOriPixelArray[i][j].rgbGreen;
//获取蓝色分量
int ColorBlue=m_tOriPixelArray[i][j].rgbBlue; //调用函数,计算灰度值
int cgray=method3->CalGray1(ColorBlue ,ColorGreen , ColorRed ) ; //显示灰度图像
m_tResPixelArray[i][j].rgbBlue = m_tResPixelArray[i][j].rgbGreen = m_tResPixelArray[i][j].rgbRed =cgray;
//重置位图
MakeBitMap( );
16
2008届计算机科学与技术专业毕业设计(论文)
}
//method3是定义的一个函数指针,定义如下:
CPreProcess *method3;
//初始化如下
method3 = new CPreProcess(m_tOriPixelArray,m_nWndWidth,m_nWndHeight);
③ 图像灰度化效果:
图4-2 图像灰度化
4.2.2 灰度变换
按照一定的规律修改像素的灰度值,使图像的亮度或者对比度发生改变,使之
17
初春岭:人脸面部特征提取技术的研究
更易于分辨,达到更好的视觉效果。
(1) 具体实现功能
进行编码来实现该功能:
在编辑界面中添加一个滑动条控件和文本编辑器,将其命名为‘灰度化变换’,并其ID号分别设为IDC_SLIDER1, IDC_EDIT1,对应文件CFaceDetectDlg.Cpp中的函数OnReleasedcaptureSlider1()和OnChangeEdit1()实现。
打开ClassWizard的Member Variables标签,给每个控件添加所需的成员变量,参数如下:
表4.1 空间ID号 IDC_SLIDER1 IDC_EDIT1
变量类型 CSliderCtrl int 变量名 m_Slider m_Gray 范围和大小 ―― 0~255 在滑动条的消息处理函数OnReleasedcaptureSlider1()中设置滑动条的值使它等于文本编辑框的初始值。代码为:
//设置滑动条的初始值
m_Slider.SetPos(m_Gray);
//刷新界面
UpdateData(true);
在滑动条的消息处理函数OnReleasedcaptureSlider1()中进行灰度化变换,将滑动条的值赋给灰度,并将其控制在【0,255】之间。代码为:
cgray+=m_Gray;
18
if (cgray<0) {