www.pudn.com > bmplib的读取和各种经典图片变化处理算法的比较.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;
}