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

📄 pointpro.cpp

📁 用C++实现的数字图像处理各个算法源代码 我精心整理的 很难的啊 希望可以给大家带来帮助
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		// 更新DIB调色板蓝色分量
		pPalette[i].rgbBlue	= bpColorsTable[i * 4 + 2];
		// 更新DIB调色板保留位
		pPalette[i].rgbReserved	= 0;
	}
	::GlobalUnlock( m_pDibObject->GetDib() );
	return(TRUE);
}

////////////////////////////////////////////////////////////////////////
//unsigned char *PointSlopeLinerTran(float fa, float fb)
//----------------------------------------------------------------------
//基本功能:本函数计算点斜线性变换的灰度映射表,它是一个辅助函数,供点斜
//			线性变换函数使用。
//----------------------------------------------------------------------
//参数说明:float fa			线性变换的斜率
//			float fb			线性变换的截距
//----------------------------------------------------------------------
//返回:unsigned char *型的灰度映射表。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
unsigned char *CPointPro::PointSlopeLinerTran(float fa,
														 float fb)
{
	// 灰度映射表
	unsigned char *pMap = new unsigned char[256];
	
	// 计算灰度映射表
	for (int i = 0; i <= 255; i++)
	{
		float fTemp = fa * (float)(i) + fb;
		// 判断是否超出范围
		if (fTemp > 255)
		{
			// 直接赋值为255
			pMap[i] = 255;
		}
		else if (fTemp < 0)
		{
			// 直接赋值为0
			pMap[i] = 0;
		}
		else
		{
			// 四舍五入
			pMap[i] = (unsigned char) (fTemp + 0.5);
		}
	}
	return(pMap);
}

////////////////////////////////////////////////////////////////////////
//unsigned char *DoublePointLinerTran()
//----------------------------------------------------------------------
//基本功能:本函数计算点斜线性变换的灰度映射表,它是一个辅助函数,供点斜
//			线性变换函数使用。
//----------------------------------------------------------------------
//参数说明:BYTE bX1	灰度拉伸第一个点的x坐标
//			BYTE bY1	灰度拉伸第一个点的y坐标
//			BYTE bX2	灰度拉伸第二个点的x坐标
//			BYTE bY2	灰度拉伸第二个点的y坐标
//----------------------------------------------------------------------
//返回:unsigned char *型的灰度映射表。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
unsigned char * CPointPro::DoublePointLinerTran(BYTE bX1,
														   BYTE bY1,
														   BYTE bX2,
														   BYTE bY2)
{
	// 灰度映射表
	unsigned char *pMap = new unsigned char[256];

	// 计算灰度映射表
	for (int i = 0; i <= bX1; i++)
	{
		// 判断bX1是否大于0(防止分母为0)
		if (bX1 > 0)
		{
			// 线性变换
			pMap[i] = (BYTE) bY1 * i / bX1;
		}
		else
		{
			// 直接赋值为0
			pMap[i] = 0;
		}
	}
	for (; i <= bX2; i++)
	{
		// 判断bX1是否等于bX2(防止分母为0)
		if (bX2 != bX1)
		{
			// 线性变换
			pMap[i] = bY1 + (BYTE) ((bY2 - bY1) * (i - bX1) / (bX2 - bX1));
		}
		else
		{
			// 直接赋值为bY1
			pMap[i] = bY1;
		}
	}

	for (; i < 256; i++)
	{
		// 判断bX2是否等于255(防止分母为0)
		if (bX2 != 255)
		{
			// 线性变换
			pMap[i] = bY2 + (BYTE) ((255 - bY2) * (i - bX2) / (255 - bX2));
		}
		else
		{
			// 直接赋值为255
			pMap[i] = 255;
		}
	}
	return(pMap);
}

