摘要:随着小波研究的深入,小波变换的应用范围越来越广泛,但是一般的研究、工作中只是使用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语言程序包,小波变换VC6.0程序实现相关推荐

  1. vc6.0程序运行报错误码为0xc0000005的错误。

    问题: vc6.0程序运行报错误码为0xc0000005的错误. 原因: 自己的代码有问题,导致访问了非法地址,出现该问题.

  2. c语言中的16进制坐标计算器,C语言实现简单计算器(VC6.0环境)

    C语言版简易计算器,包含几个小功能,而且比较精简,适合新手了解整合框架结构 源代码如下: #include #include #include //预处理指令 int main(void) { dou ...

  3. oracle 内置程序包,建立程序包的方法,程序包中使用游标,常用程序包

    文章目录 1. 程序包 1.1 程序包定义 1.2 程序包创建 1.3 程序包中的游标 1.4 有关程序包的信息 2. 内置程序包 3. DBMS_JOB包 4. UTL_FILE包 1. 程序包 1 ...

  4. c语言怎么改变程序的图标,VC6.0 控制台程序添加图标的两种方法

    如何给C控制台程序添加图标说来很惭愧的问题,C语言也算学了很长一阵子,目前还是停留在控制台的水平,今天用着用着突然想给程序换个图标,却找不到在哪设置,又没窗体,在哪弄呢?百度N久,找到如下两种解决方案 ...

  5. android studio编译找不到程序包,AndroidStudio编译提示“程序包R不存在”可能的解决方案,希望你用不到。。。-Go语言中文社区...

    由于工作需要,临时接手一个用AndroidStudio开发的项目,还要求两天内开发一个功能.没怎么用过AndroidStudio,临时抱佛脚,项目导入后,各种错误,终于项目能跑起来了,能开发了,然后添 ...

  6. linux程序包覆盖安装,Linux—程序包安装与管理

    1.软件包是对于一种软件所进行打包的方式.在不同的操作系统中,软件包的类型有很大的区别. 对于Linux系统中,软件包主要以两种形式出现:二进制包以及源代码包. 二进制包: 1)传统的red hat ...

  7. java提示程序包不存在,IDEA 程序包不存在,找不到符号但是明明存在对应的jar包(问题分析及解决方案)...

    环境 IntelliJ IDEA 2020.1 JDK1.8 前提概要 问题1和问题2其实是同一个问题,但是表现上有一点不一样 具体是如何引起该问题,尚不清楚,特此记录 问题1描述 一运行spring ...

  8. c语言编译器 win8.1,VC6.0++ win8 32/64位

    Microsoft Visual C++6.0 win8版,全面支持Windows8/Windows8.1 32/64位系统使用.VC++6.0是学习C语言比较主流的一款编译工具.由于VC++6.0对 ...

  9. vc6.0程序界面实现XP风格方法

    本文转帖自:http://ily961.bokee.com/3306477.html 关于让自己的程序界面实现XP风格这个问题,在网上的讨论很多,大多数的作法都是写一个.manifest文件,然后将文 ...

最新文章

  1. python 装饰器 二 (装饰带参数的函数)
  2. 仿IOS效果-带弹簧动画的ListView
  3. Yale CAS + .net Client 实现 SSO(3)
  4. OpenStack行业实践和发展趋势
  5. python内点法_Python_Day_02 str内部方法总结
  6. (56)zabbix Screens视图配置
  7. 线性代数与矩阵论 习题 1.2.2
  8. 你和一位姑娘正在恋爱,很想知道她是不是喜欢自己
  9. ajax异步获取右侧html,Ajax异步获取html数据中包含js方法无效的解决方法
  10. Laravel Blade 模板用法
  11. 娜璋初识(一)你的酒窝没有酒,我却醉得像条狗,看程序员如何表白
  12. python3处理普通文件【open内置函数】
  13. python计算勾股定理公式_三角函数、公式、勾股定理、三角形
  14. 面对传销,该怎么处理
  15. web网页常见特效3——轮播图
  16. 《当我谈跑步时我谈些什么》:痛苦难以避免,而磨难可以选择
  17. LeetCode07整数反转(JAVA)
  18. sheng的学习笔记-平衡二叉树(AVL)和3+4重构
  19. Dapper,大规模分布式系统的跟踪系统
  20. 百度推广——搜索营销新视角

热门文章

  1. jupyter函数的自我总结
  2. 2021-03-15 springboot开发的开源项目
  3. C++友元类和友元函数
  4. php中文网 日历,PHP简单日历实现方法
  5. 经典古诗词名言名句大全
  6. 【单片机毕业设计】基于单片机的农田环境监测系统的设计
  7. 安装mysql5.7.16_Win7下安装MySQL5.7.16过程记录
  8. 在CSDN中如何快速转载文章
  9. qt5报错Installed Qt WebEngine locales directory not found at location
  10. BUU-MISC-[MRCTF2020]Unravel!!