阅读背景:

MFC单文档图像处理代码--句柄图像实现

来源:互联网 

1.句柄图像灰度化+二值化

void Convert256toGray(HDIB hDIB,int a,int b,int c,int d)
{
	LPSTR	lpDIB;

	// 由DIB句柄得到DIB指针并锁定DIB
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);

	// 指向DIB象素数据区的指针
	LPSTR   lpDIBBits;	

	// 指向DIB象素的指针
	BYTE *	lpSrc;	

	// 图像宽度
	LONG	lWidth;	
	// 图像高度
	LONG  	lHeight;	

	// 图像每行的字节数
	LONG	lLineBytes;	

	// 指向BITMAPINFO结构的指针(Win3.0)
	LPBITMAPINFO lpbmi;	

	// 指向BITMAPCOREINFO结构的指针
	LPBITMAPCOREINFO lpbmc;

	// 获取指向BITMAPINFO结构的指针(Win3.0)
	lpbmi = (LPBITMAPINFO)lpDIB;	

	// 获取指向BITMAPCOREINFO结构的指针
	lpbmc = (LPBITMAPCOREINFO)lpDIB;	

	// 灰度映射表
	BYTE bMap[256];

	// 计算灰度映射表(保存各个颜色的灰度值),并更新DIB调色板
	int	i,j;
	for (i = a; i < 256; i ++)
	{
		// 计算该颜色对应的灰度值
		bMap[i] = (BYTE)(0.299 * lpbmi->bmiColors[i].rgbRed +

			0.587 * lpbmi->bmiColors[i].rgbGreen +

			0.114 * lpbmi->bmiColors[i].rgbBlue + 0.5);			
		// 更新DIB调色板红色分量
		lpbmi->bmiColors[i].rgbRed = i;	

		// 更新DIB调色板绿色分量
		lpbmi->bmiColors[i].rgbGreen = i;	

		// 更新DIB调色板蓝色分量
		lpbmi->bmiColors[i].rgbBlue = i;

		// 更新DIB调色板保留位
		lpbmi->bmiColors[i].rgbReserved = 0;

	}
	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);

	// 获取图像宽度
	lWidth = ::DIBWidth(lpDIB);	

	// 获取图像高度
	lHeight = ::DIBHeight(lpDIB);	

	// 计算图像每行的字节数
	lLineBytes = WIDTHBYTES(lWidth * 8);	

	// 更换每个象素的颜色索引(即按照灰度映射表换成灰度值)

	//逐行扫描
	for(i = 0; i < lWidth; i++)
	{

		//逐列扫描
		for(j = 0; j < lHight; j++)
		{
			// 指向DIB第i行,第j个象素的指针
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;

			// 变换
			*lpSrc = bMap[*lpSrc];
		}


		//最简单二值化:找灰度值,大于127的全部变成255,小于127的全部变成0
		
		for(i=0;i<lWidth;i++){
			for (j=0;j<lHight;j++)
			{
				if (bMap[i]<127)
				{
					bMap[i]=0;
				}else{
					bMap[i]=255;
				}
			}
			*lpSrc = bMap[*lpSrc];
		}
	}
	
	//解除锁定
	::GlobalUnlock ((HGLOBAL)hDIB);
}
void Convert256toGray(HDIB h



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: