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

📄 areapro.cpp

📁 用C++实现的数字图像处理各个算法源代码 我精心整理的 很难的啊 希望可以给大家带来帮助
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//void Smoothing()   
//----------------------------------------------------------------------
//基本功能:该函数用指定的模板(任意大小)来对指针m_pDibObject中的图像
//			对象进行平滑操作,参数nTempH指定模板的高度,参数nTempW指定模
//			板的宽度,参数nTempXc和nTempYc指定模板的中心元素坐标,参数
//			fpArray为指定模板元素数组的指针,fCoef指定系数。任何未指
//			定的或默认为-1的坐标将被置为图像的边缘值。比如:nX1和nY1会被
//			置为0;nX2和nY2会被置为图像的宽和高。对整个图像进行低通滤波
//			的最好方法是不传递任何参数。函数使用原先传入的CDibObject对
//			象指针。
//----------------------------------------------------------------------
//参数说明:float *fpArray	指向模板数组的指针
//			float fCoef		模板系数
//			int   nTempW	模板的宽度
//			int   nTempH	模板的高度
//			int   nTempXc	模板的中心元素X坐标 ( <= nTempW - 1)
//			int   nTempYc	模板的中心元素Y坐标 ( <= nTempH - 1)
//			int	  nX1		默认为-1
//			int   nY1		默认为-1
//			int	  nX2		默认为-1
//			int	  nY2		默认为-1
//----------------------------------------------------------------------
//返    回:无。
//----------------------------------------------------------------------
//注    意:此函数调用区处理类的TemplateOperation()模板操作函数对图像进行
//			平滑操作,默认的模板是3×3的Box平滑模板。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CAreaPro::Smoothing(float *fpArray, float fCoef, int nTempW, 
						int nTempH, int nTempXc, int nTempYc,
						int nX1, int nY1, int nX2, int nY2)
{
	//图像指针为空,无法操作返回
	if(m_pDibObject == NULL) return(FALSE);

	//只处理8位图像
	if(m_pDibObject->GetNumBits() != 8) 
	{
		AfxMessageBox("目前只支持8位灰度图像的处理!");
		return( FALSE );
	}

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

	//获取图像宽度和高度(以像素为单位)
	int nWidth = m_pDibObject->GetWidth();
	int nHeight = m_pDibObject->GetHeight();

	//对边界像素不作处理
	if( nX1 < nTempXc ) nX1 = nTempXc;
	if( nY1 < nTempYc ) nY1 = nTempYc;
	if( nX2 > nWidth - nTempW + nTempXc + 1) nX2 = nWidth - nTempW + nTempXc + 1;
	if( nY2 > nHeight - nTempH + nTempYc + 1) nY2 = nHeight - nTempH + nTempYc + 1;

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

	//获得图像指针
	pBuffer = (unsigned char *) m_pDibObject->GetDIBPointer( &nWidthBytes, 
		                                       m_pDibObject->GetNumBits(),
											   &nNewWidthBytes, 8);
	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)];

	dwNewSize = nNewWidthBytes * nHeight;

	//定义用于存储色相值的临时数组
	double *pHue = new double [dwNewSize];
	if(pHue == NULL) return(FALSE);
	memset(pHue, 0, dwNewSize * sizeof(double));

	//定义用于存储饱和度值的临时数组
	double *pSaturation = new double [dwNewSize];
	if(pSaturation == NULL) return(FALSE);
	memset(pSaturation, 0, dwNewSize * sizeof(double));

	//定义用于存储亮度值的临时数组
	unsigned char *pLight = new unsigned char [dwNewSize];
	if(pLight == NULL) return(FALSE);
	memset(pLight, 0, dwNewSize * sizeof(unsigned char));

	float *fTempArray;

	//默认为3×3的高通滤波器1模板
	static float fpDefaultArray[] = {1.0, 1.0, 1.0, 
							         1.0, 1.0, 1.0,
							         1.0, 1.0, 1.0};

	//没有传入模板,用默认模板
	if( fpArray == NULL ) 
	{
		fTempArray = fpDefaultArray;
		fCoef = 9;
	}
	//采用传入的模板
	else fTempArray = fpArray;

	//调用Template操作函数
	if(!TemplateOperation(fTempArray, fCoef, nTempW, nTempH, nTempXc, nTempYc,
						pBits, nWidthBytes, nX1, nY1, nX2, nY2))
	{
		return(FALSE);
	}

	//内存解锁
	::GlobalUnlock(m_pDibObject->GetDib());

	return( TRUE );

}

