小波变换c语言程序包,小波变换VC6.0程序实现

摘要:随着小波研究的深入,小波变换的应用范围越来越广泛,但是一般的研究、工作中只是使用Matlab的小波工具包来编程。该文使用VC++6.0设计实现基于小波变换的数字图像处理软件模块,编写具体实现程序,设计软件界面,使其使用方便快捷,对于今后使用小波变换进行各种实际工作有一定的帮助。

关键词:小波变换;VC++6.0;Matlab

中图分类号:TP311文献标识码:A文章编号:1009-3044(2010)03-615-02

Wavelet Transform Procedures for Implementation VC++6.0

LIU Chao1, XING Shu-guang1, YANG Xi-e2

(1.China University of Geosciences (Wuhan) The Faculty of Earth Resources, Wuhan 430074, China; 2.Northwest A&F University, College of Humanities, Yangling 712100, China)

Abstract: With the wavelet-depth study, the scope of application of wavelet transform more and more widely, but most of the research, the work is the use of Matlab wavelet toolkit for programming. This paper uses the Design and Implementation of VC++6.0 digital image processing software modules based on wavelet transform to prepare concrete realization of programs, design software interface to make it a convenient, for helping future use of wavelet transform to the practical work.

Key words: wavelet transform; VC++6.0; Matlab

1 概述

多分辨率分析和多尺度几何分析的结合已经成为目前学术界的热门课题。

小波最先始于学者Harr提出的一种非连续可微的正交分解,之后,物理学家Levy利用Harr小波变换研究分子的布朗运动,Mallat提出了相当于傅里叶变换中FFT的Mallat算法,Daubechies构造出的紧支撑小波,如今,第二代甚至第三代小波都得到了飞速发展。

小波分析是即傅里叶分析之后,信号处理方面里程碑式的发展结晶。工程应用方面,小波变换在数字信号处理、图像处理、语音处理、生物医学信号处理等实践中的应用越来越广泛。但是目前,在小波变换研究和工程应用主要通过使用Matlab小波工具箱来实现。相关的C语言编码较少,且不易使用。

2 离散小波变换

在实际应用中,离散小波变换的实现容易,能为信号分析与合成提供足够的信息,同时降低计算机的资源消耗和计算量。因此,本文主要介绍离散小波变换。

在离散小波变换中,首先通过卷积运算完成信号的滤波,将信号分解为信号的初级估计近似和信号的细节信息,然后在不同的频带上利用不同的尺度因子对信号进行处理。离散变换示意图如图1。

图中x(n)是原始信号,然后通过g(n)和h(n)完成分解,信号带宽利用f表示。完成滤波后的滤波输出等式为等式(1)高通滤波输出和等式(2)低通滤波输出

3 一维小波变换VC++实现

由2可知,离散小波变换实际是通过卷积运算完成的,小波变换一维DWT或IDWT实现代码如下:

1) 函数输入

double * data,指向源数据的指针。intnCurLongth,当前处理数据长度。int IDWT,是否为DWT,1表示为IDWT,0表示DWT。int nStep,当前分解层数 。int nSupp,小波基的紧支集的长度。本文中,小波基存储在hCoef这个二维数组中,通过nSupp调用小波基

double s = sqrt(2);double* h = NULL;

h = (double*)hCoef[m_nSupp-1]; // 获得小波基的指针

int CurN = nCurLongth; // 计算当前层数的长度

// 确认所选择的小波基和当前层数的长度有效

if (m_nSupp

return FALSE;

// 分配临时内存用于存放结果

double *ptemp = new double[CurN];

if (!ptemp) return FALSE;

double s1, s2; int Index1, Index2;

// 判断是进行DWT还是IDWT

if (!nInv)

{ // DWT

Index1=0,Index2=2*m_nSupp-1;

// 进行卷积,其中s1为低频部分,s2为高频部分的结果

for (int i=0; i

{

s1 = s2 = 0;double t = -1;

for (int j=0; j

{

int m = 0,n = 0;

if(Index1 >= 0 && Index1

else if(Index1 < 0) m = CurN + Index1;

else m = Index1-CurN;

if (Index2 >= 0 && Index2

else if(Index2 < 0) n = CurN + Index2;

else n = Index2-CurN;

s1 += h[j]*data[m * nStep];

s2 += t*h[j]*data[n * nStep];

Index1++; Index2–;}

// 将结果存放在临时内存中

ptemp[i] = s1/s,ptemp[i+CurN/2] = s2/s;

Index1 -= 2*m_nSupp,Index2 += 2*m_nSupp;

Index1 += 2,Index2 += 2;

}

}

else{ // IDWT

Index1 = CurN/2; Index2 = CurN/2-m_nSupp+1;、

int nHalf=CurN/2;

for (int i=0; i

{

s1 = s2 = 0;

int Index3 = 0;

for (int j=0; j

{

int m=0, n=0;

if (Index1>=nHalf)m = Index1 – nHalf;

elsem = Index1;

if (Index2>=nHalf)n = Index2 – nHalf;

else n = Index2;

s1 += h[Index3]*data[m * nStep]

+h[Index3+1]*data[(n + CurN/2) * nStep];

s2 += h[Index3+1]*data[m * nStep]

-h[Index3]*data[(n + CurN/2) * nStep];

Index3+=2,Index1–,Index2++;}

// 将结果存入临时内存

ptemp[2*i] = s1*s,ptemp[2*i+1] = s2*s;

Index1 += m_nSupp,Index2 -= m_nSupp;

Index1++,Index2++;

}

}

// 将结果存入源图象中

for (int i=0; i

data[i*nStep] = ptemp[i];

// 释放临时内存

delete[] ptemp;

4 图像的小波变换

图像可以看做是二维的矩阵。完成小波变换后,图像便分解为4个大小为原来尺寸1/4的子块频带区域,具体处理结果如图2所示。

图中LL频带保持了原始图像内容信息,HL、LH、HH分别保持了图像水平、竖直、对角线方向上的高频边缘信息。由于篇幅有限这里就不写出二维信号的具体小波变换实现代码。其具体实现方法为先对图像小波行变换,再进行小波列变换。

本文给出了一维小波变换具体实现代码,此代码优点为实现一维变换与逆变换简便容易。在以其为基础实现二维变换时,处理图片大小不局限于N*N大小。希望对需要自己编写小波变换代码的读者有一定帮助。

参考文献:

[1] 靳济芳.Visual C++小波变换技术与工程实践[M].北京:人民邮电出版社,2004.

[2] 杨淑荧,边奠英.VC++图像处理程序设计[M].北京:清华大学出版社,北京交通大学出版社,2007.

[3] 许刚,董士崇.小波变换算法的C语言实现[J].电脑知识与技术,2005(2).

[4] 葛哲学,沙威.小波分析理论与MATLAB R2007实现[M].北京:电子工业出版社,2007.

文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览113946 人正在系统学习中 相关资源:GLONASS卫星位置计算与程序实现_葛奎_glonass_卫星位置__matlab…

来源:胡天宝

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年4月15日
下一篇 2021年4月15日

相关推荐