www.pudn.com > WaveletsAndProcessing.rar > WFilter.cpp


// WFilter.cpp: implementation of the CWFilter class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "wavelets.h" 
#include "WFilter.h" 
#include "WvltTrans.h" 
#include  
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CWFilter::CWFilter() 
{ 
 
} 
 
CWFilter::~CWFilter() 
{ 
 
} 
 
 
/********************************************************************************** 
*函数描述:	LPass_Filter实现小波变换的低通滤波,减少图像的边缘信息,使图像更加平滑* 
*函数参数:	unsigned char **pData:图像小波变换后的小波系数矩阵					  * 
*			int nHeight			 :图像属性参数,数值为原始图像的高度值			  * 
*			int nWidth			 :图像属性参数,数值为原始图像的宽度值			  * 
*			int nLayer			 :低通滤波器的滤波阶数,数值为小波变换的层数	  * 
*函数返回值:函数无返回值,小波系数参数是利用指针进行调用						  * 
**********************************************************************************/ 
 
void CWFilter::LPass_Filter(short **pData, int nHeight, int nWidth, int nLayer, int scale) 
{ 
	short **spOriginData, **spTransData0, **spTransData1; 
	int iHeight = nHeight, iWidth = nWidth; 
	spOriginData = pData; 
	spTransData0 = new short *[nHeight]; 
	spTransData1 = new short *[nHeight]; 
	m_FilterData = new short * [nHeight]; 
	for(int i = 0; i < nHeight; i ++) 
	{ 
		spTransData0[i] = new short [nWidth]; 
		spTransData1[i] = new short [nWidth]; 
		m_FilterData[i] = new short [nWidth]; 
		for(int j = 0; j < nWidth; j ++) 
		{ 
			m_FilterData[i][j] = 0; 
		} 
	} 
	CWvltTrans *Trans; 
	Trans->DWT_TriLayers(spOriginData, spTransData0, spTransData1, nHeight, nHeight/2, nWidth, nWidth/2, nLayer, 1.414); 
	for(i = 0; i < (int) nHeight / (4 * scale); i ++) 
	{ 
		for(int j = 0; j < (int) nWidth / (4 * scale); j ++) 
		{ 
			m_FilterData[i][j] = spTransData1[i][j]; 
		} 
	} 
	delete spTransData0; 
	delete spTransData1; 
	DWT_Inverse(iHeight, iWidth, 3); 
} 
 
/**************************************************************************** 
*函数描述:	HPass_Filter完成图像的高通滤波处理,得到图像的边缘信息			* 
*函数参数:	short **pData		:二维指针,存放正则化后的小波系数			* 
*			int   nHeight		:图像属性参数,数值为原始图像的高度值		* 
*			int	  nHeight_H		:图像属性参数,数值为原始图像高度值的一半	* 
*			int   nWidth		:图像属性参数,数值为原始图像的宽度值		* 
*			int	  nLayer		:小波变换的层数							* 
*函数返回值:函数无返回值,小波系数参数是利用指针进行调用					* 
*****************************************************************************/ 
void CWFilter::HPass_Filter(short **pData, int nHeight, int nWidth, int nLayer) 
{ 
	short **spOriginData, **spTransData0, **spTransData1; 
	int iHeight = nHeight, iWidth = nWidth; 
	spOriginData = pData; 
	spTransData0 = new short *[nHeight]; 
	spTransData1 = new short *[nHeight]; 
	m_FilterData = new short * [nHeight]; 
	for(int i = 0; i < nHeight; i ++) 
	{ 
		spTransData0[i] = new short [nWidth]; 
		spTransData1[i] = new short [nWidth]; 
		m_FilterData[i] = new short [nWidth]; 
		for(int j = 0; j < nWidth; j ++) 
		{ 
			m_FilterData[i][j] = 0; 
		} 
	} 
	CWvltTrans *Trans; 
	Trans->DWT_TriLayers(spOriginData, spTransData0, spTransData1, nHeight, nHeight/2, nWidth, nWidth/2, nLayer, 1.414); 
	for(i = (int) nHeight / 8; i <  nHeight; i ++) 
	{ 
		for(int j = (int) nWidth / 8; j <  nWidth ; j ++) 
		{ 
			m_FilterData[i][j] = spTransData1[i][j]; 
		} 
	} 
	delete spTransData0; 
	delete spTransData1; 
	DWT_Inverse(iHeight, iWidth, 3);	 
} 
 
