图像预处理第2步:将灰度图二值化
//图像预处理第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; } }
运行效果: