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

📄 wfilter.cpp

📁 本程序基于Visual C++6.0环境编写
💻 CPP
字号:
// WFilter.cpp: implementation of the CWFilter class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "wavelets.h"
#include "WFilter.h"
#include "WvltTrans.h"
#include <math.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CWFilter::CWFilter()
{

}

CWFilter::~CWFilter()
{

}


/**********************************************************************************
*函数描述:	LPass_Filter实现小波变换的低通滤波,减少图像的边缘信息,使图像更加平滑*
*函数参数:	unsigned char **pData:图像小波变换后的小波系数矩阵					  *
*			int nHeight			 :图像属性参数,数值为原始图像的高度值			  *
*			int nWidth			 :图像属性参数,数值为原始图像的宽度值			  *
*			int nLayer			 :低通滤波器的滤波阶数,数值为小波变换的层数	  *
*函数返回值:函数无返回值,小波系数参数是利用指针进行调用						  *
**********************************************************************************/

void CWFilter::LPass_Filter(short **pData, int nHeight, int nWidth, int nLayer, int scale)
{
	short **spOriginData, **spTransData0, **spTransData1;
	int iHeight = nHeight, iWidth = nWidth;
	spOriginData = pData;
	spTransData0 = new short *[nHeight];
	spTransData1 = new short *[nHeight];
	m_FilterData = new short * [nHeight];
	for(int i = 0; i < nHeight; i ++)
	{
		spTransData0[i] = new short [nWidth];
		spTransData1[i] = new short [nWidth];
		m_FilterData[i] = new short [nWidth];
		for(int j = 0; j < nWidth; j ++)
		{
			m_FilterData[i][j] = 0;
		}
	}
	CWvltTrans *Trans;
	Trans->DWT_TriLayers(spOriginData, spTransData0, spTransData1, nHeight, nHeight/2, nWidth, nWidth/2, nLayer, 1.414);
	for(i = 0; i < (int) nHeight / (4 * scale); i ++)
	{
		for(int j = 0; j < (int) nWidth / (4 * scale); j ++)
		{
			m_FilterData[i][j] = spTransData1[i][j];
		}
	}
	delete spTransData0;
	delete spTransData1;
	DWT_Inverse(iHeight, iWidth, 3);
}

/****************************************************************************
*函数描述:	HPass_Filter完成图像的高通滤波处理,得到图像的边缘信息			*
*函数参数:	short **pData		:二维指针,存放正则化后的小波系数			*
*			int   nHeight		:图像属性参数,数值为原始图像的高度值		*
*			int	  nHeight_H		:图像属性参数,数值为原始图像高度值的一半	*
*			int   nWidth		:图像属性参数,数值为原始图像的宽度值		*
*			int	  nLayer		:小波变换的层数							*
*函数返回值:函数无返回值,小波系数参数是利用指针进行调用					*
*****************************************************************************/
void CWFilter::HPass_Filter(short **pData, int nHeight, int nWidth, int nLayer)
{
	short **spOriginData, **spTransData0, **spTransData1;
	int iHeight = nHeight, iWidth = nWidth;
	spOriginData = pData;
	spTransData0 = new short *[nHeight];
	spTransData1 = new short *[nHeight];
	m_FilterData = new short * [nHeight];
	for(int i = 0; i < nHeight; i ++)
	{
		spTransData0[i] = new short [nWidth];
		spTransData1[i] = new short [nWidth];
		m_FilterData[i] = new short [nWidth];
		for(int j = 0; j < nWidth; j ++)
		{
			m_FilterData[i][j] = 0;
		}
	}
	CWvltTrans *Trans;
	Trans->DWT_TriLayers(spOriginData, spTransData0, spTransData1, nHeight, nHeight/2, nWidth, nWidth/2, nLayer, 1.414);
	for(i = (int) nHeight / 8; i <  nHeight; i ++)
	{
		for(int j = (int) nWidth / 8; j <  nWidth ; j ++)
		{
			m_FilterData[i][j] = spTransData1[i][j];
		}
	}
	delete spTransData0;
	delete spTransData1;
	DWT_Inverse(iHeight, iWidth, 3);	
}

/************************************************************************
*函数描述:	DWT_Inverse完成若干层小波变换的逆变换操作					*
*函数参数:	int   nHeight		:图像属性参数,数值为原始图像的高度值	*
*			int   nWidth		:图像属性参数,数值为原始图像的宽度值	*
*			int	  nLayer		:小波变换的层数						*
*************************************************************************/
void CWFilter::DWT_Inverse(int nHeight, int nWidth, int nLayer)
{
	int iHeight = nHeight / 4, iWidth = nWidth / 4;
	int iHeight_H = iHeight / 2, iWidth_H = iWidth / 2;
	short **spTransData0, **spTransData1;
	spTransData0 = new short * [nHeight];
	spTransData1 = new short * [nHeight];
	
	for(int i = 0; i < nHeight; i++)
	{
		spTransData0[i] = new short [nWidth];
		spTransData1[i] = new short [nWidth];
	}

	CWvltTrans WTrans;
	for( i = nLayer; i >= 1; i--)
	{
		WTrans.DWTi_Once(spTransData0, spTransData1, m_FilterData, iHeight, iHeight_H, iWidth, iWidth_H, i, 1.414);
		iHeight <<= 1;				iWidth <<= 1;
		iHeight_H = iHeight / 2;	iWidth_H = iWidth / 2;
	}
	for(int y = 0; y < nHeight; y++)
	{
		for(int x = 0; x < nWidth; x++)
		{
			m_FilterData[y][x] = spTransData0[y][x];
		}
	}
		
			
}

/****************************************************************************
*函数描述:	HPass_Filter完成图像的高通滤波处理,得到图像的边缘信息			*
*函数参数:	short **pData		:二维指针,存放正则化后的小波系数			*
*			int   nHeight		:图像属性参数,数值为原始图像的高度值		*
*			int	  nHeight_H		:图像属性参数,数值为原始图像高度值的一半	*
*			int   nWidth		:图像属性参数,数值为原始图像的宽度值		*
*			int	  nLayer		:小波变换的层数							*
*函数返回值:函数无返回值,小波系数参数是利用指针进行调用					*
*****************************************************************************/

void CWFilter::HPass_Filter2(short **pData, int nHeight, int nWidth, int nLayer)
{
	short **spOriginData, **spTransData0, **spTransData1;
	int iHeight = nHeight, iWidth = nWidth;
	spOriginData = pData;
	spTransData0 = new short *[nHeight];
	spTransData1 = new short *[nHeight];
	m_FilterData = new short * [nHeight];
	for(int i = 0; i < nHeight; i ++)
	{
		spTransData0[i] = new short [nWidth];
		spTransData1[i] = new short [nWidth];
		m_FilterData[i] = new short [nWidth];
	}
	CWvltTrans *Trans;
	Trans->DWT_TriLayers(spOriginData, spTransData0, spTransData1, nHeight, nHeight/2, nWidth, nWidth/2, nLayer, 1.414);
	for(i = 0; i <  nHeight; i ++)
	{
		for(int j = 0; j <  nWidth ; j ++)
		{
			m_FilterData[i][j] = spTransData1[i][j];
			if(i < nHeight / 8 && j < nWidth / 8)
				m_FilterData[i][j] /= 2;
		}
	}
	delete spTransData0;
	delete spTransData1;
	DWT_Inverse(iHeight, iWidth, 3);
}

⌨️ 快捷键说明

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