////////////////////////////////////////////////////////////////////////
//BOOL IsBlackandWhite256(CDibObject *pDibObject)
//----------------------------------------------------------------------
//基本功能:本函数判断传入的CDibObject对象中的图像是否为256级二值图像。
//----------------------------------------------------------------------
//参数说明:CDibObject *pDibObject, 默认为NULL
//----------------------------------------------------------------------
//返回:BOOL:成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CPointPro::IsBlackandWhite256(CDibObject *pDibObject)
{
	//使用传入的CDibObject对象
	if( pDibObject != NULL ) m_pDibObject = pDibObject;
	//无CDibObject对象, 返回FALSE
	if( m_pDibObject == NULL ) return( FALSE );

	//不是8位图像,必不是256级灰度图像,不处理返回FALSE
	if( !IsGray256() ) return( FALSE );

	unsigned char *pBuffer, *pBits, *pTemp;
	BITMAPINFOHEADER *pBIH;
	RGBQUAD *pPalette;
	int nWidthBytes, nNumColors;

	pBuffer = (unsigned char *) m_pDibObject->GetDIBPointer( &nWidthBytes, 
												m_pDibObject->GetNumBits() );
	if( pBuffer == NULL ) return( -1 );

	//pBIH:获得位图信息头地址
	pBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
	//nNumColors:获得调色板中的颜色数。图像为16位色或更高时为0
	nNumColors = m_pDibObject->GetNumColors();
	//pPalette:获得调色板数据地址
	pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
	//pBits:获得位图数据地址
	pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+
										nNumColors*sizeof(RGBQUAD)];
	//获取灰度图像的宽度和高度(以像素表示)
	int nWidth = pBIH->biWidth;
	int nHeight = pBIH->biHeight;

	for(int y = 0; y < nHeight; y++)
	{
		pTemp = pBits;
		pTemp += y * nWidthBytes;	//位图数据下一行起始指针
		for(int x = 0; x < nWidth; x++)
		{
			if( pTemp[x] != 0 && pTemp[x] != 255) return(FALSE);			
		}
	}

	return(TRUE);
}


////////////////////////////////////////////////////////////////////////
//int *GetHistogram()   
//----------------------------------------------------------------------
//基本功能:本函数获得传入的CDibObject对象中图像的直方图。如果进行此调
//			整之前没有指定一个CDibObject对象指针,则必须在调整时加以指
//			定。任何未传入的坐标值或默认的-1坐标值都将被置为图像的最大值
//			或最大植。变量nX1和nY1将被置为0,nX2将被置为图像宽度减1,nY2
//			将被置为图像高度减1。想要在整个图像上进行操作时,最好的方法
//			是不传入nX1、nY1、nX2和nY2值。这样它们会被默认为整个图像。
//----------------------------------------------------------------------
//参数说明:int	nX1, 默认为-1
//			int	nY1, 默认为-1
//			int	nX2, 默认为-1
//			int	nY2, 默认为-1
//			CDibObject *pDibObject, 默认为NULL。
//----------------------------------------------------------------------
//返    回:直方图数组指针*pBuffer其中:
//			nHistogramBuffer[]		存储亮度直方图数据
//			nHistogramBuffer[256]	存储红色直方图数据
//			nHistogramBuffer[512]	存储绿色直方图数据
//			nHistogramBuffer[768]	存储蓝直方图数据
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
int *CPointPro::GetHistogram( int nX1, 
									int nY1,
									int nX2,
									int nY2,
									CDibObject *pDibObject)
{
	//使用传入的CDibObject对象
	if( pDibObject != NULL ) m_pDibObject = pDibObject;
	//无CDibObject对象, 返回FALSE
	if( m_pDibObject == NULL ) return( FALSE );

	//坐标规整化
	m_pDibObject->NormalizeCoordinates( &nX1, &nY1, &nX2, &nY2 );

	//定义变量
	unsigned char *pBuffer, *pBits;
	RGBQUAD *pPalette;
	int nWidthBytes, nNumColors;

	//获得图像指针
	pBuffer = (unsigned char *) m_pDibObject->GetDIBPointer( &nWidthBytes, m_pDibObject->GetNumBits() );
	if( pBuffer == NULL ) return( NULL );

	//获得颜色数
	nNumColors = m_pDibObject->GetNumColors();
	//获得调色板指针
	pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
	//获得位图数据指针
	pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];

	//创建直方图数据
	int *nHistogramBuffer = CreateHistogram( nX1, nY1, nX2, nY2, pBits, pPalette, nWidthBytes );

	::GlobalUnlock( m_pDibObject->GetDib() );

	return( nHistogramBuffer );

}

