www.pudn.com > Videodisplay.rar > dwt.cpp
// Dwt.cpp: implementation of the Dwt class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Dwt.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/*CDwt::CDwt()
{
}
CDwt::~CDwt()
{
}*/
void CDwt::HarrDecompose(int nNumber,int nWidth,int nHeight, unsigned char *baseData, double *resultData) //harr小波分解
{
//Harr小波分解,nNumbe为分解层数
int i,j; //循环变量
unsigned char* dataTmp=new unsigned char[nWidth*nHeight];
double* baseTmp=new double[nWidth*nHeight];
double* resultTmp=new double[nWidth*nHeight];
for(i=0;i>1); m++){
for (n=hBen+2*m; n<=hEnd+2*m; n++){
tempn=n;
if ( tempn<0 ) tempn=-tempn;
if ( tempn >buflen-1 ) tempn=2*buflen-tempn-2;
*(buffer+m) = *(buffer+m)+*(p+tempn)*(*(h+n-2*m-hBen));
}// for n
for (n=2*m+1-h1End; n<=2*m+1-h1Ben; n++){
tempn=n;
if ( tempn<0 ) tempn=-tempn;
if ( tempn >buflen-1 ) tempn=2*buflen-tempn-2;
*(buffer+m+(buflen>>1)) = *(buffer+m+(buflen>>1))+*(p+tempn)*(*(g+n-2*m-1+h1End));
}
}// for m
delete []p;
}
//IDwt1D(double *buffer, int buflen, int hBen, int hEnd, int h1Ben, int h1End, double *h, double *g);
void CDwt::IDwt1D(double *buffer, int buflen, int hBen, int hEnd, int h1Ben, int h1End, double *h, double *g)
{
// FilterSet((float)0.0);
double *p;
int m,n,tempn;
p = new double [buflen];
for (m=0; m(buflen>>1)-1 ) tempn=2*(buflen>>1)-tempn-1;
buffer[m] = buffer[m] + *(p+tempn)*(*(h+m-2*n-h1Ben));
}
for(n = int(floor((m+hBen)/2.)); n<=(m+hEnd-1)/2.; n++){
tempn=n;
if ( tempn<0 ) tempn=-tempn-1;
if ( tempn >(buflen>>1)-1 ) tempn=2*(buflen>>1)-tempn-2;
buffer[m]=buffer[m]+*(p+tempn+(buflen>>1))*(*(g+m-2*n-1+hEnd));
}
}
delete []p;
}
void CDwt::cdf97Decompose(int lv, int width, int height, unsigned char*baseData,double *resultData)
{
// FilterSet((float)0.0);
int i,j,k;
if(lv==0)
{
for(i=0;i>k;
nwidth=width>>k;
//处理行
double *p;
p = new double [nwidth];
for (i=0; i>(lv-k-1);
nwidth=width>>(lv-k-1);
double *p;
p = new double [nheight];
for(j=0; j255)
resultData[j*width+i]=255;
else if(buffer[(height-j-1)*width+i]<0)
resultData[j*width+i]=0;
else
resultData[j*width+i]=(BYTE)(floor(buffer[(height-j-1)*width+i]+0.5));
}
}
delete []buffer;
}
void CDwt::FilterSet(float t)
{
hLen = 9;
h1Len = 7;
hBen = -4;
hEnd = 4;
h1Ben = -3;
h1End = 3;
h = new double [hLen];
h1 = new double [h1Len];
g = new double [h1Len];
g1 = new double [hLen];
*h = 0.0267487574; //*sqrt(2)
*(h+1) =-0.0168641184;
*(h+2) =-0.0782232665;
*(h+3) =0.2668641184;
*(h+4) =0.6029490182;
*(h+5) = *(h+3);
*(h+6) = *(h+2);
*(h+7) = *(h+1);
*(h+8) = *(h+0);
*h1 =-0.0456358815*2;
*(h1+1) = -0.0287717631*2;
*(h1+2) = 0.2956358815*2;
*(h1+3) =0.5575435262*2;
*(h1+4) = *(h1+2);
*(h1+5) = *(h1+1);
*(h1+6) = *(h1+0);
*g1 = (*(h+8))*2;
*(g1+1) = -(*(h+7))*2;
*(g1+2) = (*(h+6))*2;
*(g1+3) = -(*(h+5))*2;
*(g1+4) = (*(h+4))*2;
*(g1+5) = -(*(h+3))*2;
*(g1+6) = (*(h+2))*2;
*(g1+7) = -(*(h+1))*2;
*(g1+8) = (*h)*2;
*g = -(*(h1+6))*0.5;
*(g+1) = (*(h1+5))*0.5;
*(g+2) = -(*(h1+4))*0.5;
*(g+3) = (*(h1+3))*0.5;
*(g+4) = -(*(h1+2))*0.5;
*(g+5) = (*(h1+1))*0.5;
*(g+6) = -(*h1)*0.5;
}
void CDwt::HarrDecompose1D(int lv, int width, double *baseData, double *resultData)
{
int i,j; //循环变量
if(lv==0)
{
for(i=0;i