65.9K
CodeProject 正在变化。 阅读更多。
Home

多维离散小波变换

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.52/5 (15投票s)

2012年5月16日

CPOL

1分钟阅读

viewsIcon

63720

downloadIcon

2426

多维小波变换的实现

介绍 

我提供了一个多维离散小波变换的类。这个类可以分析多维输入信号并在处理后合成它。输入信号可以是单维信号(如波形),二维信号(如图像)或多维信号。

背景  

在使用这个类之前,您需要了解离散小波变换(DWT)。下图显示了DWT的基本思想。

经过DWT后,输入信号被分解为小波系数。这些小波系数可以被处理并合成成输出信号。整个过程中有四个滤波器:高通滤波器H和H';低通滤波器L和L'。

经过DWT后,输入信号被分解为小波系数。这些小波系数可以被处理并合成成输出信号。整个过程中有四个滤波器:高通滤波器H和H';低通滤波器L和L'。

使用代码 

该类如下所示。

//
// The wavelet transform class
//
class WaveletAnalysis{
public:
// the construction
	WaveletAnalysis(vector<double> input,vector<unsigned int> dim,unsigned int level,
		vector<double> h0,vector<double> h1,vector<double> h2,vector<double> h3);
	~WaveletAnalysis(void);

private:
// The four filters: L(H0),H(H1),L'(H2),H'(H3)
	CFilterFunc funcH0,funcH1,funcH2,funcH3;

// The decomposition levels
	unsigned int level;
// The buffer which save the signal and the wavelet coefficients
	vector<double> scalevalues;
	vector<double> waveletvalues;

	vector<double> *inputvalues;
	vector<double> *outputvalues;
	vector<unsigned int> offsets;
	vector<unsigned int> lens;

// The multidimensional lengths
	vector<unsigned int> dimensions;

public:
	void resetlevel(unsigned int level);
	void resetinput(vector<double> input,vector<unsigned int> ds);

//DWT
	void transform();
//iDWT
	void itransform();

	double getOutputValue(vector<unsigned int> ord){
		offsets = ord;
		unsigned int offset = getOffset();
		return (*outputvalues)[offset];}
//The process between the DWT and iDWT
	void process();
private:
	typedef void (WaveletAnalysis::*FuncInWhile)(void *);
	void whileProcess(FuncInWhile func,void* parameter);

	void initOffsetsAndLens(unsigned int level);
	void initOutput(void *v);

	void reconstructOneDimension(void * d);
	void analyzeOneDimension(void * d);

	inline void copyInput2Output(void *);
	inline void copyInput2OuputOnDim(void *dim);

	inline void swapVectorPointer();
	unsigned int getOffset();
};
  


// The main process of the DWT and iDWT

void WaveletAnalysis::transform(){
	inputvalues = &scalevalues;
	outputvalues = &waveletvalues;

	for(unsigned int l = 0; l < level; ++l){
		for(unsigned int d = 0; d < dimensions.size(); d++){
			initOffsetsAndLens(l);
			lens[d] = lens[d] >> 1;
			whileProcess(&WaveletAnalysis::analyzeOneDimension,&d);
			swapVectorPointer();
		}

		initOffsetsAndLens(l);
		whileProcess(&WaveletAnalysis::copyInput2Output,NULL);
		swapVectorPointer();

		initOffsetsAndLens(l+1);
		whileProcess(&WaveletAnalysis::copyInput2Output,NULL);
		swapVectorPointer();
	}
}

void WaveletAnalysis::itransform(){
	swapVectorPointer();

	for(unsigned int l = level; l > 0; --l){
		for(int d = dimensions.size() - 1; d >=0 ; d--){
			initOffsetsAndLens(l-1);
			whileProcess(&WaveletAnalysis::initOutput,0);

			initOffsetsAndLens(l-1);
			lens[d] = lens[d] >> 1;

			whileProcess(&WaveletAnalysis::reconstructOneDimension,&d);
			swapVectorPointer();

			initOffsetsAndLens(l-1);
			whileProcess(&WaveletAnalysis::copyInput2Output,NULL);
			swapVectorPointer();
		}
	}
}   

该类的输入是四种类型的参数

1. 输入信号。

2. 多维信号的维数长度。

3. 分解层级。

4. 四个滤波器。

以二维图像为例

输入信号是:

维数长度是:

// the multidimensional lengths
vector<unsigned int> dimensions; 
dimensions.push_back(512);
dimensions.push_bask(512);  

分解层级是 5。

四个滤波器是 Haar 滤波器

// Haar wavelet
vector<double> h0, h1,h2,h3;
double sqr = sqrtf(2.0);
h0.push_back(0.5*sqr);
h0.push_back(0.5*sqr);
h1.push_back(-0.5*sqr );
h1.push_back(0.5*sqr );
h2.push_back(0.5*sqr);
h2.push_back(0.5*sqr);
h3.push_back(-0.5*sqr );
h3.push_back(0.5*sqr ); 

DWT 的结果是

我删除了高频系数并进行了 iDWT,信号的输出如下所示

关注点

这个类可以分析任何维度的信号。第二个参数定义了每个维度的长度。输入信号(输入信号)的长度应与第二个参数定义的长度相同。

历史

版本 1.0

© . All rights reserved.