////////////////////////////////////////////////////////////////////////
//BOOL SplitChannels()   
//----------------------------------------------------------------------
//基本功能:本函数将传入的CDibObject对象中的图像分离成由红、绿、蓝分量
//			构成的256色灰度图像。
//----------------------------------------------------------------------
//参数说明:CDibObject *pRed		指向红色通道的图像指针
//			CDibObject *pGreen	指向绿色通道的图像指针
//			CDibObject *pBlue		指向蓝色通道的图像指针
//----------------------------------------------------------------------
//返    回:成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CPointPro::SplitChannels(CDibObject *pRed, 
							  CDibObject *pGreen, 
							  CDibObject *pBlue)
{
	//没有传入相应指针无法完成操作
	if(m_pDibObject == NULL)
	{
		AfxMessageBox("没有传入原始图像,无法完成操作!");
		return FALSE;
	}

	if(pRed == NULL)
	{
		AfxMessageBox("没有传入红色通道指针,无法完成操作!");
		return FALSE;
	}

	if(pGreen == NULL)
	{
		AfxMessageBox("没有传入绿色通道指针,无法完成操作!");
		return FALSE;
	}

	if(pBlue == NULL)
	{
		AfxMessageBox("没有传入蓝色通道指针,无法完成操作!");
		return FALSE;
	}

	//已是256色灰度图像不用再转换
	if(IsGray256())
	{
		AfxMessageBox("已是256色灰度图像,不能进行通道分离!");
		return FALSE;
	}

	//红色通道
	MakeGray256(1, pRed);

	//绿色通道
	MakeGray256(2, pGreen);
	
	//蓝色通道
	MakeGray256(3, pBlue);

	
	return TRUE;
}

////////////////////////////////////////////////////////////////////////
//BOOL GetMixedChannel()   
//----------------------------------------------------------------------
//基本功能:本函数获得传入的CDibObject对象中的图像中的混合分量通道。
//----------------------------------------------------------------------
//参数说明:CDibObject *pMixed	指向混合通道的图像指针
//----------------------------------------------------------------------
//返    回:成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CPointPro::GetMixedChannel(CDibObject *pMixed)
{
	//没有传入相应指针无法完成操作
	if(m_pDibObject == NULL)
	{
		AfxMessageBox("没有传入原始图像,无法完成操作!");
		return FALSE;
	}

	if(pMixed == NULL)
	{
		AfxMessageBox("没有传入通道指针,无法完成操作!");
		return FALSE;
	}

	//已是256色灰度图像不用再转换
	if(IsGray256())
	{
		AfxMessageBox("已是256色灰度图像,不能进行通道分离!");
		return FALSE;
	}

	MakeGray256(0, pMixed);

	return TRUE;
}

////////////////////////////////////////////////////////////////////////
//BOOL GetRedChannel()   
//----------------------------------------------------------------------
//基本功能:本函数获得传入的CDibObject对象中的图像中的红色分量通道。
//----------------------------------------------------------------------
//参数说明:CDibObject *pRed	指向红色通道的图像指针
//----------------------------------------------------------------------
//返    回:成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CPointPro::GetRedChannel(CDibObject *pRed)
{
	//没有传入相应指针无法完成操作
	if(m_pDibObject == NULL)
	{
		AfxMessageBox("没有传入原始图像,无法完成操作!");
		return FALSE;
	}

	if(pRed == NULL)
	{
		AfxMessageBox("没有传入红色通道指针,无法完成操作!");
		return FALSE;
	}

	//已是256色灰度图像不用再转换
	if(IsGray256())
	{
		AfxMessageBox("已是256色灰度图像,不能进行通道分离!");
		return FALSE;
	}

	//红色通道
	MakeGray256(1, pRed);
	
	return TRUE;
}

////////////////////////////////////////////////////////////////////////
//BOOL GetGreenChannel()   
//----------------------------------------------------------------------
//基本功能:本函数获得传入的CDibObject对象中的图像中的绿色分量通道。
//----------------------------------------------------------------------
//参数说明:CDibObject *pGreen	指向混合通道的图像指针
//----------------------------------------------------------------------
//返    回:成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CPointPro::GetGreenChannel(CDibObject *pGreen)
{
	//没有传入相应指针无法完成操作
	if(m_pDibObject == NULL)
	{
		AfxMessageBox("没有传入原始图像,无法完成操作!");
		return FALSE;
	}

	if(pGreen == NULL)
	{
		AfxMessageBox("没有传入通道指针,无法完成操作!");
		return FALSE;
	}

	//已是256色灰度图像不用再转换
	if(IsGray256())
	{
		AfxMessageBox("已是

⌨️ 快捷键说明

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