www.pudn.com > vc++wavelettransforminimageprocessing.rar > WvltTransDib.cpp


// WvltTrans.cpp: implementation of the CWvltTrans class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "windowsx.h" 
#include "math.h" 
 
#include "MainFrm.h" 
#include "DynSplitView2.h" 
#include "WvltTransDib.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CWvltTransDib::CWvltTransDib() 
{ 
 
} 
 
CWvltTransDib::~CWvltTransDib() 
{ 
 
} 
 
/******************************************************************************** 
*函数描述:	Hangbianhuan实现小波行变换 
*函数参数:	无  
*函数返回值:函数无返回值						   
*********************************************************************************/ 
void CWvltTransDib::Hangbianhuan() 
{ 
	int i,j; 
	LONG wide,height; 
	LPBYTE temp1,m_pData2; 
 
	wide=this->GetWidth(); 
	height=this->GetHeight(); 
	m_pData2=this->GetData2(); 
 
	int nWide=wide/2; 
 
	//分配临时数据空间 
	temp1 = new BYTE[height*wide]; 
 
	//从设备缓存中获得原始图像数据 
    for(j = 0; j < height; j ++)             
	{ 
		for(i = 0; i < nWide; i ++)            
		{ 
			int w = i *2; 
			temp1[j*wide+i] = m_pData2[j*wide+w];		//偶 
			temp1[j*wide+nWide+i] = m_pData2[j*wide+w+1];	//奇 
		} 
	} 
	//通过图像的差分,完成小波变换 
	for(j=0; jGetWidth(); 
	height=this->GetHeight(); 
	m_pData2=this->GetData2(); 
	int nHeight=height/2; 
	//分配临时数据空间 
	temp = new BYTE[height*wide]; 
	for(i = 0; i < wide; i ++)             
	{ 
		for(j = 0; j < nHeight; j ++)            
		{ 
			int h = j *2 ; 
			temp[j*wide+i] = m_pData2[h*wide+i];		//even 
			temp[(nHeight + j)*wide+i] = m_pData2[(h+1)*wide+i];	//odd 
		} 
	} 
	//通过图像的差分,完成小波变换 
	for(i=0; iGetWidth(); 
		height=this->GetHeight(); 
		m_pData2=this->GetData2(); 
		//分配临时数据空间 
		temp1 = new BYTE[height*wide]; 
		temp2 = new BYTE[height*wide]; 
		nWide=wide/pow(2,k); 
		nHeight=height/pow(2,k); 
		//完成行变换 
		for(j = height*(1-1/pow(2,(k-1))); j < height; j ++)             
		{ 
			for(i = 0; i < nWide; i ++)            
			{ 
				int w = i *2; 
				temp1[j*wide+i] = m_pData2[j*wide+w];		//偶 
				temp1[j*wide+nWide+i] = m_pData2[j*wide+w+1];	//奇 
			} 
		} 
		//通过图像的差分,完成小波变换 
		for(j= height*(1-1/pow(2,(k-1))); j=1;k--) 
    { 
		wide=(this->GetWidth()); 
		height=(this->GetHeight()); 
		m_pData2=this->GetData2(); 
		//分配临时数据空间 
		temp1 = new BYTE[height*wide]; 
		temp2 = new BYTE[height*wide]; 
		temp3 = new BYTE[height*wide]; 
		nWide=wide/pow(2,k); 
		nHeight=height/pow(2,k); 
		memcpy(temp1,m_pData2,height*wide); 
		for(i=0; iGetWidth(); 
	height=this->GetHeight(); 
	m_pData2=this->GetData2(); 
	nWide=wide/2; 
	nHeight=height/2; 
	Once(n); 
	for(j=0;j=height*(1-1/pow(2,(n-1))))&&(iGetWidth(); 
	height=this->GetHeight(); 
	m_pData2=this->GetData2(); 
	nWide=wide/2; 
	nHeight=height/2; 
	LONG lLineBytes = (wide*3+3)/4 *4;	 
	Once(n); 
	for(j=height*(1-1/pow(2,(n-1)));j