图像处理,实验报告4
I期业•若二弁死琴位 实验报告单 位(条)计算机学院 名业 计算机科学与技术琪皴12计科4 ■名 郝耀峰 修号 1250312025 同狙人 无 实验宦S4305 绥号 日期 2015.4. 16 镖程数字图像处理 指导老啊 鲁静 成镯 实脸项可偏号 04 试脸项司名私 点运算之直方图均衡化 一、度岭目的 1、参照程序中“点运算-〉线性变换“函数,编写完成灰度均衡功能 的函数OnPointEqua()和InteEqualize(),并加入到程序的相应位 置。 2、运行程序观察直方图均衡化的效果。 %1. 就珍林境(仗器残备,软件筹) Win7 VC++6.0 三、实岭原理(我要求) 直方图的均衡化是把原始图像的灰度直方图从比较集中的某个区域 变成全部灰度范围内的均匀分布,实际上是对图像进行非线性拉伸。 使一定灰度范围内的像素个数大致相同。这样就能增强图像的局部对 比度,亮度可以更好的在直方图上分布。 四,实验岁瞭 void CChl_I View::OnPointEqua() { //灰度均衡 //获取文档 CChl_lDoc* pDoc = GetDocument(); //指向DIB的指针 LPSTR IpDIB; //指向DIB象素指针 LPSTR IpDIBBits; //锁定DIB IpDIB = (LPSTR)::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 〃找到DIB图像像素的起始位置 lpDIBBits=::findDIBBits(lpDIB); 〃判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平移,其它的可以类推) if (::DIBNumColors(lpDIB) != 256) { //提示用户 MessageBox(“目前只支持256色位图的平移! ”,”系统提示”, MB_ICONINATION I MBJ3K); //解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); //返回 return; //更改光标形状 BeginWaitCursor(); //调用InteEqualize()函数进行直方图均衡化 ::InteEqualize(lpDIBBits,::DIBWidth(lpDIB),::DIBHeight(lpDIB)) //设置脏标记 pDoc->SetModifiedFlag(TRUE); //更新视图 pDoc->UpdateAHViews(NULL); //解除锁定 ::GlobalUnIock((HGLOBAL) pDoc->GetHDIB()); 〃恢复光标 EndWaitCursor(); BOOL WINAPI InteEqualize(LPSTR IpDIBBits, LONG IWidth, LONG IHeight) { //指向源图像的指针 unsigned char* IpSrc; 〃临时变量 LONG ITemp; //循环变量 LONG i; LONG j; //灰度映射表 BYTE bMap[256]; //灰度映射表 LONG lCount|256]; //图像每行的字节数 LONG ILineBytes; //计算图像每行的字节数 ILineBytes = WIDTHBYTES(!Width * 8); 〃重置计数为0 for(i=0;iv256;i++) 〃清零 lCount[i]=0; 〃计算各个灰度值 for(i = 0; i < IHeight; i++) { //每列 for(j=0; j vlWidth;j++) ( //指向DIB第i行,第j个象素的指针 IpSrc = (unsigned char*)lpDIBBits ■ ILineBytes * i + j; //计算新的灰度值 ICount[*lpSrc]++; } ) //计算灰度映射表 for (i = 0; i <= 256; i++) { lTemp=0; for(j=0;j<=i;j++) ( lTemp+=lCount[j]; } 〃计算对应的新的灰度值 bMap[i]=(BYTE)(lTemp*255/lHeight/lWidth); } //每行 for(i = 0; i < IHeight; i++) ( //每列 for(j=0;j