您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > VC++课程设计-图像直方图处理均衡化处理MFC
课程设计报告课程:VC++面向对象程序设计项目:图像直方图处理班级:通信1103姓名:学号:时间:2013~2014学年上学期13周2目录第一部分进程安排……………………………………………….第二部分实践内容……………………………………………….1、项目名称………………………………………………2、实践目的与要求………………………………………3、实践工具与准备………………………………………4、课程设计报告格式及要求……………………………第三部分实践过程……………………………………………....1、项目名称…………………………………………………2、实践目的与要求…………………………………………3、实验前准备……………………………………………....4、实验分析…………………………………………………5、实现步骤………………………………………………第四部分测试与结论……………………………………………………第五部分实践总结………………………………………………第六部分实践心得……………………………………………….第七部分参考文献……………………………………………….3第一部分进程安排本次实践时间为两周,共5天。具体时间安排如下:序号内容安排天数1布置实践任务(由指导老师指定课题,分配任务,讲解整个实践的整体要求。)0.52查资料、定方案(学生根据课题要求查找相关资料,并确定整个设计方案。)0.53编写方案和程序流程报告(学生自己设计方案和程序流程,形成书面报告)14方案评估(学生在课上给出方案分析;指导老师对学生提交的方案进行综合评估,总结几种较好的设计方案进行实践)。0.5(星期三上午)4编写程序与调试(学生根据方案和程序流程编写程序并且调试)1.56实践总结(学生完成实践报告,指导老师对学生设计进行评估定级)1第二部分实践内容一、项目名称:图像直方图处理二、实践目的与要求1.了解BMP图像的基本格式;2.了解BMP图像文件的打开和存储;3.利用VC编写BMP图像的打开和存储的程序;4.了解对灰度图像进行直方图统计的过程;5.在计算机上调试程序。6.直方图是对图像每一亮度间隔内像元频数的统计。它描绘了图像的总概貌,4给出了图像亮度与颜色范围、每个亮度间隔的频数、像元依亮度分布的形态以及彩色分量的色调。但不知道某一亮度值像元出现的概率处于什么位置。将一幅图像划分成一些子图像,整个图像的直方图等于各个子图像的直方图之和,不同的图像可能具有相同的直方图。利用直方图可检验输入图像亮度值在量化范围内是否分配得恰当,图像数字化后的灰度级与实际占用灰度级的提高了很多,有很好的对比度。试开发一个图像直方图处理软件,要求如下:1、菜单式的人机界面。2、具有文件处理功能3、图像直方图处理部分应具有直方图均衡化(非适应性直方图修正)和直方图规定化(适应性直方图修正)两个模块。三、实验前准备1.预习本实验中关于BMP图像文件的基本格式;2.了解本实验的目的和实验内容。3.在开始实验前,应回顾或复习相关内容。需要一台计算机,其中安装有VisualC++6.0、VisualC++2005、VisualC++2005Express、等集成开发环境软件。四、实验分析(一)、原理分析1、灰度直方图直方像图反映了图的像素的灰度分布是反映一幅图像中的灰度级与出现这种灰度级的像素的概率之间关系的图形。直方图的横坐标为灰度级(用r表示),纵坐标是具有该灰度级的像素个数或出现此灰度级的概率P(rk)。设N(=a×b)为一幅图像中像素总数,nk为第k级灰度的像素数;rk表示第k个灰度级。则:P(rk)=nk/N(归一化后k级灰度像素数)定义:反映各灰度级出现频数的分布情况,进而反映图像对(清晰)度,但不反映各灰度级的空间位置分布。图像的(灰度统计)直方图是一个一维的离散函数。它的定义为:设sk为图像f(x,y)的第k级灰度值,nk是f(x,y)中具有灰度值sk的象素的个数,n是图像象素总数,则:ps(sk)=nk/nk=0,1,,L-1称为图像f(x,y)的直方图。这里ps(sk)代表原始图中第k个灰度级的出现概率。以nk为自变量,以ps(sk)为函数,得到的曲线就是图像的直方图,在实际中常常直接将对第k个灰度级的统计值5nk作为图像的直方图。它提供了原图灰度值的分布情况,也可以说给出了一幅图所有灰度值的整体描述。对灰度图像进行直方图统计的程序流程图如图2-2所示。图2-2灰度图像直方图统计流程2、直方图均衡化如上面所述,一幅给定的图像的灰度级分布在0≤r≤1范围内。可以对[0,1]区间内的任一个r值进行如下变换也就是说,通过上述变换,每个原始图像的像素灰度值r都对应产生一个s值。变换函数T(r)应满足下列条件:(1)在0≤r≤1区间内,T(r)单值单调增加;(2)对于0≤r≤1,有0≤T(r)≤1。这里的第一个条件保证了图像的灰度级从白到黑的次序不变。第二个条件则保证了映射变换后的像素灰度值在允许的范围内。3、直方图规定化希望能够有目的地增强某个灰度区间的图像,即能够人为地修正直方图的形状,使之与期望的形状相匹配,这就是直方图规定化的基本思想。换句话说,希望可以人为地改变直方图形状,使之成为某个特定的形状,直方图规定化就是针对上述要求提出来的一种增强技术,它可以按照预先设定的某个形状来调整图像的直方图。直方图规定化是在运用均衡化原理的基础上,通过建立原始图像和期望图像之间的关系,选择地控制直方图,使原始图像的直方图变成规定的形状,从而弥补了直方图均衡不具备交互作用的特性。4、BMP图像文件格式BMP图像文件是MicrosoftWindows所规定的图像文件格式。随着Windows的风行全球,BMP图像文件也就成为PC机上流行的图像文件格式。BMP图像文件具有下列六项特色。(1)文件结构只能存放一幅图像。(2)可以存储单色、16色、256色和全彩色四种图像数据。(3)图像数据可选择压缩或不压缩处理(4)Windows设计了两种压缩方式:RLE4和RLE8。RLE4处理16色图像数据;而RLE8则是压缩256图像数据。(5)图像数据排列顺序,与一般图像文件有所不同。(6)调色板的数据结构特殊。(二)课程设计项目的实现方法1、直方图均衡化过程(算法):(1)列出原始图灰度级rk;(2)统计原始直方图各灰度级像素数nk;输入图像按照图像中灰度的级数建立数组G(i)如果f(x,y)=i,则,G(i)=G(i)+1输出直方图)(rTs6(3)计算原始直方图各概率:pk=nk/N;(4)计算累计直方图:sk=Σpk;(5)取整Sk=int{(L-1)sk+0.5};(6)确定映射对应关系:rksk;(7)统计新直方图各灰度级像素nk';(8)用pk(sk)=nk'/N计算新直方图。利用VisualC++中提供的MFC框架设计一个简单的应用程序框架,具有图像显示,图像直方图均衡、直方图规定化、直方图、直方图均衡后图像等菜单栏,再利用C++具有面向对象程序设计的性质,编写程序代码实现MFC框架中对应菜单栏中的图像处理的功能,即可得到一个简易的图像处理系统,达到课程考核题目的要求。本次课程考核设计了一个简单的图片处理系统,主要具有以对话框的形式显示原始图片(bmp格式)、显示原图像的直方图、图像直方图均衡化、图像直方图规定化、显示均衡化和规定化处理后的直方图的功能2、类声明与核心算法程序代码voidCBitmapView::OnPointEqua(){//灰度均衡//获取文档CBitmapDoc*pDoc=GetDocument();//指向DIB的指针LPSTRlpDIB;//指向DIB象素指针LPSTRlpDIBBits;//锁定DIBlpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc-GetHDIB());//找到DIB图像象素起始位置lpDIBBits=::FindDIBBits(lpDIB);//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的直方图均衡,其它的可以类推)if(::DIBNumColors(lpDIB)!=256){//提示用户MessageBox(目前只支持256色位图的直方图均衡!,系统提示,MB_ICONINFORMATION|MB_OK);//解除锁定::GlobalUnlock((HGLOBAL)pDoc-GetHDIB());7//返回return;}//更改光标形状BeginWaitCursor();//调用InteEqualize()函数进行直方图均衡InteEqualize(lpDIBBits,::DIBWidth(lpDIB),::DIBHeight(lpDIB));//设置脏标记pDoc-SetModifiedFlag(TRUE);//更新视图pDoc-UpdateAllViews(NULL);//解除锁定::GlobalUnlock((HGLOBAL)pDoc-GetHDIB());//恢复光标EndWaitCursor();}*函数名称:*InteEqualize()**参数:*LPSTRlpDIBBits-指向源DIB图像指针*LONGlWidth-源图像宽度(象素数)*LONGlHeight-源图像高度(象素数)**返回值:*BOOL-成功返回TRUE,否则返回FALSE。**说明:*该函数用来对图像进行直方图均衡。************************************************************************/BOOLWINAPIInteEqualize(LPSTRlpDIBBits,LONGlWidth,LONGlHeight){//指向源图像的指针8unsignedchar*lpSrc;//临时变量LONGlTemp;//循环变量LONGi;LONGj;//灰度映射表BYTEbMap[256];//灰度映射表LONGlCount[256];//图像每行的字节数LONGlLineBytes;//计算图像每行的字节数lLineBytes=WIDTHBYTES(lWidth*8);//重置计数为0for(i=0;i256;i++){//清零lCount[i]=0;}//计算各个灰度值的计数for(i=0;ilHeight;i++){for(j=0;jlWidth;j++){lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*i+j;//计数加1lCount[*(lpSrc)]++;}}//计算灰度映射表for(i=0;i256;i++){//初始为0lTemp=0;for(j=0;j=i;j++){lTemp+=lCount[j];}//计算对应的新灰度值bMap[i]=(BYTE)(lTemp*255/lHeight/lWidth);}//每行for(i=0;ilHeight;i++){//每列for(j=0;jlWidth;j++){//指向DIB第i行,第j个象素的指针lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;//计算新的灰度值*lpSrc=bMap[*lpSrc];9}}//返回returnTRUE;}五、实现步骤根据BMP图像文件的基本格式,利用VC编写8bits无压缩BMP图像文件的打开和存储的程序;编写对灰度图像进行直方图统计的程序,并将结果显示在屏幕上。1、总体流程图2、参考步骤和程序打开VC程序——文件——新建——工程中的MFCAppWizard(exe),在工程下面的框中输入工程名(假定工程名为111),点确定——选多重文档,点下一个——后面都点下一个直到完成确定,基本框架就完成了,下面就加代码。这时VC界面上左边框的下面有三个按钮:ClassView、ResourceView和FileView,ClassView里面是工程111的类:CAdoutDlg、CChildFrame、CMy
本文标题:VC++课程设计-图像直方图处理均衡化处理MFC
链接地址:https://www.777doc.com/doc-6327162 .html