www.pudn.com > FingerPro.rar > PointTrans.cpp


 
/************************************************************************** 
 *  文件名:PointTrans.cpp 
 * 
 *  图像点运算API函数库: 
 * 
 *  LinerTrans()		- 图像线性变换 
 *	WindowTrans()		- 图像窗口变换 
 *  GrayStretch()		- 图像灰度拉伸 
 *  InteEqualize()		-直方图均衡 
 * 
 *************************************************************************/ 
 
#include "stdafx.h" 
#include "PointTrans.h" 
#include "DIBAPI.h" 
 
#include  
#include  
 
/************************************************************************* 
 * 
 * 函数名称: 
 *   LinerTrans() 
 * 
 * 参数: 
 *   LPSTR lpDIBBits    - 指向源DIB图像指针 
 *   LONG  lWidth       - 源图像宽度(象素数) 
 *   LONG  lHeight      - 源图像高度(象素数) 
 *   FLOAT fA		    - 线性变换的斜率 
 *   FLOAT fB           - 线性变换的截距 
 * 
 * 返回值: 
 *   BOOL               - 成功返回TRUE,否则返回FALSE。 
 * 
 * 说明: 
 *   该函数用来对图像进行灰度的线性变换操作。 
 * 
 ************************************************************************/ 
 
BOOL WINAPI LinerTrans(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, FLOAT fA, FLOAT fB) 
{ 
	 
	// 指向源图像的指针 
	unsigned char*	lpSrc; 
	 
	// 循环变量 
	LONG	i; 
	LONG	j; 
	 
	// 图像每行的字节数 
	LONG	lLineBytes; 
	 
	// 中间变量 
	FLOAT	fTemp; 
	 
	// 计算图像每行的字节数 
	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; 
			 
			// 线性变换 
			fTemp = fA * (*lpSrc) + fB; 
			 
			// 判断是否超出范围 
			if (fTemp > 255) 
			{ 
				// 直接赋值为255 
				*lpSrc = 255; 
			} 
			else if (fTemp < 0) 
			{ 
				// 直接赋值为0 
				*lpSrc = 0; 
			} 
			else 
			{ 
				// 四舍五入 
				*lpSrc = (unsigned char) (fTemp + 0.5); 
			} 
		} 
	} 
	 
	// 返回 
	return TRUE; 
 
} 
 
/************************************************************************* 
 * 
 * 函数名称: 
 *   ThresholdTrans() 
 * 
 * 参数: 
 *   LPSTR lpDIBBits    - 指向源DIB图像指针 
 *   LONG  lWidth       - 源图像宽度(象素数) 
 *   LONG  lHeight      - 源图像高度(象素数) 
 *   BYTE  bThre	    - 阈值 
 * 
 * 返回值: 
 *   BOOL               - 成功返回TRUE,否则返回FALSE。 
 * 
 * 说明: 
 *   该函数用来对图像进行阈值变换。对于灰度值小于阈值的象素直接设置 
 * 灰度值为0;灰度值大于阈值的象素直接设置为255。 
 * 
 ************************************************************************/ 
BOOL WINAPI ThresholdTrans(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, BYTE bThre) 
{ 
	 
	// 指向源图像的指针 
	unsigned char*	lpSrc; 
	 
	// 循环变量 
	LONG	i; 
	LONG	j; 
	 
	// 图像每行的字节数 
	LONG	lLineBytes; 
	 
	// 计算图像每行的字节数 
	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; 
			 
			// 判断是否小于阈值 
			if ((*lpSrc) < bThre) 
			{ 
				// 直接赋值为0 
				*lpSrc = 0; 
			} 
			else 
			{ 
				// 直接赋值为255 
				*lpSrc = 255; 
			} 
		} 
	} 
	 
	// 返回 
	return TRUE; 
} 
 
/************************************************************************* 
 * 
 * 函数名称: 
 *   WindowTrans() 
 * 
 * 参数: 
 *   LPSTR lpDIBBits    - 指向源DIB图像指针 
 *   LONG  lWidth       - 源图像宽度(象素数) 
 *   LONG  lHeight      - 源图像高度(象素数) 
 *   BYTE  bLow		    - 窗口下限 
 *   BYTE  bUp          - 窗口上限 
 * 
 * 返回值: 
 *   BOOL               - 成功返回TRUE,否则返回FALSE。 
 * 
 * 说明: 
 *   该函数用来对图像进行窗口变换。只有在窗口范围内的灰度保持不变, 
 * 小于下限的象素直接设置灰度值为0;大于上限的象素直接设置灰度值为255。 
 * 
 ************************************************************************/ 
BOOL WINAPI WindowTrans(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, BYTE bLow, BYTE bUp) 
{ 
	 
	// 指向源图像的指针 
	unsigned char*	lpSrc; 
	 
	// 循环变量 
	LONG	i; 
	LONG	j; 
	 
	// 图像每行的字节数 
	LONG	lLineBytes; 
	 
	// 计算图像每行的字节数 
	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; 
			 
			// 判断是否超出范围 
			if ((*lpSrc) < bLow) 
			{ 
				// 直接赋值为0 
				*lpSrc = 0; 
			} 
			else if ((*lpSrc) > bUp) 
			{ 
				// 直接赋值为255 
				*lpSrc = 255; 
			} 
		} 
	} 
	 
	// 返回 
	return TRUE; 
} 
 