////////////////////////////////////////////////////////////////////////
//void Sharping()   
//----------------------------------------------------------------------
//基本功能:该函数用指定的模板(任意大小)来对指针m_pDibObject中的图像
//			对象进行锐化操作,参数nTempH指定模板的高度,参数nTempW指定模
//			板的宽度,参数nTempXc和nTempYc指定模板的中心元素坐标,参数
//			fpArray为指定模板元素数组的指针,fCoef指定系数。任何未指
//			定的或默认为-1的坐标将被置为图像的边缘值。比如:nX1和nY1会被
//			置为0;nX2和nY2会被置为图像的宽和高。对整个图像进行低通滤波
//			的最好方法是不传递任何参数。函数使用原先传入的CDibObject对
//			象指针。
//----------------------------------------------------------------------
//参数说明:float *fpArray	指向模板数组的指针
//			int nTempNum	模板个数
//			int   nTempW	模板的宽度
//			int   nTempH	模板的高度
//			int   nTempXc	模板的中心元素X坐标 ( <= nTempW - 1)
//			int   nTempYc	模板的中心元素Y坐标 ( <= nTempH - 1)
//			int	  nX1		默认为-1
//			int   nY1		默认为-1
//			int	  nX2		默认为-1
//			int	  nY2		默认为-1
//----------------------------------------------------------------------
//返    回:BOOL
//			成功时返回TRUE,失败时返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CAreaPro::Sharping(float *fpArray, int *nDirection, int nTempW, 
						int nTempH, int nTempXc, int nTempYc,
						int nX1, int nY1, int nX2, int nY2)
{
	//图像指针为空,无法操作返回
	if(m_pDibObject == NULL) return(FALSE);

	//只处理8位图像
	if(m_pDibObject->GetNumBits() != 8) 
	{
		AfxMessageBox("目前只支持8位灰度图像的处理!");
		return( FALSE );
	}

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

	//获取图像宽度和高度(以像素为单位)
	int nWidth = m_pDibObject->GetWidth();
	int nHeight = m_pDibObject->GetHeight();

	//对边界像素不作处理
	if( nX1 < nTempXc ) nX1 = nTempXc;
	if( nY1 < nTempYc ) nY1 = nTempYc;
	if( nX2 > nWidth - nTempW + nTempXc + 1) nX2 = nWidth - nTempW + nTempXc + 1;
	if( nY2 > nHeight - nTempH + nTempYc + 1) nY2 = nHeight - nTempH + nTempYc + 1;

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

	//获得图像指针
	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)];

	HGLOBAL hNewDib1, hNewDib2;

	//新图像文件大小(以字节为单位)
	dwNewSize = nWidthBytes * nHeight;
	//为新图像分配内存
	hNewDib1 = ::GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, dwNewSize );
	//内存分配失败
	if( hNewDib1 == NULL )
	{
		m_pDibObject->m_nLastError = IMAGELIB_MEMORY_ALLOCATION_ERROR;
		::GlobalUnlock( m_pDibObject->GetDib() );
		return( FALSE );
	}

	//新图像指针
	pNewBits1 = (unsigned char *) ::GlobalLock( hNewDib1 );
	if( pNewBits1 == NULL )
	{
		::GlobalFree( hNewDib1 );
		m_pDibObject->m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
		return( FALSE );
	}

	//复制图像数据
	memcpy(pNewBits1, pBits, nWidthBytes * nHeight);

	//为新图像分配内存
	hNewDib2 = ::GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, dwNewSize );
	//内存分配失败
	if( hNewDib2 == NULL )
	{
		m_pDibObject->m_nLastError = IMAGELIB_MEMORY_ALLOCATION_ERROR;
		::GlobalUnlock( m_pDibObject->GetDib() );
		return( FALSE );
	}

	//新图像指针
	pNewBits2 = (unsigned char *) ::GlobalLock( hNewDib2 );
	if( pNewBits2 == NULL )
	{
		::GlobalFree( hNewDib2 );
		m_pDibObject->m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
		return( FALSE );
	}

	//复制图像数据
	memcpy(pNewBits2, pBits, nWidthBytes * nHeight);

	float *fTempArray;

	//默认为3×3的Kirsch梯度模板
	static float fpDefaultArray[] = {5.0, 5.0, 5.0, 
							         -3.0, 0.0, -3.0,
							         -3.0, -3.0, -3.0};

	//没有传入模板,用默认模板
	if( fpArray == NULL ) fTempArray = fpDefaultArray;
	//采用传入的模板
	else fTempArray = fpArray;

	int *nTempDirection;

	//默认为8个方向
	static int nDefaultDirection[] = {1, 1, 1, 1, 1, 1, 1, 1};

	//没有传入方向,用默认方向
	if( nDirection == NULL ) nTempDirection = nDefaultDirection;
	//采用传入的方向
	else nTempDirection = nDirection;
	
	//起始方向
	int nStartD = 0;
	
	int i = 0;
	//查找起始方向
	while(nTempDirection[i] == 0 && i < 8)
	{
		//方向旋转45°		
		i++;

		//给起始方向赋值
		nStartD = i;

		//对模板进行旋转
		TemplateRotating(fTempArray);

	}

	//没指定起始方向,返回
	if(i == 8) return(FALSE);

	//调用Template操作函数
	if(!TemplateOperation(fTempArray, 1.0, nTempW, nTempH, nTempXc, nTempYc,
		pNewBits1, nWidthBytes, 
		nX1, nY1, nX2, nY2))
	{
		return(FALSE);
	}

	
	//定义与图像数据操作有关的变量
	unsigned char *pNewTemp1, *pNewTemp2;
	int x, y;

	for(i = nStartD + 1; i < 8; i++)
	{
		
		//对模板进行旋转
		TemplateRotating(fTempArray);

		if(nTempDirection[i] == 1)
		{
			//调用Template操作函数
			if(!TemplateOperation(fTempArray, 1.0, nTempW, nTempH, nTempXc, nTempYc,
				pNewBits2, nWidthBytes, 
				nX1, nY1, nX2, nY2))
			{
				return(FALSE);
			}
			
			switch(m_pDibObject->GetNumBits())
			{
			case 8:			//8位图像
				//行位置
				for(y = nY1; y <= nY2; y++ )
				{
					//新图像数据指针定位到起始位置
					pNewTemp1 = pNewBits1;
					//新图像数据指针定位到图像数据每行的起始零位置
					pNewTemp1 += y * nWidthBytes;
					//新图像数据指针定位到图像数据每行的起始nX1位置
					pNewTemp1 += nX1;
					
					//新图像数据指针定位到起始位置
					pNewTemp2 = pNewBits2;
					//新图像数据指针定位到图像数据每行的起始零位置
					pNewTemp2 += y * nWidthBytes;
					//新图像数据指针定位到图像数据每行的起始nX1位置
					pNewTemp2 += nX1;
					
					//列位置
					for(x = nX1; x <= nX2; x++)
					{
						if(pNewTemp2[x] > pNewTemp1[x])
							pNewTemp1[x] = pNewTemp2[x];
					}
				}
				break;
			}
			//复制图像数据
			memcpy(pNewBits2, pBits, nWidthBytes * nHeight);
		}
		
	}

	//复制图像数据
	memcpy(pBits, pNewBits1, nWidthBytes * nHeight);

	//内存解锁
	::GlobalUnlock(m_pDibObject->GetDib());

	//释放不再使用的内存
	::GlobalUnlock( hNewDib1 );
	::GlobalFree( hNewDib1 );
	::GlobalUnlock( hNewDib2 );
	::GlobalFree( hNewDib2 );

	return( TRUE );
}

