//圖像預處理第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;
}
}
運行效果:


