1、Visual C+实践与提高数字图像处理与工程应用篇第三章学习笔记第三章 图像增强线性灰度变换/* * 函数名称: * GrayLinTrans() * 输入参数: * LPSTR lpDIBBits /指向源图像的像素指针 * LONG lmageWidth /源图像的宽度 * LONG lmageHeight / 源图像的高度 * int oralow / 原始图像的灰度值集中区域低值 * int orahig / 原始图像的灰度值集中区域高值 * int newlow / 变换后图像灰度的动态范围低值 * int newhig / 变换后图像灰度的动态范围高值 * 返回值: * BOOL
2、 / 成功返回TRUE,否则返回FALSE。 * 说明: * 该函数用来对图像指定的灰度分布进行灰度变换主要用来实现灰度分布的扩展*/BOOL GrayLinTrans(LPSTR lpDIBBits, LONG lmageWidth, LONG lmageHeight,int oralow, int orahig, int newlow, int newhig) unsigned char* lpSrc; / 指向源图像的指针 int i; / 循环变量 int j; / 循环变量 BYTE byMap256; / 定义灰度映射表 for (i = 0; i 0) /判断新灰度级是否大于0
3、byMapi = newlow; /赋予新值 else byMapi = 0; /直接赋值为0 for (; i = orahig; i+) if (orahig != oralow) / 判断orahig是否等于oralow(防止 /分母为0) /线性变换 byMapi = newlow + (BYTE) (newhig - newlow) * (i - oralow) / (orahig - oralow); else byMapi = newlow; /直接赋值为newlow for (; i newhig; i+) if (newhig = 255) /判断d是否大于255 byMap
4、i = newhig; /直接赋值为newhig else byMapi = 255; /直接赋值为255 for(i = 0; i lmageHeight; i+) /对图像的每个像素值进行变换 for(j = 0; j GetHObject(); / 锁定DIB lpDIBBits = pDoc-m_dib.GetBits(lpDIB); / 找到DIB图像象素起始位置 if (pDoc-m_dib.GetColorNum(lpDIB) != 256) / 判断是否是256色位图 MessageBox(目前只支持256色位图!, 系统提示 , MB_ICONINFORMATION | MB
5、_OK); / 如果不是,提示用户 :GlobalUnlock(HGLOBAL) pDoc-GetHObject(); / 解除锁定 return; / 返回 CGrayEnhance gray; /重载灰度变换对话框类 if (gray.DoModal() != IDOK) / 显示对话框,提示用户设定参数 return; / 返回 /定义四个变量用于存贮对话框设置的参数 int newhig; /新灰度上限 int newlow; /新灰度下限 int orahig; /旧灰度上限 int oralow; /旧灰度下限 newhig=gray.m_newhig; / 获取用户设定的参数 n
6、ewlow=gray.m_newlow; / 获取用户设定的参数 orahig=gray.m_orahig; / 获取用户设定的参数 oralow=gray.m_oralow; / 获取用户设定的参数 delete gray; / 删除对话框 BeginWaitCursor(); / 更改光标形状 / 调用GrayLinTrans()函数进行灰度变换 GrayLinTrans(lpDIBBits,pDoc-m_dib.GetWidth(lpDIB),pDoc-m_dib.GetHeight(lpDIB),oralow, orahig, newlow, newhig); pDoc-SetModi
7、fiedFlag(TRUE); / 图像已经处理,设置脏标记 pDoc-UpdateAllViews(NULL); / 更新视图 EndWaitCursor(); / 恢复光标 直方图均衡化/* 函数名称: * GrayHistEnhance()* 输入参数: * LPSTR lpDIBBits /指向源图像的像素指针 * LONG lmageWidth /源图像的宽度 * LONG lmageHeight /源图像的高度 * 返回值: * BOOL /成功则返回TRUE,否则返回FALSE * 说明: * 该函数对指定的图像进行直方图均衡化处理*/ BOOL GrayHistEnhance(
8、LPSTR lpDIBBits, LONG lmageWidth, LONG lmageHeight) unsigned char* lpSrc; /指向源图像的指针 int nTemp; /临时变量 int j; /循环变量 int i; /循环变量 BYTE byMap256; /累积直方图,即灰度映射表 int nCount256; /直方图 for (i = 0; i 256; i +) /重置计数为0 nCounti = 0; /清零 for(i = 0; i lmageHeight; i+) /每行 for(j = 0; j lmageWidth; j+) /每列 / 指向DIB第
9、i行,第j个象素的指针 lpSrc = (unsigned char*)lpDIBBits + lmageWidth * (lmageHeight - 1 - i) + j; nCount*(lpSrc)+; /计数加1 for (i = 0; i 256; i+) /计算累积直方图 nTemp = 0; /初始为0 for (j = 0; j = i ; j+) nTemp += nCountj; byMapi = (BYTE) (nTemp * 255 / lmageHeight / lmageWidth); /计算对应的新灰度值/说明:* 255实际上就是将新的灰度值也转换为0255的范
10、围。 for(i = 0; i lmageHeight; i+) for(j = 0; j lmageWidth; j+) /每列 /指向DIB第i行,第j个象素的指针 lpSrc = (unsigned char*)lpDIBBits + lmageWidth * (lmageHeight - 1 - i) + j; *lpSrc = byMap*lpSrc; /计算新的灰度值 return TRUE; /返回 该函数调用函数CDImagePorcess View视图类的OnHistEnhance()。void CDImageProcessView: OnHistEnhance() CDImageProcessDoc* pDoc = GetDocument(); / 获取当前文档 LPSTR lpDIB; / 指向当前DIB的指针 LPSTR lpDIBBits; / 指向当前
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1