⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pointtrans.cpp

📁 vc++数字图像处理 ,是一本很不错的介绍数字图像方面的书籍,这里有本书的全部源码
💻 CPP
字号:
/************************************************************************** *  文件名:PointTrans.cpp * *  图像点运算API函数库: * *  LinerTrans()		- 图像线性变换 *	WindowTrans()		- 图像窗口变换 *  GrayStretch()		- 图像灰度拉伸 *  InteEqualize()		-直方图均衡 * *************************************************************************/#include "stdafx.h"#include "PointTrans.h"#include "DIBAPI.h"#include <math.h>#include <direct.h>/************************************************************************* * * 函数名称: *   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;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -