zoukankan      html  css  js  c++  java
  • 图像预处理第1步:将256色图像转化为灰度图像

    //图像预处理第1步:将256色图像转化为灰度图像
    void CChildView::OnIMGPRC256ToGray() 
    {    
        Convert256toGray(m_hDIB);    
        //在屏幕上显示位图
        CDC* pDC=GetDC();
        DisplayDIB(pDC,m_hDIB);    
    }
    /****************************************************************
    * 函数名称:
    *      Convert256toGray()
    *
    * 参数:
    *     HDIB hDIB     -图像的句柄
    *
    *  返回值:
    *        无
    *
    *  功能:
    *     将256色位图转化为灰度图
    *
    ***************************************************************/
    
    void Convert256toGray(HDIB hDIB)
    {
        LPSTR    lpDIB;
        
        // 由DIB句柄得到DIB指针并锁定DIB
        lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);
        
        // 指向DIB象素数据区的指针
        LPSTR   lpDIBBits;    
    
        // 指向DIB象素的指针
        BYTE *    lpSrc;    
    
        // 图像宽度
        LONG    lWidth;    
        // 图像高度
        LONG      lHeight;    
    
        // 图像每行的字节数
        LONG    lLineBytes;    
    
        // 指向BITMAPINFO结构的指针(Win3.0)
        LPBITMAPINFO lpbmi;    
    
        // 指向BITMAPCOREINFO结构的指针
        LPBITMAPCOREINFO lpbmc;
        
        // 获取指向BITMAPINFO结构的指针(Win3.0)
        lpbmi = (LPBITMAPINFO)lpDIB;    
    
        // 获取指向BITMAPCOREINFO结构的指针
        lpbmc = (LPBITMAPCOREINFO)lpDIB;    
    
        // 灰度映射表
        BYTE bMap[256];
        
        // 计算灰度映射表(保存各个颜色的灰度值),并更新DIB调色板
        int    i,j;
        for (i = 0; i < 256; i ++)
        {
            // 计算该颜色对应的灰度值
            bMap[i] = (BYTE)(0.299 * lpbmi->bmiColors[i].rgbRed +
    
                             0.587 * lpbmi->bmiColors[i].rgbGreen +
    
                             0.114 * lpbmi->bmiColors[i].rgbBlue + 0.5);            
            // 更新DIB调色板红色分量
            lpbmi->bmiColors[i].rgbRed = i;    
            
            // 更新DIB调色板绿色分量
            lpbmi->bmiColors[i].rgbGreen = i;    
            
            // 更新DIB调色板蓝色分量
            lpbmi->bmiColors[i].rgbBlue = i;
                
            // 更新DIB调色板保留位
            lpbmi->bmiColors[i].rgbReserved = 0;
    
        }
        // 找到DIB图像象素起始位置
        lpDIBBits = ::FindDIBBits(lpDIB);
            
        // 获取图像宽度
        lWidth = ::DIBWidth(lpDIB);    
    
        // 获取图像高度
        lHeight = ::DIBHeight(lpDIB);    
    
        // 计算图像每行的字节数
        lLineBytes = WIDTHBYTES(lWidth * 8);    
    
    // 更换每个象素的颜色索引(即按照灰度映射表换成灰度值)
    
    //逐行扫描
    for(i = 0; i < lHeight; i++)
    {
    
      //逐列扫描
    for(j = 0; j < lWidth; j++)
    {
        // 指向DIB第i行,第j个象素的指针
        lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
                
        // 变换
        *lpSrc = bMap[*lpSrc];
    }
    }
    
    //解除锁定
    ::GlobalUnlock ((HGLOBAL)hDIB);
    }

    运行效果:

  • 相关阅读:
    First Missing Positive
    Find Minimum in Rotated Sorted Array II
    switch两种写法对比
    常用的前端JavaScript方法封装
    如何保证缓存和数据库的一致性?
    14个前端小知识
    dataTable转换特定的类
    C# MD5 32大写位加密 UTF-8编码
    另一个 SqlParameterCollection 中已包含 SqlParameter
    C#实现数据回滚,A事件和B事件同时执行,其中任何一个事件执行失败,都会返回失败
  • 原文地址:https://www.cnblogs.com/Bobby0322/p/5408168.html
Copyright © 2011-2022 走看看