《Visual C++实践与提高数字图像处理与工程应用篇》第三章学习笔记.docx
《《Visual C++实践与提高数字图像处理与工程应用篇》第三章学习笔记.docx》由会员分享,可在线阅读,更多相关《《Visual C++实践与提高数字图像处理与工程应用篇》第三章学习笔记.docx(49页珍藏版)》请在冰豆网上搜索。
![《Visual C++实践与提高数字图像处理与工程应用篇》第三章学习笔记.docx](https://file1.bdocx.com/fileroot1/2022-10/29/d7d61577-6567-4612-a491-755878aa729c/d7d61577-6567-4612-a491-755878aa729c1.gif)
《VisualC++实践与提高数字图像处理与工程应用篇》第三章学习笔记
第三章图像增强
线性灰度变换
/*************************************************************************
*\函数名称:
*GrayLinTrans()
*\输入参数:
*LPSTRlpDIBBits//指向源图像的像素指针
*LONGlmageWidth//源图像的宽度
*LONGlmageHeight//源图像的高度
*intoralow//原始图像的灰度值集中区域-低值
*intorahig//原始图像的灰度值集中区域-高值
*intnewlow//变换后图像灰度的动态范围-低值
*intnewhig//变换后图像灰度的动态范围-高值
*\返回值:
*BOOL//成功返回TRUE,否则返回FALSE。
*\说明:
*该函数用来对图像指定的灰度分布进行灰度变换主要用来实现灰度分布的扩展
*************************************************************************/
BOOLGrayLinTrans(LPSTRlpDIBBits,LONGlmageWidth,LONGlmageHeight,intoralow,intorahig,intnewlow,intnewhig)
{
unsignedchar*lpSrc;//指向源图像的指针
inti;//循环变量
intj;//循环变量
BYTEbyMap[256];//定义灰度映射表
for(i=0;i<=oralow;i++)//当灰度级小于要增强的灰度级时
{
if(newlow>0)//判断新灰度级是否大于0
{
byMap[i]=newlow;//赋予新值
}
else
{
byMap[i]=0;//直接赋值为0
}
}
for(;i<=orahig;i++)
{
if(orahig!
=oralow)//判断orahig是否等于oralow(防止
//分母为0)
{
//线性变换
byMap[i]=newlow+(BYTE)((newhig-newlow)*(i-oralow)/(orahig-oralow));
}
else
{
byMap[i]=newlow;//直接赋值为newlow
}
}
for(;i{
if(newhig<=255)//判断d是否大于255
{
byMap[i]=newhig;//直接赋值为newhig
}
else
{
byMap[i]=255;//直接赋值为255
}
}
for(i=0;i{
for(j=0;j{
//指向DIB第i行,第j个象素的指针
lpSrc=(unsignedchar*)lpDIBBits+lmageWidth*(lmageHeight-1-i)+j;
*lpSrc=byMap[*lpSrc];//用新的灰度替代原有的灰度
}
}
returnTRUE;//返回
}
该函数调用函数CDImagePorcessView视图类的OnGrayEnhance().代码如下:
voidCDImageProcessView:
:
OnGrayEnhance()
{
CDImageProcessDoc*pDoc=GetDocument();//获取当前文档
LPSTRlpDIB;//指向当前DIB的指针
LPSTRlpDIBBits;//指向当前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;//返回
}
CGrayEnhancegray;//重载灰度变换对话框类
if(gray.DoModal()!
=IDOK)//显示对话框,提示用户设定参数
{
return;//返回
}
//定义四个变量用于存贮对话框设置的参数
intnewhig;//新灰度上限
intnewlow;//新灰度下限
intorahig;//旧灰度上限
intoralow;//旧灰度下限
newhig=gray.m_newhig;//获取用户设定的参数
newlow=gray.m_newlow;//获取用户设定的参数
orahig=gray.m_orahig;//获取用户设定的参数
oralow=gray.m_oralow;//获取用户设定的参数
deletegray;//删除对话框
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()
*\输入参数:
*LPSTRlpDIBBits//指向源图像的像素指针
*LONGlmageWidth//源图像的宽度
*LONGlmageHeight//源图像的高度
*\返回值:
*BOOL//成功则返回TRUE,否则返回FALSE
*\说明:
*该函数对指定的图像进行直方图均衡化处理
*************************************************************************/
BOOLGrayHistEnhance(LPSTRlpDIBBits,LONGlmageWidth,LONGlmageHeight)
{
unsignedchar*lpSrc;//指向源图像的指针
intnTemp;//临时变量
intj;//循环变量
inti;//循环变量
BYTEbyMap[256];//累积直方图,即灰度映射表
intnCount[256];//直方图
for(i=0;i<256;i++)//重置计数为0
{
nCount[i]=0;//清零
}
for(i=0;i{
for(j=0;j{
//指向DIB第i行,第j个象素的指针
lpSrc=(unsignedchar*)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{
for(j=0;j{
//指向DIB第i行,第j个象素的指针
lpSrc=(unsignedchar*)lpDIBBits+lmageWidth*(lmageHeight-1-i)+j;
*lpSrc=byMap[*lpSrc];//计算新的灰度值
}
}
returnTRUE;//返回
}
该函数调用函数CDImagePorcessView视图类的OnHistEnhance()。
voidCDImageProcessView:
:
OnHistEnhance()
{
CDImageProcessDoc*pDoc=GetDocument();//获取当前文档
LPSTRlpDIB;//指向当前DIB的指针
LPSTRlpDIBBits;//指向当前