第三章 图像增强
线性灰度变换
/*************************************************************************
* \函数名称:
* GrayLinTrans()
* \输入参数:
* LPSTR lpDIBBits //指向源图像的像素指针
* LONG lmageWidth //源图像的宽度
* LONG lmageHeight // 源图像的高度
* int oralow // 原始图像的灰度值集中区域-低值
* int orahig // 原始图像的灰度值集中区域-高值
* int newlow // 变换后图像灰度的动态范围-低值
* int newhig // 变换后图像灰度的动态范围-高值
* \返回值:
* BOOL // 成功返回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 byMap[256]; // 定义灰度映射表
for (i = 0; i <= oralow; i++) //当灰度级小于要增强的灰度级时
{
if (newlow > 0) //判断新灰度级是否大于0
{
byMap[i] = newlow; //赋予新值
}
el
{
byMap[i] = 0; //直接赋值为0
}
落的多音字组词
}
for (; i <= orahig; i++)
{
if (orahig != oralow) // 判断orahig是否等于oralow(防止
//分母为0)
{
//线性变换
油焖春笋 byMap[i] = newlow + (BYTE) ((newhig - newlow) * (i - oralow) / (orahig - oralow));
微博找人怎么找 }
el
{
byMap[i] = newlow; //直接赋值为newlow
}
}
for (; i < newhig; i++)
鬼迷心窍的意思 {
if (newhig <= 255) //判断d是否大于255
{
byMap[i] = newhig; //直接赋值为newhig
}
el
{
byMap[i] = 255; //直接赋值为255
}
}
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视图类的OnGrayEnhance().代码如下:
void CDImageProcessView::OnGrayEnhance()
{
CDImageProcessDoc* pDoc = GetDocument(); // 获取当前文档
LPSTR lpDIB; // 指向当前DIB的指针
LPSTR lpDIBBits; // 指向当前DIB像素指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHObject()); // 锁定DIB
lpDIBBits = pDoc->m_dib.GetBits(lpDIB); // 找到DIB图像象素起始位置
if (pDoc->m_dib.GetColorNum(lpDIB) != 256) // 判断是否是256色位图
{
MessageBox("目前只支持256色位图!", "系统提示" ,
MB_ICONINFORMATION | MB_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; // 获取用户设定的参数
newlow=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->SetModifiedFlag(TRUE); // 图像已经处理,设置脏标记
pDoc->UpdateAllViews(NULL); // 更新视图
EndWaitCursor(); // 恢复光标
}
直方图均衡化
/*************************************************************************
* \函数名称:
* GrayHistEnhance()
* \输入参数:
* LPSTR lpDIBBits //指向源图像的像素指针
* LONG lmageWidth //源图像的宽度
* LONG lmageHeight //源图像的高度
* \返回值:
* BOOL //成功则返回TRUE,否则返回FALSE
* \说明:
* 该函数对指定的图像进行直方图均衡化处理
*************************************************************************/
戌的读音 BOOL GrayHistEnhance(LPSTR lpDIBBits, LONG lmageWidth, LONG lmageHeight)
{
unsigned char* lpSrc; //指向源图像的指针
int nTemp; //临时变量
int j; //循环变量
int i; //循环变量
BYTE byMap[256]; //累积直方图,即灰度映射表
int nCount[256]; //直方图
for (i = 0; i < 256; i ++) //重置计数为0
{
nCount[i] = 0; //清零
}
for(i = 0; i < lmageHeight; i++) //每行
{
for(j = 0; j < lmageWidth; j++) //每列
{
// 指向DIB第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 += nCount[j];
}
byMap[i] = (BYTE) (nTemp * 255 / lmageHeight / lmageWidth); //计算对应的新灰度值
//说明:* 255实际上就是将新的灰度值也转换为0~255的范围。
}
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; // 指向当前DIB像素指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHObject()); // 锁定DIB
lpDIBBits = pDoc->m_dib.GetBits(lpDIB); // 找到DIB图像象素起始位置
if (pDoc->m_dib.GetColorNum(lpDIB) != 256) // 判断是否是256色位图
{
MessageBox("目前只支持256色位图!", "系统提示" ,