////////////////////////////////////////////////////////////////////////
//BOOL LapSharping()   
//----------------------------------------------------------------------
//基本功能:该函数用指定的模板(任意大小)来对指针m_pDibObject中的图像
//			对象进行Laplacian锐化操作,参数nTempH指定模板的高度,参数
//			nTempW指定模板的宽度,参数nTempXc和nTempYc指定模板的中心元素
//			坐标,参数fpArray为指定模板元素数组的指针,fCoef指定系数。任
//			何未指定的或默认为-1的坐标将被置为图像的边缘值。比如:nX1和
//			nY1会被置为0;nX2和nY2会被置为图像的宽和高。对整个图像进行低
//			通滤波的最好方法是不传递任何参数。函数使用原先传入的
//			CDibObject对象指针。
//----------------------------------------------------------------------
//参数说明:float *fpArray	指向模板数组的指针
//			float fCoef		模板系数
//			int   nTempW	模板的宽度
//			int   nTempH	模板的高度
//			int   nTempXc	模板的中心元素X坐标 ( <= nTempW - 1)
//			int   nTempYc	模板的中心元素Y坐标 ( <= nTempH - 1)
//			int	  nX1		默认为-1
//			int   nY1		默认为-1
//			int	  nX2		默认为-1
//			int	  nY2		默认为-1
//----------------------------------------------------------------------
//返    回:BOOL
//			成功时返回TRUE,失败时返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CAreaPro::LapSharping(float *fpArray, float fCoef, int nTempW, 
						int nTempH, int nTempXc, int nTempYc,
						int nX1, int nY1, int nX2, int nY2)
{
	//图像指针为空,无法操作返回
	if(m_pDibObject == NULL) return(FALSE);

	//只处理8位图像
	if(m_pDibObject->GetNumBits() != 8) 
	{
		AfxMessageBox("目前只支持8位灰度图像的处理!");
		return( FALSE );
	}

⌨️ 快捷键说明

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