圖像銳化的主要目的有兩個:
一是增強圖像邊緣,使模糊的圖像變得更加清晰,顏色變得鮮明突出,圖像的質量有所改善,產生更適合人眼觀察和識別的圖像;二是希望經過銳化處理后,目標物體的邊緣鮮明,以便於提取目標的邊緣、對圖像進行分割、目標區域識別、區域形狀提取等,為進一步的圖像理解與分析奠定基礎。
圖像銳化一般有兩種方法:一是微分法,二是高通濾波法。高通濾波法的工作原理和低通濾波相似,這里不再贅述。下面主要介紹一下兩種常用的微分銳化方法:梯度銳化和拉普拉斯銳化。但由於銳化使噪聲受到比信號還要強的增強,所以要求銳化處理的圖像有較高的信噪比;否則,銳化后圖像的信噪比更低。
//圖像預處理第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