//圖像預處理第2步:將灰度圖二值化 void CChildView::OnIMGPRCGrayToWhiteBlack() { ConvertGrayToWhiteBlack(m_hDIB); //在屏幕上顯示位圖 CDC* pDC=GetDC(); DisplayDIB(pDC,m_hDIB); }
/****************************************************************** * * 函數名稱ConvertGrayToWhiteBlack() * * 參數 :HDIB hDIB -原圖的句柄 * * 返回值:無 * * 功能: ConvertGrayToWhiteBlack函數採用硬閾值的方法,實現將圖像二值化的功能。 * * 說明: 要求待處理的圖片爲256色 ************************************************************************/ void ConvertGrayToWhiteBlack(HDIB hDIB) { // 指向DIB的指針 LPSTR lpDIB; // 由DIB句柄獲得DIB指針並鎖定DIB lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB); // 指向DIB象素數據區的指針 LPSTR lpDIBBits; // 指向DIB象素的指針 BYTE * lpSrc; // 圖像寬度 LONG lWidth; // 圖像高度 LONG lHeight; // 圖像每行的字節數 LONG lLineBytes; // 找到DIB圖像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 獲取圖像寬度 lWidth = ::DIBWidth(lpDIB); // 獲取圖像高度 lHeight = ::DIBHeight(lpDIB); // 計算圖像每行的字節數 lLineBytes = WIDTHBYTES(lWidth * 8); // 更換每一個象素的顏色索引(即按照灰度映射表換成灰度值) int i,j; //逐行掃描 for(i = 0; i < lHeight; i++) { //逐列掃描 for(j = 0; j < lWidth; j++) { // 指向DIB第i行,第j個象素的指針 lpSrc = (unsigned char*)lpDIBBits + lLineBytes * i + j; // 二值化處理 //大於220,設置爲255,即白點 if(*lpSrc>220) *lpSrc=255; //不然設置爲0,即黑點 else *lpSrc=0; } }
運行效果:函數