二维离散小波分解的C语言实现 论文
- 格式:doc
- 大小:4.56 MB
- 文档页数:23
小波分析实验:实验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语言实现小波变换为主题,详细介绍小波变换的原理和实现步骤,帮助读者更好地理解和应用这一技术。
一、小波变换的原理小波变换是一种多尺度分析方法,它可以将信号从时域转换到频域,并同时提供时间和频率的局部信息。
与傅里叶变换相比,小波变换具有更好的时频局部化特性,能够更好地捕捉信号的瞬时特征。
小波变换的核心思想是利用小波基函数对信号进行分解和重构。
小波基函数是一组具有一定频率和时间局限性的函数,通过对信号进行连续的平移和缩放,可以得到不同尺度的小波函数。
在小波变换中,常用的小波基函数有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小波等,选择合适的小波基函数对于分解结果的质量至关重要。
接下来,在选择好小波基函数之后,需要对原始信号进行两次离散小波变换。
第一次分解得到的结果包含了信号的低频成分和高频成分,再对低频成分进行第二次分解,得到更细节的频率信息。
通过这样的分层分解过程,可以将原始信号分解成不同尺度和频率的小波系数,从而更好地理解信号的时频特性。
两层离散小波分解在信号处理领域有着广泛的应用。
例如,在医学影像处理中,可以利用两层离散小波分解提取出不同频率的图像特征,对医学图像进行分析和诊断。
在通信领域,可以利用这种分解方法对信号进行压缩和去噪处理,提高通信的可靠性和效率。
此外,在金融数据分析、地震信号处理等领域,两层离散小波分解也都有着重要的应用价值。
总之,两层离散小波分解是一种强大的信号处理工具,能够有效地分析和处理非平稳信号,提取出信号的时频特性。
在各个领域都有着广泛的应用前景,对于进一步深化对信号特性的理解和提高信号处理效率具有重要意义。
图形信息科学与技术专业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函数的参数实现对采取不同的边缘延拓的方法得到的峰值信噪比的比较。
#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函数的参数实现对采取不同的边缘延拓的方法得到的峰值信噪比的比较。
小波分析在图像处理中的应用姓名:潘宝宝班级:电控12-3班学号: 471220692摘要介绍了图像小波分析的基本理论和基于小波变换的分解与重构原理,利用小波变换对二维图像进行分解,将原始图像分解成不同方向、不同频率成分的子图像。
同时对含噪声图像进行小波分解。
通过选取适当的阈值,对小波分解系数进行阈值量化,再对高低频系数重构,实现图像的去噪。
最后运用MATLAB仿真平台进行仿真验证,仿真结果表明:利用小波分析对图像进行压缩和去噪可以得到非常好的压缩效果和去噪效果。
对工程应用具有一定的借鉴意义。
关键字:小波;图像压缩;图像去噪。
1.绪论小波分析(Wavelet Analysis)即小波变换是80年代中期发展起来的一门新兴的数学理论和方法,它被认为是傅立叶分析方法的突破性进展,它具有许多优良的特性。
小波变换的基本思想类似于Fourier变换,就是用信号在一族基函数张成的空间上的投影表征该信号。
经典的Fourier变换把信号按三角正、余弦基展开,将任意函数表示为具有不同频率的谐波函数的线性迭加,能较好地刻划信号的频率特性,但它在时空域上无任何分辨,不能作局部分析,这在理论和应用上都带来了许多不便。
小波分析优于傅立叶之处在于,小波分析在时域和频域同时具有良好的局部化性质,因为小波函数是紧支集,而三角正、余弦的区间是无穷区间,所以小波变换可以对高频成分采用逐渐精细的时域或空间域取代步长,从而可以聚焦到对象的任意细节。
因此,小波变换被誉为分析信号的显微镜,傅立叶分析发展史上的一个新的里程碑。
小波分析的应用是与小波分析的理论研究紧密地结合在一起的。
现在,它已经在科技信息领域取得了令人瞩目的成就。
现在,对性质随时间稳定不变的信号,处理的理想工具仍然是傅立叶分析。
但在实际应用中,绝大多数信号是非稳定的,小波分析正是适用于非稳定信号的处理工具。
图像处理是针对性很强的技术,根据不同应用、不同要求需要采用不同的处理方法。
基于matlab 实现的二维小波分解算法-概述说明以及解释1.引言1.1 概述概述部分的内容可以包括一些关于小波分解算法的基本介绍,可以简要介绍小波分解算法的原理和应用领域,同时提及该算法在信号处理、图像压缩以及特征提取等方面的重要性。
以下是一个示例:在当今信息时代,信号处理和图像处理一直是计算机科学和工程学中的研究热点。
为了更好地理解和处理信号和图像中的信息,及时去除噪声、压缩图像以及提取出关键特征,人们不断寻求更有效的处理方法。
而小波分解算法作为一种新兴的信号处理方法,在近年来得到了广泛的应用和研究。
小波分解算法是一种将信号或图像分解为时频域或时空域的工具,它可以分解出不同尺度和频率的子信号或子图像,这为信号处理和图像处理提供了一种有效途径。
与传统的傅里叶变换相比,小波分解算法具有更好的局部性质和多尺度分析能力,因此被广泛运用于信号处理、图像压缩、图像恢复、特征提取等领域。
在信号处理中,小波分解算法可以用于去噪、压缩、去除偶尔的干扰等。
在图像处理方面,小波分解算法具备较好的多分辨率特性,可以在不同分辨率上进行图像处理,对于边缘检测、纹理分析、目标识别等具备独特的优势。
此外,小波分解算法对于非平稳信号和非线性系统等具备突出的应用优势。
本文将介绍基于Matlab 的二维小波分解算法的实现,通过对该算法的深入剖析和实验验证,展示它在图像处理方面的应用前景以及算法效果的评估。
通过本文的研究,读者将了解到小波分解算法的实际应用场景和优势,进一步提高信号处理和图像处理的能力。
在文章的后续部分中,我们将重点介绍小波分解算法的原理,并详细阐述如何在Matlab 环境下实现二维小波分解算法。
1.2 文章结构本文将按照以下结构展开对基于Matlab 实现的二维小波分解算法的介绍和分析:1. 引言:首先对文章的主题和目的进行概述,介绍小波分解算法在图像处理领域的重要性,并总结文章结构。
2. 正文:2.1 小波分解算法概述:详细介绍小波分解算法的基本原理和应用领域,包括信号分析,压缩,去噪等方面。
#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];}}}}。
高等教育自学考试毕业论文(设计)题目:二维离散小波分解的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小波理论与应用技术的发展概况小波分析是当前数学中一个迅速发展的新领域,它同时具有理论深刻和应用十分广泛的双重意义。
小波分析的应用是与小波分析的理论研究紧密地结合在一起的。
现在,它已经在科技信息产业领域取得了令人瞩目的成就。
电子信息技术是六大高新技术中重要的一个领域,它的重要方面是图像和信号处理。
现今,信号处理已经成为当代科学技术工作的重要部分,信号处理的目的就是:准确的分析、诊断、编码压缩和量化、快速传递或存储、精确地重构(或恢复)。
从数学地角度来看,信号与图象处理可以统一看作是信号处理(图像可以看作是二维信号),在小波分析地许多分析的许多应用中,都可以归结为信号处理问题。
基于FPGA的二维离散小波分解的实现
李增栋;耿兆丰
【期刊名称】《微计算机信息》
【年(卷),期】2007(000)03X
【摘要】小波变换是图像处理领域的一种重要的处理方法,但是,小波变换过程中巨大的运算量却使得它在实时图像处理领域中的应用受到了限制。
本文提出了一种基于FPGA实现的高速小波分解的方法,详细分析了各个模块的设计和时序。
经过QuartusⅡ软件的仿真和综合,并在Altera公司的UP3开发板上进行了验证和性能分析。
【总页数】3页(P297-299)
【作者】李增栋;耿兆丰
【作者单位】东华大学信息学院控制理论与控制工程,上海201620
【正文语种】中文
【中图分类】TN406
【相关文献】
1.二维离散小波变换的FPGA实现 [J], 颜学龙;余君
2.一种高效二维小波分解算法的FPGA实现 [J], 张传雨;杨梦达
3.二维离散小波变换的FPGA实现 [J], 毕莉;赵保军
4.基于FPGA的二维离散小波分解的实现 [J], 李增栋;耿兆丰
5.基于FPGA的二维离散小波实现 [J], 吉顺祥;彭汉国;伍治海
因版权原因,仅展示原文概要,查看原文内容请购买。
c语言小波coff分解小波COFF分解是一种信号处理技术,它可以将原始信号分解成不同的频率成分。
在C语言中,我们可以使用小波变换算法来实现COFF 分解。
一、什么是小波COFF分解小波COFF分解是一种时间-频率分析方法,它将信号分解成不同的频率成分。
与傅里叶变换相比,小波变换可以提供更好的时间-频率局部化特性,能够更好地捕捉信号的短时特征。
二、小波变换算法小波变换算法是一种基于滤波器组的信号分解方法。
它通过不同尺度的小波函数与原始信号进行卷积运算,得到不同尺度的频率成分。
常用的小波函数有Haar小波、Daubechies小波、Symlet小波等。
三、COFF分解的步骤1. 导入信号:首先,我们需要导入待分解的信号。
可以通过读取文件或者生成模拟信号的方式获取原始信号。
2. 小波分解:使用小波变换算法对原始信号进行分解。
在分解过程中,我们需要选择合适的小波基函数和分解层数。
分解层数决定了信号被分解成的频率成分的数量。
3. 分解系数提取:在分解过程中,小波变换将原始信号分解成一个低频信号和一系列高频信号。
这些高频信号被称为分解系数,它们代表了信号在不同频率上的能量分布。
4. 重构信号:通过将分解系数与小波基函数进行卷积运算,可以重构出原始信号。
重构过程中,我们可以选择保留多少个高频信号,从而控制重构信号的质量。
四、COFF分解的应用1. 信号处理:COFF分解可以用于信号去噪、信号压缩等应用。
通过去除高频噪声成分,可以提高信号的质量;通过保留低频成分,可以实现信号压缩。
2. 图像处理:COFF分解可以用于图像去噪、图像压缩等应用。
通过分解图像,可以提取出不同尺度的图像细节,从而实现图像的增强和压缩。
3. 数据分析:COFF分解可以用于数据的频域分析。
通过分解数据,可以提取出数据的不同频率成分,从而了解数据的周期性和趋势。
五、小波COFF分解的优缺点小波COFF分解具有以下优点:1. 可以提供更好的时间-频率局部化特性,能够更好地捕捉信号的短时特征。
高等教育自学考试毕业论文(设计)题目:二维离散小波分解的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 的小波级数。