/************************************************************************ 
*函数描述:	DWT_Inverse完成若干层小波变换的逆变换操作					* 
*函数参数:	int   nHeight		:图像属性参数,数值为原始图像的高度值	* 
*			int   nWidth		:图像属性参数,数值为原始图像的宽度值	* 
*			int	  nLayer		:小波变换的层数						* 
*************************************************************************/ 
void CWFilter::DWT_Inverse(int nHeight, int nWidth, int nLayer) 
{ 
	int iHeight = nHeight / 4, iWidth = nWidth / 4; 
	int iHeight_H = iHeight / 2, iWidth_H = iWidth / 2; 
	short **spTransData0, **spTransData1; 
	spTransData0 = new short * [nHeight]; 
	spTransData1 = new short * [nHeight]; 
	 
	for(int i = 0; i < nHeight; i++) 
	{ 
		spTransData0[i] = new short [nWidth]; 
		spTransData1[i] = new short [nWidth]; 
	} 
 
	CWvltTrans WTrans; 
	for( i = nLayer; i >= 1; i--) 
	{ 
		WTrans.DWTi_Once(spTransData0, spTransData1, m_FilterData, iHeight, iHeight_H, iWidth, iWidth_H, i, 1.414); 
		iHeight <<= 1;				iWidth <<= 1; 
		iHeight_H = iHeight / 2;	iWidth_H = iWidth / 2; 
	} 
	for(int y = 0; y < nHeight; y++) 
	{ 
		for(int x = 0; x < nWidth; x++) 
		{ 
			m_FilterData[y][x] = spTransData0[y][x]; 
		} 
	} 
		 
			 
} 
 
/**************************************************************************** 
*函数描述:	HPass_Filter完成图像的高通滤波处理,得到图像的边缘信息			* 
*函数参数:	short **pData		:二维指针,存放正则化后的小波系数			* 
*			int   nHeight		:图像属性参数,数值为原始图像的高度值		* 
*			int	  nHeight_H		:图像属性参数,数值为原始图像高度值的一半	* 
*			int   nWidth		:图像属性参数,数值为原始图像的宽度值		* 
*			int	  nLayer		:小波变换的层数							* 
*函数返回值:函数无返回值,小波系数参数是利用指针进行调用					* 
*****************************************************************************/ 
 
void CWFilter::HPass_Filter2(short **pData, int nHeight, int nWidth, int nLayer) 
{ 
	short **spOriginData, **spTransData0, **spTransData1; 
	int iHeight = nHeight, iWidth = nWidth; 
	spOriginData = pData; 
	spTransData0 = new short *[nHeight]; 
	spTransData1 = new short *[nHeight]; 
	m_FilterData = new short * [nHeight]; 
	for(int i = 0; i < nHeight; i ++) 
	{ 
		spTransData0[i] = new short [nWidth]; 
		spTransData1[i] = new short [nWidth]; 
		m_FilterData[i] = new short [nWidth]; 
	} 
	CWvltTrans *Trans; 
	Trans->DWT_TriLayers(spOriginData, spTransData0, spTransData1, nHeight, nHeight/2, nWidth, nWidth/2, nLayer, 1.414); 
	for(i = 0; i <  nHeight; i ++) 
	{ 
		for(int j = 0; j <  nWidth ; j ++) 
		{ 
			m_FilterData[i][j] = spTransData1[i][j]; 
			if(i < nHeight / 8 && j < nWidth / 8) 
				m_FilterData[i][j] /= 2; 
		} 
	} 
	delete spTransData0; 
	delete spTransData1; 
	DWT_Inverse(iHeight, iWidth, 3); 
}