二维离散小波分解的C语言实现 论文
小波分析实验:二维离散小波变换(Mallat快速算法)

小波分析实验:实验2二维离散小波变换(Mallat快速算法)实验目的:在理解离散小波变换原理和Mallat快速算法的基础上,通过编程对图像进行二维离散小波变换,从而加深对二维小波分解和重构的理性和感性认识,并能提高编程能力,为今后的学习和工作奠定基础。
实验工具:计算机,matlab6.5分解算法:重构算法: “"二工必(刃- 2上*[十三g (刃- 2k )d [ *分解算法写成矩阵的形式! (lb g 的长度为4)4[0]如]力⑵ h[3] 0 0 0 '[勺【0】• 记"h[0] h[\]h[2]山⑶ …• ••••・ • •C J=勺【1] • •申[2] h[3] 00 0-.^[0] ^[1]_.勺[乃-1】_>[0] g[l] g ⑵ g[3] 0 • • •e=• 0 •g[0] g[l]g ⑵ • • g[3]■ • •・■ 0• D J =<[i]■•目2] ■g[3]0 0…茎0] 畀]|g[0] g[l] g[2] g[3] 0 0 0 I0 0 g[0] g[l]g[2] S [3] - 0• ••••• • ••・•・・■ • • g[2] g[3] 0 00 ...g[0] g[l]J |_勺4-1[叨]I二・(2»于是Mallat分解公式为矩阵变换?丄Cj- = PC^................. ⑶卩D j = Q D J-L..... .......... ⑷重构算法写成矩阵变换:-C J_I =C$ + Dj------------------------------------ (5) 4M NPPq. 一片『峰值信噪比计算公式:P沁沁逻竺皿E卢H耿V 屈E M {皿,00分别表示原始图像和重建图像,且本实验采取的一些小技乐P (I)分SW法…编程时用如下思想:(h, g 的长度为4)“今[1]勺[刀-1]■ V■■丐⑼£[1] 4刀-1】将数据。
c语言实现小波变换

c语言实现小波变换小波变换是一种非常重要的信号处理技术,广泛应用于图像处理、音频处理、视频压缩等领域。
本文将以C语言实现小波变换为主题,详细介绍小波变换的原理和实现步骤,帮助读者更好地理解和应用这一技术。
一、小波变换的原理小波变换是一种多尺度分析方法,它可以将信号从时域转换到频域,并同时提供时间和频率的局部信息。
与傅里叶变换相比,小波变换具有更好的时频局部化特性,能够更好地捕捉信号的瞬时特征。
小波变换的核心思想是利用小波基函数对信号进行分解和重构。
小波基函数是一组具有一定频率和时间局限性的函数,通过对信号进行连续的平移和缩放,可以得到不同尺度的小波函数。
在小波变换中,常用的小波基函数有Haar小波、Daubechies小波、Morlet 小波等。
二、小波变换的实现步骤在C语言中实现小波变换,需要经过以下几个步骤:1. 将原始信号进行预处理,如去除直流分量、归一化等。
这一步骤旨在减小信号的均值和幅度差异,使得小波变换结果更加准确。
2. 选择合适的小波基函数和尺度,进行小波分解。
小波分解是将信号分解为不同频率和尺度的子信号,常用的算法有离散小波变换(DWT)和连续小波变换(CWT)。
其中,离散小波变换是通过迭代地对信号进行滤波和下采样操作,将信号分解为多个尺度的近似系数和细节系数;连续小波变换则是通过连续地对信号进行小波卷积操作,得到连续尺度的小波系数。
3. 根据需要,对小波系数进行阈值处理。
阈值处理是小波去噪的关键步骤,可以通过设定一个合适的阈值,将小于该阈值的小波系数置零,从而实现信号的去噪效果。
4. 对去噪后的小波系数进行逆变换,得到重构信号。
逆变换是将小波系数重新组合成原始信号的过程,可以使用逆小波变换(IDWT)或逆连续小波变换(ICWT)来实现。
5. 对重构信号进行后处理,如恢复直流分量、反归一化等。
这一步骤是为了得到最终的去噪信号,使其与原始信号具有相似的特征。
三、C语言实现小波变换的代码示例下面是一个简单的C语言代码示例,演示了如何使用离散小波变换函数进行信号的分解和重构:```c#include <stdio.h>#include <math.h>#define N 8 // 原始信号长度#define LEVEL 3 // 分解层数// 离散小波变换函数void dwt(double signal[], double approximation[], double detail[], int length) {int i, j;double h0 = (1 + sqrt(3)) / (4 * sqrt(2));double h1 = (3 + sqrt(3)) / (4 * sqrt(2));double g0 = (1 - sqrt(3)) / (4 * sqrt(2));double g1 = (3 - sqrt(3)) / (4 * sqrt(2));for (i = 0; i < length / 2; i++) {approximation[i] = 0;detail[i] = 0;for (j = 0; j < 2; j++) {int k = (i * 2 + j) % length;approximation[i] += signal[k] * h0;detail[i] += signal[k] * h1;}}}int main() {double signal[N] = {1, 2, 3, 4, 5, 6, 7, 8};double approximation[N] = {0};double detail[N] = {0};int i;// 小波变换分解for (i = 0; i < LEVEL; i++) {dwt(signal, approximation, detail, N); for (int j = 0; j < N / pow(2, i + 1); j++) { signal[j] = approximation[j];}}// 输出分解后的近似系数和细节系数printf("Approximation: ");for (i = 0; i < N; i++) {printf("%.2f ", approximation[i]);}printf("\n");printf("Detail: ");for (i = 0; i < N; i++) {printf("%.2f ", detail[i]);}printf("\n");return 0;}```以上代码实现了一个简单的8点信号的离散小波变换过程。
两层离散小波分解

两层离散小波分解
两层离散小波分解是一种信号处理技术,用于将原始信号分解成不同频率的小波系数。
这种分解方法常用于处理非平稳信号,能够更好地捕捉信号的时频特性,对于分析和处理信号具有重要意义。
在进行两层离散小波分解时,首先需要选择适当的小波基函数。
小波基函数是一组特定形式的函数,可以用来分解信号并提取其中的特征信息。
常用的小波基函数包括Daubechies小波、Haar小波、Morlet小波等,选择合适的小波基函数对于分解结果的质量至关重要。
接下来,在选择好小波基函数之后,需要对原始信号进行两次离散小波变换。
第一次分解得到的结果包含了信号的低频成分和高频成分,再对低频成分进行第二次分解,得到更细节的频率信息。
通过这样的分层分解过程,可以将原始信号分解成不同尺度和频率的小波系数,从而更好地理解信号的时频特性。
两层离散小波分解在信号处理领域有着广泛的应用。
例如,在医学影像处理中,可以利用两层离散小波分解提取出不同频率的图像特征,对医学图像进行分析和诊断。
在通信领域,可以利用这种分解方法对信号进行压缩和去噪处理,提高通信的可靠性和效率。
此外,在金融数据分析、地震信号处理等领域,两层离散小波分解也都有着重要的应用价值。
总之,两层离散小波分解是一种强大的信号处理工具,能够有效地分析和处理非平稳信号,提取出信号的时频特性。
在各个领域都有着广泛的应用前景,对于进一步深化对信号特性的理解和提高信号处理效率具有重要意义。
二维离散小波逆变换的硬件实现

$ 为常系数。 $、 "、 ! 为浮点数; #、
图! 1234 ’
提升的 "#$ 小波逆变换过程 5263768 9: !"# ;5<= >2:&2?3 @AB$8$
% 二维小波逆变换电路结构
系统开发采用自上而下的高层次设计方法, 用 C$72>93 硬件描述语言进行设计建模。二维小波逆变 换电路结构见图 (。 数据存储器容量为 (./ D (./ D ’/ E2&, 用于保存 图像数据、 小波行列逆变换结果。数据存储器采用
9<<> 年 第 8? 卷
控制器的控制之下完成的, 各模块之间必须保持严 格的同步关系, 小波逆变换控制器记录并更新小波 变换的主要信息: 小波逆变换的当前级数、 当前级的 行计数器和列计数器、 小波变换起始信号等。本模 块采用有限状态机设计, 工作流程见图 !。
者精度几乎完全一致, 满足设计的精度要求。
图! "#$% ! 小波逆变换控制流程图 &’()*+) ,-().)/ /*-’+01*2 0.1,
达到 ;< 帧 =+。本设计提高了硬件资源的利用率, 加 快了处理速度, 且大大降低了硬件资源的需求。基 于该结构开发的二维离散小波逆变换已成功应用于 M@NK9<<< 解码系统。 参 考 文 献
" 系统仿真与精度分析
二维离散小波逆变换的硬件实现
薛一鸣 赵宇先
(中国农业大学 信息与电气工程学院,北京 !"""#$) 摘 要 设计了一种实现二维离散小波逆变换 ( %&’() 的专用电路结构。本结构基于提升的小波变换方法, 采用流
图形信息科学与技术专业2D图像离散小波变换算法研究

图形信息科学与技术专业2D图像离散小波变换算法研究进入21世纪以来,图形信息科学与技术领域取得了巨大的发展。
其中,2D图像处理技术在数字图像处理、计算机视觉、模式识别等领域中得到广泛的应用。
为了提高图像处理的效果和效率,离散小波变换(Discrete Wavelet Transform,DWT)成为了一种重要的图像处理方法。
本文将对2D图像离散小波变换算法进行研究,并探索其应用。
首先,我们需要了解小波变换的基本原理。
小波变换是一种基于函数的线性变换,它将原始信号分解为不同频率的子信号。
在图像处理中,小波变换可以将图像分解为低频部分和高频部分,分别对应图像的细节和纹理信息。
离散小波变换是对连续小波变换的离散化处理,通过采样获取离散信号的小波系数。
在2D图像离散小波变换算法的研究中,最常用的方法是基于Mallat算法的快速小波变换(Fast Wavelet Transform,FWT)。
FWT通过将图像分解为低频和高频部分,并进行多级分解,得到不同尺度和方向的小波系数。
另外,针对特定应用场景,研究者也提出了一些改进算法,如整数离散小波变换算法(Integer Wavelet Transform,IWT)和定向小波变换(Directional WaveletTransform,DWT),用于提高小波变换的计算效率和图像处理的准确性。
在实际应用中,2D图像离散小波变换算法具有广泛的应用前景。
首先,它可以用于图像压缩。
通过将图像分解为不同尺度和方向的小波系数,可以实现对图像的有损或无损压缩。
其次,离散小波变换可以用于图像增强。
通过对小波系数进行阈值处理,可以去除图像中的噪声和干扰,提高图像的质量和清晰度。
此外,离散小波变换还可以应用于图像融合、图像分割、目标识别等领域。
尽管2D图像离散小波变换算法在图像处理中具有广泛的应用,但仍存在一些待解决的问题。
首先,基于Mallat算法的FWT在多级分解时,需要大量的内存和计算资源。
二维离散小波变换

小波变换实验一二维离散小波变换(Mallat 快速算法)一、实验目的本实验的目的在于利用matlab 程序实现二维离散小波变换,并对小波系数矩阵进行重构,进而在程序的编辑过程中理解二维离散小波变换和重构的原理和实现。
同时利用不同的小波和边缘沿途哦方法,对小波系数矩阵的能量、均值、方差、信噪比等统计量进行分析比较,更深入的了解小波变换。
二、实验原理、实验编程思路本实验基于matlab 平台,编程实现二维离散小波变换的分解和重构。
已经知道离散小波变换的 1、分解算法:~2、重构算法:基于这样的分解和重构算法公式,可以将二维离散小波变换的分解算法写成矩阵的形式,以h 、g 的长度为4为例:)∑∑---=-=nj n j k n j n jkd k n g d c k n h c 11)2()2(∑∑-+-=-kjk kj k k nd k n g c k n h c )2()2(1~所以此时,mallat 分解公式写成矩阵变换就应该为:同样,重构算法写成矩阵形式应该为:在进行分解计算的过程当中,将数据1 j C 进行几种不同方式的边缘扩展(周期、补零、连续等),再将低通(高通)滤波器进行填零到数据长度,然后进行卷积计算,再2抽样,组合即可得到)(j j D C 。
{对于重构算法,对小波系数矩阵的前一半系数和后一半系数分别进行插零后,利用高通和低通滤波器进行重构,得到的结果组合后就形成重构结果。
在程序中,进行原始数据的边缘拓展的时候,采用Y = WEXTEND(TYPE,MODE,X,L,LOC)函数进行不同类型的扩展。
对扩展的数据进行小波变换分解之后,再对小波系数进行截断处理,得到最终的小波系数矩阵。
;编写的程序架构主要分为一级小波分解和重构函数mdec1和mrec1,多级小波分解和重构函数mallatdec2和mallatrec2,主函数通过对上述几个函数的调用实现二维离散小波变换的分解和重构。
然后通过改变主函数的参数(小波类型),来实现对不同类型小波来计算得到结果的比较;在通过改变Wextend函数的参数实现对采取不同的边缘延拓的方法得到的峰值信噪比的比较。
小波变换C语言实现代码

#include<stdio.h>#include<math.h>#define height 256#define width 256void twoDDWT(double org[][width], double dwt[][width],int NumofBand); void oneDDWT(int flag, double org[][width], double dwt[][width]);void twoDIDWT(double dwt[][width], double rec[][width],int NumofBand); void oneDIDWT(int flag, double dwt[][width], double rec[][width]);int main(){int i, j;double org[height][width], dwt[height][width],rec[height][width];FILE *lena;FILE *lena3;FILE *lena4;lena = fopen("c:\\lena.raw", "rb");lena3 = fopen("c:\\lena3.raw", "wb");lena4 = fopen("c:\\lena4.raw", "wb");for (i = 0; i < height; i++){for (j = 0; j < width; j++){org[i][j] = fgetc(lena);}}twoDDWT(org, dwt,4);for (i = 0; i < height/2; i++){for (j = 0; j < width/2; j++){org[i][j]=dwt[i][j];}}twoDDWT(org, dwt,7);for (i = 0; i < height; i++){for (j = 0; j < width; j++){fputc(dwt[i][j], lena3);}}twoDIDWT(dwt, rec,7);for (i = 0; i < height/2; i++){for (j = 0; j < width/2; j++){dwt[i][j]=rec[i][j];}}twoDIDWT(dwt, rec,4);for (i = 0; i < height; i++){for (j = 0; j < width; j++){fputc(rec[i][j], lena4);}}return 0;}void twoDDWT(double org[][width], double dwt[][width],int NumofBand){if (NumofBand==4){oneDDWT(0, org, dwt);oneDDWT(1, org, dwt);}if (NumofBand==7){oneDDWT(2, org, dwt);oneDDWT(3, org, dwt);}}void oneDDWT(int flag, double org[][width], double dwt[][width]){int i, j;double temp[height][width], temp1[height][width];double f_LPF[] = { -0.125, 0.25, 0.75, 0.25, -0.125 };double f_HPF[] = { -0.5, 1, -0.5 };if (flag == 0)//vertical direction{for (i = 0; i < height; i++){for (j = 0; j < width; j++){if (j == 0)temp[i][j] = f_LPF[0] * org[i][j + 2] + f_LPF[1] * org[i][j + 1] + f_LPF[2] * org[i][j] + f_LPF[3] * org[i][j + 1] + f_LPF[4] * org[i][j + 2];else if (j == 1)temp[i][j] = f_LPF[0] * org[i][j] + f_LPF[1] * org[i][j - 1] + f_LPF[2] * org[i][j] + f_LPF[3] * org[i][j + 1] + f_LPF[4] * org[i][j + 2];else if (j > 1 && j < height-2)temp[i][j] = f_LPF[0] * org[i][j - 2] + f_LPF[1] * org[i][j - 1] + f_LPF[2] * org[i][j] + f_LPF[3] * org[i][j + 1] + f_LPF[4] * org[i][j + 2];else if (j == height-2)temp[i][j] = f_LPF[0] * org[i][j - 2] + f_LPF[1] * org[i][j - 1] + f_LPF[2] * org[i][j] + f_LPF[3] * org[i][j + 1] + f_LPF[4] * org[i][j];else if (j == height-1)temp[i][j] = f_LPF[0] * org[i][j - 2] + f_LPF[1] * org[i][j - 1] + f_LPF[2] * org[i][j] + f_LPF[3] * org[i][j - 1] + f_LPF[4] * org[i][j - 2];}}for (i = 0; i < height; i++){for (j = 0; j < width/2; j++){dwt[i][j] = temp[i][j * 2 + 1];}}for (i = 0; i < height; i++){for (j = 0; j < width; j++){if (j == 0)temp[i][j] = f_HPF[0] * org[i][j + 1] + f_HPF[1] * org[i][j] + f_HPF[2] * org[i][j + 1];else if (j > 0 && j < height-1)temp[i][j] = f_HPF[0] * org[i][j - 1] + f_HPF[1] * org[i][j] + f_HPF[2] * org[i][j + 1];else if (j == height-1)temp[i][j] = f_HPF[0] * org[i][j - 1] + f_HPF[1] * org[i][j] + f_HPF[2] * org[i][j - 1];}}for (i = 0; i < height; i++){for (j = 0; j < width/2; j++){dwt[i][j + width/2] = temp[i][j * 2];}}}if (flag == 1)//horizontal direction{for (i = 0; i < height; i++){for (j = 0; j < width/2; j++){if (i == 0)temp[i][j] = f_LPF[0] * dwt[i + 2][j] + f_LPF[1] * dwt[i + 1][j] + f_LPF[2] * dwt[i][j] +f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i == 1)temp[i][j] = f_LPF[0] * dwt[i][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i > 1 && i < width-2)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i == width-2)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i][j];else if (i == width-1)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i - 1][j] + f_LPF[4] * dwt[i - 2][j];}}for (i = 0; i < height; i++){for (j = 0; j < width; j++){temp1[i][j] = temp[i * 2 + 1][j];}}for (i = 0; i < height; i++){for (j = 0; j < width/2; j++){if (i == 0)temp[i][j] = f_HPF[0] * dwt[i + 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i + 1][j];else if (i > 0 && i < width-1)temp[i][j] = f_HPF[0] * dwt[i - 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i + 1][j];else if (i == width-1)temp[i][j] = f_HPF[0] *dwt[i - 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i - 1][j];}}for (i = 0; i < height; i++){for (j = 0; j < width/2; j++){temp1[i][j+width/2] = temp[i * 2][j];}}for (i = 0; i < height; i++){for (j = width/2; j < width; j++){if (i == 0)temp[i][j] = f_LPF[0] * dwt[i + 2][j] + f_LPF[1] * dwt[i + 1][j] + f_LPF[2] * dwt[i][j] +f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i == 1)temp[i][j] = f_LPF[0] * dwt[i][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i > 1 && i < height-2)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i == height-2)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i][j];else if (i == height-1)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i - 1][j] + f_LPF[4] * dwt[i - 2][j];}}for (i = 0; i < height; i++){for (j = width/2; j < width; j++){temp1[i+height/2][j-width/2] = temp[i * 2 + 1][j];}}for (i = 0; i < height; i++){for (j = width/2; j < width; j++){if (i == 0)temp[i][j] = f_HPF[0] * dwt[i + 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i + 1][j];else if (i > 0 && i < height-1)temp[i][j] = f_HPF[0] * dwt[i - 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i + 1][j];else if (i == height-1)temp[i][j] = f_HPF[0] * dwt[i - 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i - 1][j];}}for (i = 0; i < height; i++){for (j = width/2; j < width; j++){temp1[i +height/2][j] = temp[i * 2][j];}}for (i = 0; i < height; i++){for (j = 0; j < width; j++){dwt[i][j] = temp1[i][j];}}}if (flag == 2)//vertical direction{for (i = 0; i < height/2; i++){for (j = 0; j < width; j++){if (j == 0)temp[i][j] = f_LPF[0] * org[i][j + 2] + f_LPF[1] * org[i][j + 1] + f_LPF[2] * org[i][j] + f_LPF[3] * org[i][j + 1] + f_LPF[4] * org[i][j + 2];else if (j == 1)temp[i][j] = f_LPF[0] * org[i][j] + f_LPF[1] * org[i][j - 1] + f_LPF[2] * org[i][j] + f_LPF[3] * org[i][j + 1] + f_LPF[4] * org[i][j + 2];else if (j > 1 && j < height/2-2)temp[i][j] = f_LPF[0] * org[i][j - 2] + f_LPF[1] * org[i][j - 1] + f_LPF[2] * org[i][j] + f_LPF[3] * org[i][j + 1] + f_LPF[4] * org[i][j + 2];else if (j == height/2-2)temp[i][j] = f_LPF[0] * org[i][j - 2] + f_LPF[1] * org[i][j - 1] + f_LPF[2] * org[i][j] + f_LPF[3] * org[i][j + 1] + f_LPF[4] * org[i][j];else if (j == height/2-1)temp[i][j] = f_LPF[0] * org[i][j - 2] + f_LPF[1] * org[i][j - 1] + f_LPF[2] * org[i][j] + f_LPF[3] * org[i][j - 1] + f_LPF[4] * org[i][j - 2];}}for (i = 0; i < height/2; i++){for (j = 0; j < width/4; j++){dwt[i][j] = temp[i][j * 2 + 1];}}for (i = 0; i < height/2; i++){for (j = 0; j < width/2; j++){if (j == 0)temp[i][j] = f_HPF[0] * org[i][j + 1] + f_HPF[1] * org[i][j] + f_HPF[2] * org[i][j + 1];else if (j > 0 && j < height-1)temp[i][j] = f_HPF[0] * org[i][j - 1] + f_HPF[1] * org[i][j] + f_HPF[2] * org[i][j + 1];else if (j == height-1)temp[i][j] = f_HPF[0] * org[i][j - 1] + f_HPF[1] * org[i][j] + f_HPF[2] * org[i][j - 1];}}for (i = 0; i < height/2; i++){for (j = 0; j < width/4; j++){dwt[i][j + width/4] = temp[i][j * 2];}}}if (flag == 3)//horizontal direction{for (i = 0; i < height/2; i++){for (j = 0; j < width/4; j++){if (i == 0)temp[i][j] = f_LPF[0] * dwt[i + 2][j] + f_LPF[1] * dwt[i + 1][j] + f_LPF[2] * dwt[i][j] +f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i == 1)temp[i][j] = f_LPF[0] * dwt[i][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i > 1 && i < height/2-2)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i == height/2-2)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i][j];else if (i == height/2-1)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i - 1][j] + f_LPF[4] * dwt[i - 2][j];}}for (i = 0; i < height/4; i++){for (j = 0; j < width/4; j++){temp1[i][j] = temp[i * 2 + 1][j];}}for (i = 0; i < height/2; i++){for (j = 0; j < width/4; j++){if (i == 0)temp[i][j] = f_HPF[0] * dwt[i + 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i + 1][j];else if (i > 0 && i < height/2-1)temp[i][j] = f_HPF[0] * dwt[i - 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i + 1][j];else if (i == height/2-1)temp[i][j] = f_HPF[0] * dwt[i - 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i - 1][j];}}for (i = 0; i < height/4; i++){for (j = 0; j < width/4; j++){temp1[i + height/4][j] = temp[i * 2][j];}}for (i = 0; i < height/2; i++){for (j = width/4; j < width/2; j++){if (i == 0)temp[i][j] = f_LPF[0] * dwt[i + 2][j] + f_LPF[1] * dwt[i + 1][j] + f_LPF[2] * dwt[i][j] +f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i == 1)temp[i][j] = f_LPF[0] * dwt[i][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i > 1 && i < height/2-2)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i == height/2-2)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i][j];else if (i == height/2-1)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i - 1][j] + f_LPF[4] * dwt[i - 2][j];}}for (i = 0; i < height/4; i++){for (j = width/4; j < width/2; j++){temp1[i][j] = temp[i * 2 + 1][j];}}for (i = 0; i < height/2; i++){for (j = width/4; j < width/2; j++){if (i == 0)temp[i][j] = f_HPF[0] * dwt[i + 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i + 1][j];else if (i > 0 && i < width/2-1)temp[i][j] = f_HPF[0] * dwt[i - 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i + 1][j];else if (i == width/2)temp[i][j] = f_HPF[0] * dwt[i - 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i - 1][j];}}for (i = 0; i < height/4; i++){for (j = width/4; j < width/2; j++){temp1[i + height/4][j] = temp[i * 2][j];}}for (i = 0; i < height/2; i++){for (j = 0; j < width/2; j++){dwt[i][j] = temp1[i][j];}}}}void twoDIDWT(double dwt[][width], double rec[][width],int NumofBand) {if (NumofBand==7){oneDIDWT(2, dwt, rec);oneDIDWT(3, dwt, rec);}if (NumofBand==4){oneDIDWT(1, dwt, rec);oneDIDWT(0, dwt, rec);}}void oneDIDWT(int flag, double dwt[][width], double rec[][width]){int i, j;double temp[height][width], temp1[height][width];double i_LPF[] = { 0.5, 1, 0.5 };double i_HPF[] = { -0.125, -0.25, 0.75, -0.25, -0.125 };if (flag == 2)//horizontal direction{for (i = 0; i < height/2; i++){for (j = 0; j < width/4; j++){if (i % 2 == 1)temp[i][j] = dwt[i / 2][j];elsetemp[i][j] = 0;}}for (i = 0; i < height/2; i++){for (j = 0; j < width/4; j++){if (i == 0)rec[i][j] = i_LPF[0] * temp[i + 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i + 1][j];else if (i > 0 && i < height/2-1)rec[i][j] = i_LPF[0] * temp[i - 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i + 1][j];else if (i == height/2-1)rec[i][j] = i_LPF[0] * temp[i - 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i - 1][j];}}for (i = height/4; i < height/2; i++){for (j = 0; j < width/4; j++){dwt[i - height/4][j] = dwt[i][j];}}for (i = 0; i < height/2; i++){for (j = 0; j < width/4; j++){if (i % 2 == 0)temp[i][j] = dwt[i / 2][j];elsetemp[i][j] = 0;}}for (i = 0; i < height/2; i++){for (j = 0; j < width/4; j++){if (i == 0)temp1[i][j] = i_HPF[0] * temp[i + 2][j] + i_HPF[1] * temp[i + 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i == 1)temp1[i][j] = i_HPF[0] * temp[i][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] +i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i > 1 && i < height/2-2)temp1[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i == height/2-2)temp1[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i][j];else if (i == height/2-1)temp1[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i - 1][j] + i_HPF[4] * temp[i - 2][j];}}for (i = 0; i < height/2; i++){for (j = 0; j < width/4; j++){rec[i][j] = rec[i][j] + temp1[i][j];}}for (i = 0; i < height/4; i++){for (j = width/4; j < width/2; j++){dwt[i][j - height/4] = dwt[i][j];}}for (i = 0; i < height/2; i++){for (j = 0; j < width/4; j++){if (i % 2 == 1)temp[i][j] = dwt[i / 2][j];elsetemp[i][j] = 0;}}for (i = 0; i < height/2; i++){for (j = 0; j < width/4; j++){if (i == 0)temp1[i][j] = i_LPF[0] * temp[i + 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i + 1][j];else if (i > 0 && i < height/2-1)temp1[i][j] = i_LPF[0] * temp[i - 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i + 1][j];else if (i == height/2-1)temp1[i][j] = i_LPF[0] * temp[i - 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i - 1][j];}}for (i = height/4; i < height/2; i++){for (j = width/4; j < width/2; j++){dwt[i - height/4][j - width/4] = dwt[i][j];}}for (i = 0; i < height/2; i++){for (j = 0; j < width/4; j++){if (i % 2 == 0)temp[i][j] = dwt[i / 2][j];elsetemp[i][j] = 0;}}for (i = 0; i < height/2; i++){for (j = 0; j < width/4; j++){if (i == 0)dwt[i][j] = i_HPF[0] * temp[i + 2][j] + i_HPF[1] * temp[i + 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i == 1)dwt[i][j] = i_HPF[0] * temp[i][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i > 1 && i < height/2-2)dwt[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] +i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i == height/2-2)dwt[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] +i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i][j];else if (i == height/2-1)dwt[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] +i_HPF[3] * temp[i - 1][j] + i_HPF[4] * temp[i - 2][j];}}for (i = 0; i < height/2; i++){for (j = 0; j < width/4; j++){rec[i][j + width/4] = temp1[i][j] + dwt[i][j];}}}if (flag == 3)//vertical direction{for (i = 0; i < height/2; i++){for (j = 0; j < width/2; j++){if (j % 2 == 1)temp[i][j] = rec[i][j / 2];elsetemp[i][j] = 0;}}for (i = 0; i < height/2; i++){for (j = 0; j < width/2; j++){if (j == 0)temp1[i][j] = i_LPF[0] * temp[i][j + 1] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i][j + 1];else if (j > 0 && j < height/2-1)temp1[i][j] = i_LPF[0] * temp[i][j - 1] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i][j + 1];else if (j == height/2-1)temp1[i][j] = i_LPF[0] * temp[i][j - 1] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i][j - 1];}}for (i = 0; i < height/2; i++){for (j = width/4; j < width/2; j++){rec[i][j - width/4] = rec[i][j];}}for (i = 0; i < height/2; i++){for (j = 0; j < width/2; j++){if (j % 2 == 0)temp[i][j] = rec[i][j / 2];elsetemp[i][j] = 0;}}for (i = 0; i < height/2; i++){for (j = 0; j < width/2; j++){if (j == 0)rec[i][j] = i_HPF[0] * temp[i][j + 2] + i_HPF[1] * temp[i][j + 1] + i_HPF[2] * temp[i][j] +i_HPF[3] * temp[i][j + 1] + i_HPF[4] * temp[i][j + 2];else if (j == 1)rec[i][j] = i_HPF[0] * temp[i][j] + i_HPF[1] * temp[i][j - 1] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i][j + 1] + i_HPF[4] * temp[i][j + 2];else if (j > 1 && j < height/2-2)rec[i][j] = i_HPF[0] * temp[i][j - 2] + i_HPF[1] * temp[i][j - 1] + i_HPF[2] * temp[i][j] +i_HPF[3] * temp[i][j + 1] + i_HPF[4] * temp[i][j + 2];else if (j == height/2-2)rec[i][j] = i_HPF[0] * temp[i][j - 2] + i_HPF[1] * temp[i][j - 1] + i_HPF[2] * temp[i][j] +i_HPF[3] * temp[i][j + 1] + i_HPF[4] * temp[i][j];else if (j == height/2-1)rec[i][j] = i_HPF[0] * temp[i][j - 2] + i_HPF[1] * temp[i][j - 1] + i_HPF[2] * temp[i][j] +i_HPF[3] * temp[i][j - 1] + i_HPF[4] * temp[i][j - 2];}}for (i = 0; i <height/2; i++){for (j = 0; j < width/2; j++){rec[i][j] = rec[i][j] + temp1[i][j];}}}if (flag == 1)//horizontal direction{for (i = 0; i < height; i++){for (j = 0; j < width/2; j++){if (i % 2 == 1)temp[i][j] = dwt[i / 2][j];elsetemp[i][j] = 0;}}for (i = 0; i < height; i++){for (j = 0; j < width/2; j++){if (i == 0)rec[i][j] = i_LPF[0] * temp[i + 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i + 1][j];else if (i > 0 && i < height-1)rec[i][j] = i_LPF[0] * temp[i - 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i + 1][j];else if (i == height-1)rec[i][j] = i_LPF[0] * temp[i - 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i - 1][j];}}for (i = 0; i < height/2; i++){for (j = width/2; j < width; j++){dwt[i][j - height/2] = dwt[i][j];}}for (i = 0; i < height; i++){for (j = 0; j < width/2; j++){if (i % 2 == 0)temp[i][j] = dwt[i / 2][j];elsetemp[i][j] = 0;}}for (i = 0; i < height; i++){for (j = 0; j < width/2; j++){if (i == 0)temp1[i][j] = i_HPF[0] * temp[i + 2][j] + i_HPF[1] * temp[i + 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i == 1)temp1[i][j] = i_HPF[0] * temp[i][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] +i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i > 1 && i < height-2)temp1[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i == height-2)temp1[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i][j];else if (i == height-1)temp1[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i - 1][j] + i_HPF[4] * temp[i - 2][j];}}for (i = 0; i < height; i++){for (j = 0; j < width/2; j++){rec[i][j] = rec[i][j] + temp1[i][j];}}for (i = height/2; i <height; i++){for (j = 0; j < width/2; j++){dwt[i - width/2][j] = dwt[i][j];}}for (i = 0; i < height; i++){for (j = 0; j < width/2; j++){if (i % 2 == 1)temp[i][j] = dwt[i / 2][j];elsetemp[i][j] = 0;}}for (i = 0; i < height; i++){for (j = 0; j < width/2; j++){if (i == 0)temp1[i][j] = i_LPF[0] * temp[i + 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i + 1][j];else if (i > 0 && i < height-1)temp1[i][j] = i_LPF[0] * temp[i - 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i + 1][j];else if (i == height-1)temp1[i][j] = i_LPF[0] * temp[i - 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i - 1][j];}}for (i = height/2; i < height; i++){for (j = width/2; j < width; j++){dwt[i - height/2][j - width/2] = dwt[i][j];}}for (i = 0; i < height; i++){for (j = 0; j < width/2; j++){if (i % 2 == 0)temp[i][j] = dwt[i / 2][j];elsetemp[i][j] = 0;}}for (i = 0; i < height; i++){for (j = 0; j < width/2; j++){if (i == 0)dwt[i][j] = i_HPF[0] * temp[i + 2][j] + i_HPF[1] * temp[i + 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i == 1)dwt[i][j] = i_HPF[0] * temp[i][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i > 1 && i < height-2)dwt[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] +i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i == height-2)dwt[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] +i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i][j];else if (i == height-1)dwt[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] +i_HPF[3] * temp[i - 1][j] + i_HPF[4] * temp[i - 2][j];}}for (i = 0; i < height; i++){for (j = 0; j < width/2; j++){rec[i][j + width/2] = temp1[i][j] + dwt[i][j];}}}if (flag == 0)//vertical direction{for (i = 0; i < height; i++){for (j = 0; j < width; j++){if (j % 2 == 1)temp[i][j] = rec[i][j / 2];elsetemp[i][j] = 0;}}for (i = 0; i < height; i++){for (j = 0; j < width; j++){if (j == 0)temp1[i][j] = i_LPF[0] * temp[i][j + 1] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i][j + 1];else if (j > 0 && j < height-1)temp1[i][j] = i_LPF[0] * temp[i][j - 1] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i][j + 1];else if (j == height-1)temp1[i][j] = i_LPF[0] * temp[i][j - 1] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i][j - 1];}}for (i = 0; i < height; i++){for (j = width/2; j < width; j++){rec[i][j - width/2] = rec[i][j];}}for (i = 0; i < height; i++){for (j = 0; j < width; j++){if (j % 2 == 0)temp[i][j] = rec[i][j / 2];elsetemp[i][j] = 0;}}for (i = 0; i < height; i++){for (j = 0; j < width; j++){if (j == 0)rec[i][j] = i_HPF[0] * temp[i][j + 2] + i_HPF[1] * temp[i][j + 1] + i_HPF[2] * temp[i][j] +i_HPF[3] * temp[i][j + 1] + i_HPF[4] * temp[i][j + 2];else if (j == 1)rec[i][j] = i_HPF[0] * temp[i][j] + i_HPF[1] * temp[i][j - 1] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i][j + 1] + i_HPF[4] * temp[i][j + 2];else if (j > 1 && j < height-2)rec[i][j] = i_HPF[0] * temp[i][j - 2] + i_HPF[1] * temp[i][j - 1] + i_HPF[2] * temp[i][j] +i_HPF[3] * temp[i][j + 1] + i_HPF[4] * temp[i][j + 2];else if (j == height-2)rec[i][j] = i_HPF[0] * temp[i][j - 2] + i_HPF[1] * temp[i][j - 1] + i_HPF[2] * temp[i][j] +i_HPF[3] * temp[i][j + 1] + i_HPF[4] * temp[i][j];else if (j == height-1)rec[i][j] = i_HPF[0] * temp[i][j - 2] + i_HPF[1] * temp[i][j - 1] + i_HPF[2] * temp[i][j] +i_HPF[3] * temp[i][j - 1] + i_HPF[4] * temp[i][j - 2];}}for (i = 0; i <height; i++){for (j = 0; j < width; j++){rec[i][j] = rec[i][j] + temp1[i][j];}}}}。
二维离散小波变换

小波变换实验一二维离散小波变换(Mallat 快速算法)一、实验目的本实验的目的在于利用matlab 程序实现二维离散小波变换,并对小波系数矩阵进行重构,进而在程序的编辑过程中理解二维离散小波变换和重构的原理和实现。
同时利用不同的小波和边缘沿途哦方法,对小波系数矩阵的能量、均值、方差、信噪比等统计量进行分析比较,更深入的了解小波变换。
二、实验原理、实验编程思路本实验基于matlab 平台,编程实现二维离散小波变换的分解和重构。
已经知道离散小波变换的 1、分解算法:~2、重构算法:基于这样的分解和重构算法公式,可以将二维离散小波变换的分解算法写成矩阵的形式,以h 、g 的长度为4为例:)∑∑---=-=nj n j k n j n jkd k n g d c k n h c 11)2()2(∑∑-+-=-kjk kj k k nd k n g c k n h c )2()2(1~所以此时,mallat 分解公式写成矩阵变换就应该为:同样,重构算法写成矩阵形式应该为:在进行分解计算的过程当中,将数据1 j C 进行几种不同方式的边缘扩展(周期、补零、连续等),再将低通(高通)滤波器进行填零到数据长度,然后进行卷积计算,再2抽样,组合即可得到)(j j D C 。
{对于重构算法,对小波系数矩阵的前一半系数和后一半系数分别进行插零后,利用高通和低通滤波器进行重构,得到的结果组合后就形成重构结果。
在程序中,进行原始数据的边缘拓展的时候,采用Y = WEXTEND(TYPE,MODE,X,L,LOC)函数进行不同类型的扩展。
对扩展的数据进行小波变换分解之后,再对小波系数进行截断处理,得到最终的小波系数矩阵。
;编写的程序架构主要分为一级小波分解和重构函数mdec1和mrec1,多级小波分解和重构函数mallatdec2和mallatrec2,主函数通过对上述几个函数的调用实现二维离散小波变换的分解和重构。
然后通过改变主函数的参数(小波类型),来实现对不同类型小波来计算得到结果的比较;在通过改变Wextend函数的参数实现对采取不同的边缘延拓的方法得到的峰值信噪比的比较。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
高等教育自学考试毕业论文(设计)题目:二维离散小波分解的C语言实现摘要小波变换用于图像处理是小波变换应用效果比较突出的领域之一。
由于图像是二维信号,因此首先需要把小波变换由一维推广到二维。
本文在一维离散Mallat算法的基础上,用C语言实现了二维图像的离散小波变换。
这种二维变换是行列可分离的变换方式,即二维分解可以通过行和列依次作一维分解实现。
对图像作二维离散小波分解后得到一个低频子带和一系列高频子带,分别反映图像的基本信息和细节信息。
用这些子带也可以实现图像的重构。
目录第一章绪论 (1)1. 1小波理论与应用技术的发展概况 (1)1. 2图像技术的发展历程及面临的问题 (2)1. 3小波的特点及其在图像处理中的应用 (2)第二章Mallat算法由一维到二维的推广 (4)2. 1小波级数 (4)2. 2 Mallat算法 (5)2. 3二维离散小波变换 (7)2. 4二维离散小波变换后的系数分布 (8)第三章二维Mallat算法的C语言实现 (10)3. 1基本模块 (10)3.2 单层分解与重构 (10)3.3金字塔结构的多层分解和重构 (11)3.4小波系数的数据结构 (14)3.5 结果与分析 (14)参考文献 (19)致谢 (20)第一章绪论1. 1小波理论与应用技术的发展概况小波分析是当前数学中一个迅速发展的新领域,它同时具有理论深刻和应用十分广泛的双重意义。
小波分析的应用是与小波分析的理论研究紧密地结合在一起的。
现在,它已经在科技信息产业领域取得了令人瞩目的成就。
电子信息技术是六大高新技术中重要的一个领域,它的重要方面是图像和信号处理。
现今,信号处理已经成为当代科学技术工作的重要部分,信号处理的目的就是:准确的分析、诊断、编码压缩和量化、快速传递或存储、精确地重构(或恢复)。
从数学地角度来看,信号与图象处理可以统一看作是信号处理(图像可以看作是二维信号),在小波分析地许多分析的许多应用中,都可以归结为信号处理问题。
现在,对于其性质随实践是稳定不变的信号,处理的理想工具仍然是傅立叶分析。
但是在实际应用中的绝大多数信号是非稳定的,而特别适用于非稳定信号的工具就是小波分析。
自1807年法国数学家Fourier从热传导理论提出Fourier分析以后,无论对数学史还是工程科学史的发展都起到了很大的影响和推动作用。
Fourier分析的核心是通过Fourier变换引入频率的概念,并发展了频谱分析理论,使许多通过时域分析无法看清的现象在频域中一目了然。
但Fourier变换是一种全时域变换,无法提取局部时时间段上的信号特征,为此数学家和工程师们提出了一种加时间窗的短时Fourier变换,最著名的是以Gaussian函数为窗口的Gabor变换,日后被发展为Morlet小波。
因此,小波是一类能进行伸缩和平移操作的紧支局部函数,而小波分析就是以小波函数为变换核的一类积分变换的统称,本质上是对Fourier分析的继承与发展.1910年,Harr通过对双极函数进行伸缩操作,构造了一组最早的小波规范止交基:Harr小波基,提出了小波变换的原始思想。
1936年Littlewood和Paley对Fourier级数建立了二进频率分量组理论(即L-P理论),后来的多分辨分析思想来源于此。
接着科学家们在奇异积分算子、框架分解、小波级数、正交小波系、Besov空间等方面日益完善了小波理论,但都局限于数学理论研究方面。
小波研究与应用的热潮始于20世纪80年代,1983年法国工程师Morlet在分析地震波的局部特性时,为解决Gabor变换在高频条件下不能很好地收集信号能量的问题,引入了小波概念,将Gabor变换中的Gaussian函数进行伸缩和平移,这就是Morlet小波。
理论物理学家Grossmann对该小波的分解可行性作了研究,提出了确定函数的伸缩与平移展开理论,为小波分析理论的形成奠定了基础。
随后,Meyer证明了一维小波函数的存在性,并构造了具有衰减性的光滑函数--Meyer小波,其二进伸缩和平移构成Q(R)的规范正交基。
1987年Mallat将多分辨分析思想引入小波函数构造,完善了正交小波及其正交补一尺度函数理论,并研究了小波变换的离散化形式和滤波器组概念,提出了信号小波分解与重构的Mallat算法。
比利时数学家Daubechies证明了紧支集正交小波基的存在性,并构造了Daubechies类正交小波基。
近年来,为弥补单小波在解决高频段分辨率差、维护难、自由度不够、高维奇异性、缺乏方向性以及混和光滑函数类逼近等问题上的不足,小波理论在实践需要的推动下快速发展,产生了许多新的研究方向,如小波包(wavelets packet)、区间小波(interval Wavelets)、多小波(multiwavelets)、基于提升型(liftingscheme)的第二代小波以及脊波(ridgelet)、曲线波(curvelet)、双曲波(hyperbolic wavelet)等新兴小波理论受到广泛关注,这些将成为未来小波的主要研究方向。
小波理论从诞生的那天起就注定它是一门应用性很强的学科,目前在信号分析、图像压缩机器视觉、模式识别、航空航天、量子力学、目标跟踪、系统辨识、自动控制、函数逼近数值计算甚至金融经济等领域都有小波技术的影子。
数字图像的压缩己成为小波的顶级应用。
一言以蔽之,小波以其时频联合局部性和多分辨分析性能等优势正深刻改变着工程技术领域的一些传统研究和分析方法,图像技术等学科同样也深受其影响。
1. 2图像技术的发展历程及面临的问题图像技术在广义上是各种与图像有关的技术总称,目前人们主要研究的是数字图像,应用的是计算机图像技术。
这包括利用计算机和其他电子设备进行和完成的一系列工作,例如图像的采集、获取、编码存储和传输,图像的合成和产生,图像的显示和输出,图像的变换,增强恢复(复原)和重建,图像的分割,目标的检测,表达和描述,特征的提取和测量序列图象的校正,3-D景物的重建复原,图像数据库的建立、索引和抽取,图像的分类、表示和识别,图像模型的建立和匹配图像和场景的解释和理解,以及基于它们的判断决策和行为规划等等。
另外,图像技术还可以包括为完成上述功能而进行的硬件设计及制作等方面的技术。
视觉是人类最重要的感知手段,图像又是视觉的基础,早期图像处理的目标是改善图像质量,它以人为对象,以改善人的视觉效果为目的.图像处理中输入的是质量低的图像,输出是改善质量后的图像,常用的图像处理方法有图像增强、复原、编码压缩等.首次获得成功的是美国喷气推进实验室,他们对航天探测器徘徊者7号在1964年发回的几十张月球照片进行图像处理,如几何校正,灰度变换,去噪等,并考虑了太阳位置和月球环境的影响,由计算机成功地绘制出月球表面地图,获得巨大成功.随后又对探测飞船发回的几十万张照片进行更为复杂的图像处理,获得了月球的地形图,彩图及全景镶嵌图,为人类登月奠定了基础,也推动了图像处理技术这门学科的发展。
图像处理技术取得另一成果是EMI公司工程师Housefield发明了C T(Computer Tomograph )技术,CT的基本方法是根据人的头部截面的投影,经过计算机重建截面图像,称为图像重建。
1975年,EMI公司又成功地研制出全身CT装置,1979年这项无损诊断技术被授予诺贝尔奖。
从20世纪70年代中期开始,随着计算机技术和人工智能,思维科学研究的迅速发展,图像处理技术向更高,更深层次发展,人们己开始研究如何用计算机系统解释图像,类似于人类视觉理解外部世界,这被称为图像理解或计算机视觉。
自1986,小波理论的迅速发展,它克服了傅立叶分析不能用于局部分析等方面的不足,被认为是调和分析半个世纪以来工作之结晶,Mallat在1988年有效地将小波分析用于图像分解和重构,小波分析被认为是信号与图像分析在数学方法上的重大突破。
1. 3小波的特点及其在图像处理中的应用小波之所以在信号处理领域具有很大的优势,在于小波变换可以获得信号的多分辨率描述,这种描述符合人类观察世界的一般规律,同时,小波变换具有丰富的小波基可以适应具有不同特性的信号。
小波函数及小波变换近乎完美的数学特性使得它日益受到系统科学家和工程人员的青睐,随着小波理论的不断发展和完善,小波在实际工作中的应用越来越广,小波及小波变换的特点有:1.在时域和频域具有联合局部分析功能。
传统的Fourier变换必须对信号进行全时域的分析,无法突出信号在局部时域的特征,而小波函数由于固有的紧支撑性和尺度伸缩变换的自适应窗口,能对信号进行时频联合局部分析,且这种分析具有自适应“变焦”功能:分析高频分量时,尺度减小,时窗变窄,中心频率增加,反之分析低频信号时,尺度增大,时窗变宽,中心频率减小,因而适于信号的局部分析。
2.具有多分辨(多尺度)分析功能。
基于多分辨分析理论的正交尺度函数和正交小波,两者互为正交补,能细致划分频带,能将信号分解成不同频带上的分量,更深入地分析信号的特征,对系统能按不同频带上的要求进行分频设计和建模,更好地反映人类对控制对象的频率设计或辨识要求。
3.是一种良好的非线性系统局部逼近基。
基于框架理论的离散小波函数族在满足一定条件下,可作为ψ(t)函数的逼近基,甚至是正交基。
正交小波基可以无冗余地获得信号的局部信息,也就是说可通过基函数系数重构原信号,数学意义清晰,逼近误差有明确的上界,而非正交小波基对非线性函数的冗余表示,也能完全刻画原函数,并重构之,其优点是数值计算稳定,且有显式的解析表达式,适用于高维非线性函数逼近。
4.具有基于共轭镜像滤波器组的快速算法。
事实上复杂的正交小波(尺度)变换往往通过一组简单的共扼镜像滤波器系数和Mallat金字塔型算法来实现,计算量小,计算复杂度一般为O(n)或O(nlogn)级。
5.小波函数的多样性。
为解决某类问题,人们提出了许多有针对性的小波函数,如Daubechies类小波、墨西哥草帽小波、Gabor小波、Meyer小波、样条小波等等,研究者可根据实际的应用情况选择相应的小波,且对传统小波函数的各种改进也在不同出现。
6.新的小波理论不断涌现。
小波的理论发展是与其应用息息相关的,工程应用反过来促进了小波研究的深化,可以说小波是一支应用性很强的数学分支,许多学科都从小波的不断发展中获益。
小波分析己经形成了一套完善的理论,目前,小波在信号处理和图像处理中的应用得到空前发展,大量的应用成果己经出现。
第二章 Mallat 算法由一维到二维的推广2. 1小波级数在多分辨分析(MRA )中,L 2(R )有空间塔式分解 即:j j j j V W W W R L ----⊕⊕⊕⊕≈...)(212 (1) 对)(2R L f ∈∀,设f 在V j 上的投影系数为C j,k ,在W j 上的投影系数为D j,k(j=J,J-1…-J),则对应于(1)式的空间分解,系数也有相应的塔式分解于是,f 有以下的分解式k j z k j k j k j k k j j J k J k k J k j k k j J Jj k J k k J k J k k J k J k k J k J k k J k J k k J k J k k J k J k k J k J kk J k J k k J d x f d c d c d d c d d c d c ,,,,,,,,,1,2,2,2,2,1,1,2,2,2,2,1,1,1,1,1,1,,......)(ψψϕψϕψψϕψψϕψϕ∑∑∑∑∑∑∑∑∑∑∑∑∑∑∑∈∞-∞=∞→----=--+------+--+----+--=−−→−+=++=====(3)就是f 的小波级数。