图像预处理第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

posted @ 2016-04-19 15:10  Bobby0322  阅读(5022)  评论(0编辑  收藏  举报