www.pudn.com > ImageProcessing.rar.rar > DWT.CPP


// 文件DWT.cpp存放的是有关小波变换的函数 
 
#include "stdafx.h" 
#include "cdib.h" 
#include "math.h" 
#include "GlobalApi.h" 
 
 
/************************************************************************* 
 * 
 * \函数名称: 
 *   DWT_1D() 
 * 
 * \输入参数: 
 *   double * pDbSrc		- 指向源数据的指针 
 *   int nMaxLevel		- 最大可分解的层数 
 *   int nDWTSteps		- 需要分界的层数 
 *   int nInv			- 是否为DWT,1表示为IDWT,0表示DWT 
 *   int nStep			- 当前的计算层数 
 *   int nSupp			- 小波基的紧支集的长度 
 * 
 * \返回值: 
 *   BOOL			- 成功则返回TRUE,否则返回FALSE 
 * 
 * \说明: 
 *   该函数用对存放在pDBSrc中的数据进行一维DWT或者IDWT。其中,nInv为表示进行 
 *   DWT或者IDWT的标志。nStep为当前已经分界的层数。计算后数据仍存放在pDbSrc中 
 * 
 ************************************************************************* 
 */ 
BOOL DWT_1D(double* pDbSrc, int nMaxLevel, 
			int nDWTSteps, int nInv, int nStep, int nSupp ) 
{ 
	// 计算最小可分界的层数 
	int MinLevel = nMaxLevel-nDWTSteps; 
 
	// 判断是否为DWT 
	if (!nInv) 
	{	// DWT 
		int n = nMaxLevel; 
 
		while (n>MinLevel) 
			// 调用DWTStep_1D进行第n层的DWT 
			if (!DWTStep_1D(pDbSrc, n--, nInv, nStep, nSupp))  
				return FALSE; 
	} 
 
	// nInv为1则进行IDWT 
	else 
	{	// IDWT 
		int n = MinLevel; 
 
		while (n=0); 
 
	// 计算当前层数的长度 
	int CurN = 1<10 || CurN<2*nSupp)  
		return FALSE; 
 
	// 分配临时内存用于存放结果 
	double *ptemp = new double[CurN]; 
	if (!ptemp) return FALSE; 
 
	double	s1, s2; 
	int	Index1, Index2; 
 
	// 判断是进行DWT还是IDWT 
	if (!nInv) 
	{	// DWT 
		Index1=0; 
		Index2=2*nSupp-1; 
		 
		// 进行卷积,其中s1为低频部分,s2为高频部分的结果 
		for (int i=0; iMinWLevel) 
			if (!DWTStep_2D(pDbSrc, n--, m--, nMaxWLevel, nMaxHLevel, nInv, nStep, nSupp))  
				return FALSE; 
	} 
 
	// 否则进行IDWT 
	else 
	{	// IDWT 
		int n = MinWLevel, m = MinHLevel; 
 
		// 调用DWTStep_2D进行IDWT,进行恢复的层数为nDWTSteps	 
		while (nnMaxWLevel || nDWTSteps>nMaxHLevel || nStep<=0) 
		return FALSE; 
 
	// 获得X,Y方向上的最大象素数(2次幂对齐) 
	int W = 1<>nDWTSteps, minH = H>>nDWTSteps; 
 
	int i, j, index; 
	 
	// 分配临时内存存放结果 
	double*	pDbTemp = new double[W*H]; 
	if (!pDbTemp) return FALSE; 
 
	// 判断是进行DWT还是IDWT,然后将数据存放到临时内存中,需要注意的是,需要进行采样 
	if (!nInv)	// DWT 
		for (index=0; index=255) return (BYTE)255; 
	else return (BYTE)(f+0.5); 
} 
 
/************************************************************************* 
 * 
 * \函数名称: 
 *   FloatToChar() 
 * 
 * \输入参数: 
 *   double  f			- 输入双精度变量 
 * 
 * \返回值: 
 *   Char			- 返回字符变量 
 * 
 * \说明: 
 *   该函数将输入的双精度变量转换为Char型的变量 
 * 
 ************************************************************************* 
 */ 
char FloatToChar(double f) 
{ 
	if (f>=0) 
		if (f>=127.0) 
			return (char)127; 
		else return (char)(f+0.5); 
	else 
		if (f<=-128) 
			return (char)-128; 
		else return -(char)(-f+0.5); 
} 
 
/************************************************************************* 
 * 
 * \函数名称: 
 *   Log2() 
 * 
 * \输入参数: 
 *   int  n			- 输入整型变量 
 * 
 * \返回值: 
 *   int			- 返回输入参数的对数 
 * 
 * \说明: 
 *   该函数求取输入参数的以2为底的对数,并转换为整型输出。 
 * 
 ************************************************************************* 
 */ 
int Log2(int n) 
{ 
	int rsl = 0; 
	while (n >>= 1) rsl++; 
	return rsl; 
}