/************************************************************************* 
 * 
 * 函数名称: 
 *   GrayStretch() 
 * 
 * 参数: 
 *   LPSTR lpDIBBits    - 指向源DIB图像指针 
 *   LONG  lWidth       - 源图像宽度(象素数) 
 *   LONG  lHeight      - 源图像高度(象素数) 
 *   BYTE bX1			- 灰度拉伸第一个点的X坐标 
 *   BYTE bY1			- 灰度拉伸第一个点的Y坐标 
 *   BYTE bX2			- 灰度拉伸第二个点的X坐标 
 *   BYTE bY2			- 灰度拉伸第二个点的Y坐标 
 * 
 * 返回值: 
 *   BOOL               - 成功返回TRUE,否则返回FALSE。 
 * 
 * 说明: 
 *   该函数用来对图像进行灰度拉伸。 
 * 
 ************************************************************************/ 
BOOL WINAPI GrayStretch(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, BYTE bX1, BYTE bY1, BYTE bX2, BYTE bY2) 
{ 
	 
	// 指向源图像的指针 
	unsigned char*	lpSrc; 
	 
	// 循环变量 
	LONG	i; 
	LONG	j; 
	 
	// 灰度映射表 
	BYTE	bMap[256]; 
	 
	// 图像每行的字节数 
	LONG	lLineBytes; 
	 
	// 计算图像每行的字节数 
	lLineBytes = WIDTHBYTES(lWidth * 8); 
	 
	// 计算灰度映射表 
	for (i = 0; i <= bX1; i++) 
	{ 
		// 判断bX1是否大于0(防止分母为0) 
		if (bX1 > 0) 
		{ 
			// 线性变换 
			bMap[i] = (BYTE) bY1 * i / bX1; 
		} 
		else 
		{ 
			// 直接赋值为0 
			bMap[i] = 0; 
		} 
	} 
	for (; i <= bX2; i++) 
	{ 
		// 判断bX1是否等于bX2(防止分母为0) 
		if (bX2 != bX1) 
		{ 
			// 线性变换 
			bMap[i] = bY1 + (BYTE) ((bY2 - bY1) * (i - bX1) / (bX2 - bX1)); 
		} 
		else 
		{ 
			// 直接赋值为bY1 
			bMap[i] = bY1; 
		} 
	} 
	for (; i < 256; i++) 
	{ 
		// 判断bX2是否等于255(防止分母为0) 
		if (bX2 != 255) 
		{ 
			// 线性变换 
			bMap[i] = bY2 + (BYTE) ((255 - bY2) * (i - bX2) / (255 - bX2)); 
		} 
		else 
		{ 
			// 直接赋值为255 
			bMap[i] = 255; 
		} 
	} 
	 
	// 每行 
	for(i = 0; i < lHeight; i++) 
	{ 
		// 每列 
		for(j = 0; j < lWidth; j++) 
		{ 
			// 指向DIB第i行,第j个象素的指针 
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j; 
			 
			// 计算新的灰度值 
			*lpSrc = bMap[*lpSrc]; 
		} 
	} 
	 
	// 返回 
	return TRUE; 
} 
 
/************************************************************************* 
 * 
 * 函数名称: 
 *   InteEqualize() 
 * 
 * 参数: 
 *   LPSTR lpDIBBits    - 指向源DIB图像指针 
 *   LONG  lWidth       - 源图像宽度(象素数) 
 *   LONG  lHeight      - 源图像高度(象素数) 
 * 
 * 返回值: 
 *   BOOL               - 成功返回TRUE,否则返回FALSE。 
 * 
 * 说明: 
 *   该函数用来对图像进行直方图均衡。 
 * 
 ************************************************************************/ 
BOOL WINAPI InteEqualize(LPSTR lpDIBBits, LONG lWidth, LONG lHeight) 
{ 
	 
	// 指向源图像的指针 
	unsigned char*	lpSrc; 
	 
	// 临时变量 
	LONG	lTemp; 
	 
	// 循环变量 
	LONG	i; 
	LONG	j; 
	 
	// 灰度映射表 
	BYTE	bMap[256]; 
	 
	// 灰度映射表 
	LONG	lCount[256]; 
	 
	// 图像每行的字节数 
	LONG	lLineBytes; 
	 
	// 计算图像每行的字节数 
	lLineBytes = WIDTHBYTES(lWidth * 8); 
	 
	// 重置计数为0 
	for (i = 0; i < 256; i ++) 
	{ 
		// 清零 
		lCount[i] = 0; 
	} 
	 
	// 计算各个灰度值的计数 
	for (i = 0; i < lHeight; i ++) 
	{ 
		for (j = 0; j < lWidth; j ++) 
		{ 
			lpSrc = (unsigned char *)lpDIBBits + lLineBytes * i + j; 
			 
			// 计数加1 
			lCount[*(lpSrc)]++; 
		} 
	} 
	 
	// 计算灰度映射表 
	for (i = 0; i < 256; i++) 
	{ 
		// 初始为0 
		lTemp = 0; 
		 
		for (j = 0; j <= i ; j++) 
		{ 
			lTemp += lCount[j]; 
		} 
		 
		// 计算对应的新灰度值 
		bMap[i] = (BYTE) (lTemp * 255 / lHeight / lWidth); 
	} 
	 
	// 每行 
	for(i = 0; i < lHeight; i++) 
	{ 
		// 每列 
		for(j = 0; j < lWidth; j++) 
		{ 
			// 指向DIB第i行,第j个象素的指针 
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j; 
			 
			// 计算新的灰度值 
			*lpSrc = bMap[*lpSrc]; 
		} 
	} 
	 
	// 返回 
	return TRUE; 
}