圖像預處理第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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM