• 图像预处理第3步:梯度锐化


    图像锐化的主要目的有两个:
    一是增强图像边缘,使模糊的图像变得更加清晰,颜色变得鲜明突出,图像的质量有所改善,产生更适合人眼观察和识别的图像;二是希望经过锐化处理后,目标物体的边缘鲜明,以便于提取目标的边缘、对图像进行分割、目标区域识别、区域形状提取等,为进一步的图像理解与分析奠定基础。
    图像锐化一般有两种方法:一是微分法,二是高通滤波法。高通滤波法的工作原理和低通滤波相似,这里不再赘述。下面主要介绍一下两种常用的微分锐化方法:梯度锐化和拉普拉斯锐化。但由于锐化使噪声受到比信号还要强的增强,所以要求锐化处理的图像有较高的信噪比;否则,锐化后图像的信噪比更低。

    //图像预处理第3步:梯度锐化
    void CChildView::OnImgprcSharp() 
    {
        GradientSharp(m_hDIB);
        //在屏幕上显示位图
        CDC* pDC=GetDC();
        DisplayDIB(pDC,m_hDIB);        
    }
    /***********************************************
    *
    * 函数名称:
    *   GradientSharp() 
    *
    *参数 :
    *  HDIB hDIB    -待处理图像的句柄
    *
    * 返回值:
    *       无
    * 
    *功能:
    *    现图像的梯度锐化
    
    *说明:
    *    只能对2值图像进行处理,如果图像本身边缘较细,可能造成信息的损失
    **********************************************************************/
    void GradientSharp(HDIB hDIB)
    {
        // 指向DIB的指针
        LPSTR lpDIB=(LPSTR) ::GlobalLock((HGLOBAL)hDIB);
    
        // 指向DIB象素指针
        LPSTR    lpDIBBits;    
    
        // 找到DIB图像象素起始位置
        lpDIBBits = ::FindDIBBits(lpDIB);    
    
        //获取图像的宽度
        LONG lWidth=::DIBWidth ((char*)lpDIB);
    
        //获取图像的长度
        LONG lHeight=::DIBHeight ((char*)lpDIB);
    
        // 阈值
        BYTE    bThre = 2;
    
        // 调用GradSharp()函数进行梯度板锐化
    
        // 指向源图像的指针
        unsigned char*    lpSrc;
        unsigned char*    lpSrc1;
        unsigned char*    lpSrc2;
        
        // 循环变量
        LONG    i;
        LONG    j;
        
        // 图像每行的字节数
        LONG    lLineBytes;
        
        // 中间变量
        BYTE    bTemp;
        
        // 计算图像每行的字节数
        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;
                
                // 指向DIB第i+1行,第j个象素的指针
                lpSrc1 = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 2 - i) + j;
                
                 // 指向DIB第i行,第j+1个象素的指针
                 lpSrc2 = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j + 1;
                
    
                  //计算梯度值
                 bTemp = abs((*lpSrc)-(*lpSrc1)) + abs((*lpSrc)-(*lpSrc2));
                
                // 判断是否小于阈值
                if (bTemp < 255)
                {  
    
                 // 判断是否大于阈值,对于小于情况,灰度值不变。
                   if (bTemp >= bThre)
                   {
    
                // 直接赋值为bTemp
                 *lpSrc = bTemp;
    
                   }
    
                }
                
               else
                {
                    // 直接赋值为255
                    *lpSrc = 255;
                }
         }
       }
    
    //最后还要处理一下图像中最下面那行
    for(j = 0; j < lWidth; j++)
    {   
        
     //指向最下边一行,第j个象素的指针
      lpSrc  = (unsigned char*)lpDIBBits + lLineBytes * 0 + j;
    
       //将此位置的象素设置为255,即白点
        *lpSrc=255;
    }
    
       //解除锁定
        ::GlobalUnlock ((HGLOBAL)hDIB);
    }

    运行效果:


    参考资料:
    梯度锐化 http://blog.csdn.net/xiaofengsheng/article/details/4777591

  • 相关阅读:
    随手记
    boost::asio::udp 异步
    boost::asio::tcp 异步
    boost::asio::tcp 同步
    QML::MouseArea
    boost::concurrent::sync_queue
    std::chrono::时钟
    数据结构::队列
    数据结构::栈
    数据结构::线性表
  • 原文地址:https://www.cnblogs.com/Bobby0322/p/5408301.html
Copyright © 2020-2023  润新知