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