《Visual C++实践与提高—数字图像处理与工程应用篇》第三章学习笔记

更新时间:2023-06-15 23:01:43 阅读: 评论:0

第三章 图像增强
线性灰度变换
/*************************************************************************
* \函数名称:
*  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色位图!", "系统提示" ,

本文发布于:2023-06-15 23:01:43,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/963537.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:灰度   图像   参数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图