⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wvlttransdib.cpp

📁 数字图像处理课间。非常全面
💻 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; j<height; j++)
	{
		for(i=0; i<nWide-1; i++)
		{
			temp1[j*wide+nWide-1+i] =temp1[j*wide+(nWide-1)+i] - temp1[j*wide+i]+128;	
		}
	}

	//小波经过处理后,放入显示缓存中
    for(j=0; j<(int)height; j++)
	{
		for(i=0; i<(int)wide; i++)
		{
			m_pData2[j*wide+i]  = temp1[j*wide+i];
		}
	}
	//删除临时的数据空间
	delete temp1;
}

/********************************************************************************
*函数描述:	Liebianhuan实现小波列变换
*函数参数:	无 
*函数返回值:函数无返回值						  
*********************************************************************************/
void CWvltTransDib::Liebianhuan()
{
	int i,j;
	LONG wide,height;
	LPBYTE  temp,m_pData2;
	wide=this->GetWidth();
	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; i<wide; i++)
	{
		for(j=0; j<nHeight-1; j++)
		{
			temp[ j*wide+i]=temp[(nHeight + j)*wide+i]- temp[j*wide+i]+128;
		}
	}
    for(j=0; j<(int)height; j++)
	{
		for(i=0; i<(int)wide; i++)
		{
			m_pData2[j*wide+i]  = temp[j*wide+i];
		}
	}
	//删除临时的数据空间
	delete temp;	
}


/********************************************************************************
*函数描述:	Once实现小波变换
*函数参数:	int n 小波变换的层数 
*函数返回值:函数无返回值						  
*********************************************************************************/
void CWvltTransDib::Once(int n)
{
	int i,j;
	LONG wide,height,nWide,nHeight;
	LPBYTE temp1, temp2,m_pData2;
	for(int k=1;k<=n;k++)
    {
		wide=this->GetWidth();
		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<height; j++)
		{
			for(i=0; i<nWide-1; i++)
			{
				temp1[j*wide+nWide-1+i] =temp1[j*wide+nWide-1+i] - temp1[j*wide+i]+128;	
			}
		}
		//完成列变换
		for(i = 0; i < wide/pow(2,k-1); i ++)            
		{
			for(j =  height*(1-1/pow(2,(k-1))); j <  height*(1-1/pow(2,(k-1)))+nHeight; j ++)           
			{
				int m, h;
				m=height*(1-1/pow(2,(k-1)));
				h= (j-m)*2 ;
				temp2[j*wide+i] = temp1[(m+h)*wide+i];		//even
				temp2[(nHeight + j)*wide+i] = temp1[(m+h+1)*wide+i];	//odd
			}
		}
		//通过图像的差分,完成小波变换
		for(i=0; i<wide/pow(2,k-1); i++)
		{
			for(j =  height*(1-1/pow(2,(k-1))); j <  height*(1-1/pow(2,(k-1)))+nHeight; j ++) 
			{
				temp2[ j*wide+i] = temp2[j*wide+i]-temp2[(nHeight + j)*wide+i]+128;
			}
		}
		//小波经过处理后,放入显示缓存中
		for(j = height*(1-1/pow(2,(k-1))); j < height; j ++)    
		{
			for(i=0; i<wide/pow(2,k-1); i++)
			{
				m_pData2[j*wide+i]  = temp2[j*wide+i];
			}
		}
		//删除临时的数据空间
		delete temp1;
		delete temp2;
	}
}

/********************************************************************************
*函数描述:	IDWT 实现小波反变换
*函数参数:	int n 小波变换的层数 
*函数返回值:函数无返回值						  
*********************************************************************************/
void CWvltTransDib::IDWT(int n)
{
	int i,j;
	LONG wide,height,nWide,nHeight;
	LPBYTE temp1, temp2,temp3,m_pData2;
	for(int k=n;k>=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; i<wide/pow(2,k-1); i++)
		{
			for(j =  height*(1-1/pow(2,(k-1))); j <  height*(1-1/pow(2,(k-1)))+nHeight; j ++) 
			{
				temp1[ j*wide+i]=temp1[(nHeight + j)*wide+i]+ temp1[j*wide+i]-128;
			}
		}
		for(i = 0; i < wide/pow(2,k-1); i ++)            
		{
			for(j =  height*(1-1/pow(2,(k-1))); j <  height*(1-1/pow(2,(k-1)))+nHeight; j ++)           
			{
				int m, h;
				m=height*(1-1/pow(2,(k-1)));
				h= (j-m)*2 ;
				temp2[(m+h)*wide+i]=temp1[j*wide+i];
				temp2[(m+h+1)*wide+i]=temp1[(nHeight + j)*wide+i];
			}
		}
		for(j= height*(1-1/pow(2,(k-1))); j<height; j++)
		{
			for(i=0; i<nWide-1; i++)
			{
				temp2[j*wide+nWide+i] += temp2[j*wide+i]-128;	
			}
		}
		for(j = height*(1-1/pow(2,(k-1))); j < height; j ++)            
		{
			for(i = 0; i < nWide; i ++)           
			{
				int w = i *2;
				temp3[j*wide+w]=temp2[j*wide+i];
				temp3[j*wide+w+1]=temp2[j*wide+nWide+i];
			}
		}		
		//小波经过处理后,放入显示缓存中
		for(j = height*(1-1/pow(2,(k-1))); j < height; j ++)    
		{
			for(i=0; i<wide/pow(2,k-1); i++)
			{
				m_pData2[j*wide+i]  = temp3[j*wide+i];
			}
		}
		//删除临时的数据空间
		delete temp1;
		delete temp2;
	}
}

/********************************************************************************
*函数描述:	LowFilter实现小波低通滤波效果
*函数参数:	int n 小波变换层数 
*函数返回值:函数无返回值						  
*********************************************************************************/
void CWvltTransDib::LowFilter(int n)
{
	int i,j;
	LONG wide,height,nWide,nHeight;
	LPBYTE m_pData2;
	wide=this->GetWidth();
	height=this->GetHeight();
	m_pData2=this->GetData2();
	nWide=wide/2;
	nHeight=height/2;
	Once(n);
	for(j=0;j<height;j++)
	{
		for(i=0;i<wide;i++)
		{
			if((j>=height*(1-1/pow(2,(n-1))))&&(i<wide/pow(2,n)))
				continue;
			else
				m_pData2[j*wide+i] =(BYTE)128;
		}
	}
	IDWT(n);
}

/********************************************************************************
*函数描述:	HighFilter 实现高通滤波效果
*函数参数:	int n 小波变换层数 
*函数返回值:函数无返回值						  
*********************************************************************************/
void CWvltTransDib::HighFilter(int n)
{
	int i,j;
	LONG wide,height,nWide,nHeight;
	LPBYTE m_pData2;
	wide=this->GetWidth();
	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<height;j++)
	{
		for(i=0;i<wide/pow(2,n);i++)
		{
			m_pData2[j*wide+i] =(BYTE)128;
		}
	}
	IDWT(n);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -