二级小波变换
二级小波变换
一、二级小波变换的概述
二级小波变换是一种信号处理技术,它是小波变换的一种扩展。
在小波变换中,信号被分解成不同尺度和小角度的频率成分。
而二级小波变换则在原有基础上,进一步将信号分解成更小的时间段,从而实现对信号的更细致分析。
二、二级小波变换的应用领域
二级小波变换在多个领域具有广泛的应用,如图像处理、音频处理、通信系统、模式识别等。
通过二级小波变换,可以实现对信号的更精细分析,提高信号处理的性能。
三、二级小波变换的优势和特点
1.高频分辨率:二级小波变换能够将信号分解成不同频率成分,从而实现对高频信号的分辨率提高。
2.低频分辨率:通过二级小波变换,可以更好地分析信号的低频成分,有助于提取信号的宏观特征。
3.灵活性:二级小波变换可以根据信号的特性和需求,自适应地进行信号分解和分析。
4.噪声抗干扰能力:二级小波变换具有较强的噪声抗干扰能力,能够在噪声环境中实现对信号的有效提取。
四、二级小波变换的实例分析
以图像处理为例,二级小波变换可以将图像分解成不同频率和尺度的小波系数,从而实现对图像的细致分析。
这种分析有助于图像特征的提取、图像质
量的提高以及图像压缩等应用。
五、总结与展望
二级小波变换作为一种有效的信号处理技术,在各个领域都取得了显著的成果。
随着科技的不断进步,二级小波变换在未来将不断完善和发展,为信号处理领域带来更多的创新应用。
harr wavelet 二级小波变换
Harr Wavelet 二级小波变换一、概述二级小波变换是数字信号处理中常用的一种技术,它可以将信号分解为不同频率成分,有利于信号的分析和处理。
Harr Wavelet 是一种常用的小波函数,它具有良好的时域和频域局部性质,适合用于信号分析。
本文将介绍Harr Wavelet 二级小波变换的原理和实现方法,并通过实例说明其在信号处理中的应用。
二、Harr Wavelet 二级小波变换原理1. 小波变换小波变换是一种多尺度分析的方法,它利用小波函数对信号进行分解和重构。
小波变换可以将信号分解成不同频率的成分,并且具有局部性质,能够较好地表达信号的局部特征。
在小波变换中,我们常常使用的小波函数之一就是Harr Wavelet。
2. Harr WaveletHarr Wavelet 是一种正交的小波基函数,它具有紧支撑和对称性。
Harr Wavelet 在时域上是一个有限长度的波形,在频域上又具有较好的频率局部性。
Harr Wavelet 适合用于信号的分析和处理。
3. 二级小波变换二级小波变换是指将信号分解成不同频率成分的过程。
在二级小波变换中,首先对信号进行一级小波变换,然后对得到的低频分量再进行一次小波变换,得到低频和高频两个分量。
这样就可以将信号分解成不同尺度的成分,更好地表达信号的局部特征。
三、Harr Wavelet 二级小波变换实现方法Harr Wavelet 二级小波变换的实现方法可以分为分解和重构两个步骤。
1. 分解(1)对原始信号进行一级小波变换,得到一级分解的低频分量和高频分量。
(2)对一级分解的低频分量再进行一级小波变换,得到二级分解的低频分量和高频分量。
2. 重构(1)对二级分解的低频分量和高频分量进行逆小波变换,得到二级小波变换重构的结果。
(2)对一级分解的高频分量和二级分解的低频分量进行逆小波变换,得到一级小波变换重构的结果。
四、Harr Wavelet 二级小波变换在信号处理中的应用Harr Wavelet 二级小波变换在信号处理中具有广泛的应用,主要包括信号分析、压缩、降噪等方面。
第10章 二维小波变换及其应用(1)
• ↓2为下采样, 故A1与D1的长度为X的一半;↑2为上采样 • 计算
• A1(k) = X(2k-1)*H0(1) + X(2k)*H0(2) + … + X(2*k+L-2)*H0(L) • D1(k) = X(2k-1)*H1(1) + X(2k)*H1(2) + … + X(2*k+L-2)*H1(L)
第十章 二维小波变换及其应用 Chapter 10
2
目录
2D-DWT背景 2D-DWT效果 2D-DWT原理 1D-DWT效果 1D-DWT原理 2D-SWT
2
3
目录
2D-DWT背景 2D-DWT效果 2D-DWT原理 1D-DWT效果 1D-DWT原理 2D-SWT
13
14
目录
2D-DWT背景 2D-DWT效果 2D-DWT原理 1D-DWT效果 1D-DWT原理 2D-SWT
14
15
1D-DWT原理(1)
正变换(分解)
逆变换(重构)
• X为原始信号, A1与D1为低、高频信号, Y为重构信号; 四者为矢量 • H0与H1为分解的低通与高通滤波器,G0与G1为重构滤波器;四
• 逐列变换后,得列变换子图,亦即DWT子图
10
11
目录
2D-DWT背景 2D-DWT效果 2D-DWT原理 1D-DWT效果 1D-DWT原理 2D-SWT
11
12
1D-DWT效果(1)
原始信号为Barbara图像的第一行
• 经过一级1D-DWT变换(正变换),原始信号被分解为两个子信号: 低频A1,以及高频D1. 两个子信号的长度为原始信号的1/2
小波分析实验:二维离散小波变换Mallat快速算法
小波分析实验:实验2 二维离散小波变换(Mallat快速算法)实验目的:在理解离散小波变换原理和Mallat快速算法的基础上,通过编程对图像进行二维离散小波变换,从而加深对二维小波分解和重构的理性和感性认识,并能提高编程能力,为今后的学习和工作奠定基础。
实验工具:计算机,matlab6.5附录:(1)二维小波分解函数%二维小波分解函数function Y=mallatdec2(X,wname,level)%输入:X 载入的二维图像像数值;% level 小波分解次(级)数设定值(如果设定值超过最高可分解次数,按最高分解次数分解)% wname 小波名字wavelet name%输出:Y 多极小波分解后的小波系数矩阵[h,g]=wfilters(wname,'d'); %h,g分别为低通和高通滤波器X=double(X);hh=size(X,2);while t<=level%先进行行小波变换for row=1:hhY(row,1:hh)=mdec1(X(row,1:hh),h,g) ;end%再进行列小波变换for col=1:hhtemp=mdec1( Y(1:hh,col)',h,g);Y(1:hh,col)=temp';endt=t+1;hh=hh/2;X=Y;end%内部子函数,对一行(row)矢量进行一次小波变换,利用fft实现function y=mdec1(x,h,g)%输入:x 行数组% h为低通滤波器% g为高通滤波器%输出: y 进行一级小波分解后的系数lenx=size(x,2);lenh=size(h,2);rh=h(end:-1:1);rrh=[zeros(1,(lenx-lenh)),rh];rrh=circshift(rrh',1)';rg=g(end:-1:1);rrg=[zeros(1,(lenx-lenh)),rg];rrg=circshift(rrg',1)';r1=dyaddown(ifft(fft(x).*fft(rrh,lenx)),1); %use para 1r2=dyaddown(ifft(fft(x).*fft(rrg,lenx)),1);y=[r1,r2];(2)二维小波重构函数%二维小波重构函数function Y=mallatrec2(X,wname,level)%输入:X 载入的小波系数矩阵;% level 小波分解次(级)数设定值(如果设定值超过最高可分解次数,按最高分解次数分解)% wname 小波名字wavelet name%输出:Y 重构图像矩阵[h,g]=wfilters(wname,'d'); %h,g分别为重构低通滤波器和重构高通滤波器hz=size(X,2);h1=hz/(2^(level-1));while h1<=hz% 对列变换for col=1:h1temp=mrec1(X(1:h1,col)',h,g)';X(1:h1,col)=temp;end%再对行变换for row=1:h1temp=mrec1(X(row,1:h1),h,g);X(row,1:h1)=temp;endh1=h1*2;endY=X;%内部子函数,对一行小波系数进行重构function y=mrec1(x,h,g)%输入:x 行数组% h为低通滤波器% g为高通滤波器%输出: y 进行一级小波重构后值lenx=size(x,2);r3=dyadup(x(1,1:lenx*0.5),0); %内插零use para 0r4=dyadup(x(1,(lenx*0.5+1):lenx),0); %use para 0y=ifft(fft(r3,lenx).*fft(h,lenx))+ ifft(fft(r4,lenx).*fft(g,lenx));(3)测试函数(主函数)%测试函数(主函数)clc;clear;X=imread('E:\Libin的文档\Course\Course_wavelet\实验2要求\exp2\LENA.bmp');%路径X=double(X);A = mallatdec2(X,'sym2',3);image(abs(A));colormap(gray(255));title('多尺度分解图像');Y= mallatrec2(A,'sym2',3);Y=real(Y);figure(2);subplot(1,2,1);image(X);colormap(gray(255));title('原始图像');subplot(1,2,2);image(Y);colormap(gray(255));title('重构图像');csize=size(X);sr=csize(1);sc=csize(2);mse=sum(sum( (Y-X).^2,1))/(sr*sc);psnr=10*log(255*255/mse)/log(10)小波分析实验:实验1 连续小波变换实验目的:在理解连续小波变换原理的基础上,通过编程实现对一维信号进行连续小波变换,(实验中采用的是墨西哥帽小波),从而对连续小波变换增加了理性和感性的认识,并能提高编程能力,为今后的学习和工作奠定基础。
二级小波变换
二级小波变换摘要:I.二级小波变换简介A.小波变换的基本概念B.二级小波变换的定义和特点II.二级小波变换的原理A.小波基的选择B.小波分解与重构C.二级小波变换的数学模型III.二级小波变换的应用A.信号处理1.滤波2.去噪3.特征提取B.图像处理1.图像压缩2.图像去噪3.目标检测和识别IV.二级小波变换的优缺点A.优点1.良好的时频分析能力2.适应性较强3.计算复杂度较低B.缺点1.小波基的选择较为困难2.可能会出现频谱泄漏问题正文:二级小波变换是一种在时频域上进行信号分析的方法,它通过在小波分解的基础上进行第二次分解,得到信号的低频分量和高频分量。
二级小波变换具有较好的去噪性能、滤波性能以及特征提取性能,因此被广泛应用于信号处理和图像处理领域。
首先,我们来了解一下二级小波变换的基本概念。
小波变换是一种基于小波基函数的信号分析方法,它可以将信号分解为不同频率和时间尺度的分量。
二级小波变换是在小波分解的基础上进行的第二次分解,它可以进一步提取信号的低频和高频信息。
接下来,我们来了解一下二级小波变换的原理。
首先,需要选择合适的小波基函数,这决定了小波分解的结果。
然后,通过小波分解将信号分解为不同频率和时间尺度的分量,再通过重构得到原始信号。
二级小波变换的数学模型可以表示为:Y(t) = ∑[a(ω, τ) * ψ(ω, τ)] + ∑[b(ω, τ) * ψ(ω, τ)]其中,Y(t) 是原始信号,a(ω, τ) 和b(ω, τ) 分别表示低频和高频分量,ψ(ω, τ) 是小波基函数。
二级小波变换在信号处理和图像处理领域有广泛的应用。
在信号处理领域,它可以用于滤波、去噪和特征提取等任务。
在图像处理领域,它可以用于图像压缩、图像去噪和目标检测与识别等任务。
二级小波变换具有以下优点:首先,它具有良好的时频分析能力,能够同时提取信号的频率和时间信息;其次,它具有很强的适应性,可以适应不同类型信号的处理需求;最后,它的计算复杂度较低,相对于其他信号分析方法,计算量较小。
小波变换轻松入门(我的理解说明)
⼩波变换轻松⼊门(我的理解说明)⼩波变换轻松⼊门(我的理解说明)第⼀节⼀个很简单的例⼦还谈不上正式⼊门但他具备了部分的思想。
[x0,x1,x2,x3]=[90,70,100,70]为达到压缩我们可取 (x0+x1)/2 (x0-x1)/2 来代表 x0,x1 这样[90,70] 可表⽰为 [80,10] 80即平均数 10是⼩范围波动数(可想象出⼀种波的形状) [90,70] --〉[80,10] , [100,70] --〉 [85,15] 可以想象80 和85 都是局部的平均值 反映⼤的总体的状态,低频部分的值;⽽10、15是⼩范围波动的值局部变换是变化相对缓慢的值,可以认为他们是低频部分⾼频部分的值。
较快 可以认为他们是⾼频部分1. FIRST: 把[90,70,100,70] 写成 [80,85,10,15] 即把低频部分写在⼀起(记频率L)⾼频部分写在⼀起(H)2. (90+70)/2,(100+70)/2,(90-70)/2,(100-70)/23. L=[80,85],H=[10,15]4. SECOND: ⽽[80,85] ⼜可经同样的变换--> [82.5, -2.5] 这样 82.5表⽰更低频的信息(记频率LL) -1.5则表⽰了频率L上的波动5. 最后90,70,100,70] --〉[82.5, -2.5, 10, 15] (LL,LH,H,H) 这样信息就可被压缩了(数字范围⼩了)这就是⼆级变换 同样的你可以进⾏更⾼级的变换。
呵呵,很简单吧?现在再来扩展⼀下 [90,70]---> [80,10] 写成矩阵[90,70] * [1/2, 1/2] [1/2 ,-1/2] Haar转换矩阵[1,1]H= [1,-1] /2第⼀步就可写成矩阵M1 [1/2, 0, 1/2, 0] [1/2, 0, -1/2, 0] [0, 1/2,如果是[90,70,100,70] 第⼀步就可写成矩阵 0, 1/2] [0 , 1/2, 0, -1/2]M1=[0.5000 0 0.5000 00.5000 0 -0.5000 00 0.5000 0 0.50000 0.5000 0 -0.5000]第⼆步只对低频 L操作⾼频不变故可写成M2 1/2, 1/2, 0, 0 1/2, -1/2, 0, 0 0, 0, 1, 0 0, 0, 0, 1M2=[0.5000 0.5000 0 00.5000 -0.5000 0 00 0 1.0000 00 0 0 1.0000]令M=M1*M2 则可对4*4 的点阵操作0.2500 0.2500 0.5000 00.2500 0.2500 -0.5000 00.2500 -0.2500 0 0.50000.2500 -0.2500 0 -0.5000]。
第六章__二维小波变换与图像处理
Pj 1 f ( x1 , x2 ) Pj f ( x1 , x2 ) D j f ( x1 , x2 )
( xk1jk)2 jk1 ( x1 ) jk 2 ( x2 ) k(1jk)2 jk1 ( x1 ) jk 2 ( x2 ) k1k 2 k1k 2
假设二维空间 V j ( x1 , x2 )是可分离的,即它可 以分解成两个一维空间 V j ( x1 )和V j ( x2 ) 的张量 乘积,可得 V j 1 ( x1 , x2 ) V j 1 ( x1 ) V j 1 ( x2 )
[V j ( x1 ) W j ( x1 )] [V j ( x2 ) W j ( x2 )] [V j ( x1 ) V j ( x2 )] [V j ( x1 ) W j ( x2 )] [W j ( x1 ) V j ( x2 )] [W j ( x1 ) W j ( x2 )]
( 2)
D1(3) f ( x1 , x2 ) f ( x1 , x2 ), 1k1 ( x1 ) 1k2 ( x2 )
可分离分解滤波器组结构
当做j级分析时有
A j f ( x1 , x2 ) f ( x1 , x2 ), jk1 ( x1 ) jk 2 ( x2 ) D f ( x1 , x2 ) f ( x1 , x2 ), jk1 ( x1 ) jk 2 ( x2 )
二维连续小波定义
则二维连续小波变换为:
WT f (a; b1 , b2 ) f ( x1 , x2 ), a ;b1 ,b2 ( x1 , x2 ) 1 x1 b1 x2 b2 f ( x1 , x2 ) ( , )dx1dx2 a a a
实验七 小波变换
实验七小波变换一、实验目的1、了解小波变换及其变换系数的分布。
2、了解小波变换在图像去噪处理中的应用。
二、小波变换及去噪应用1、小波分解及系数分布信号分析是为了获得时间和频率之间的相互关系。
傅立叶变换提供了有关频率域的信息,但有关时间的局部化信息却基本丢失。
与傅立叶变换不同,小波变换是通过缩放母小波(Mother wavelet)的宽度来获得信号的频率特征,通过平移母小波来获得信号的时间信息。
对母小波的缩放和平移操作是为了计算小波系数,这些小波系数反映了小波和局部信号之间的相关程度。
常用的母小波有:Haar小波、dbN小波系、symN小波系等。
小波系数分布规律:●随着分层数的增加,小波系数的范围越来越大,说明越往后层次的小波系数越重要。
●除LL外,其他子带方差和能量明显减少,充分说明低频系数在图像编码中的重要性。
●对同一方向子带,按从高层到低层(从低频到高频)子带,有:HL3→HL2→HL1,LH3→LH2→LH1,HH3→HH2→HH1,大部分情况下其方差从大到小,有一定的变换规则。
2、小波在图像去噪中的应用工程应用中,有用信号通常表现为低频信号或是一些比较平稳的信号,而噪声信号通常表现为高频信号。
所以基于小波变换的去噪过程可以分为以下几步进行:(1) 小波分解。
选择一个小波并确定一个小波分解的层数N,然后对图像进行N 层小波分解。
(2) 小波分解高频系数的阈值量化。
对第1 层到第N 层的每一层高频系数,选择一个阈值进行阈值量化处理。
(3) 小波的重构。
根据小波分解的第N 层的低频系数和经过量化处理后的第1 层到第N 层的高频系数,进行的小波重构。
处理的方法一般有三种:(1) 强制去噪处理。
该方法把小波分解结构中的高频系数全部变为0,即把高频部分全部去除掉,然后再对信号进行重构处理。
这种方法比较简单,重构后的消噪信号也比较平滑,但容易丢失信号的有用成分。
(2) 默认阈值去噪处理。
该方法利用ddencmp 函数产生信号的默认阈值,然后利用wdencmp 函数进行消噪处理。
小波变换简介PPT课件
47
X = waverec2(C,S,'wname')
reconstructs the matrix X based on the multi-level wavelet decomposition structure [C,S]
10
幅度
频率
时间窗
时间
时域加窗分析
时间
时频平面划分示意图
11
窗口傅立叶变换
12
窗口傅立叶变换
另一个缺点是:无论怎样离散化,都不能 使Gabor变换成为一组正交基;
而傅立叶变换经离散化后可得到按正交函 数展开的傅立叶级数。
13
1909: Alfred Haar
Alfred Haar对在函数空间中寻找一个与傅立叶类似 的基非常感兴趣。1909年他发现并使用了小波, 后来被命名为哈尔小波(Haar wavelets)
C 0
Wf
(a,b)a,b(t)dbda2a
a,b(t)
1 (t b)
aa
28
小波系数的意义
Wf (a,b)表示信号与尺度为a小波的相关程 度。小波系数越大,二者越相似。
F() f(t)ejtdt
W f(a,b)f(t) a,b(t)dt
29
连续小波变换的简单步骤
选择尺度为a确定的小波,与信号开始的 一段比较;
A = appcoef2(C,S,'wname',N)
基于小波变换与Gold码扩频的指纹嵌入算法
高校 理科研 究
基 于小 波变换与 God码扩频 的指 纹嵌兀算法 l
常州工学院计算机信息工程学院 陆宇光
[ 摘 要] 本文提 出了一种基于二维小波 变换和 G l码 扩频的指纹嵌 入算法。 o d 该算 法首先对 图象进行二级小波分解 , 经 G l 码 并把 o d 扩频的指纹嵌入 到小波分解 系数 中, 既确保 了数 字指纹的不可见性 , 又保 证 了数字指纹 的鲁棒性 , 同时在 受到合谋攻击时也可以有
效的跟踪到合谋用户。
[ 关键 词 ] 数字指纹 小波变换 God l码 合谋 攻击
1概 述 .
数字指纹技术是近几年发展起来 的新型数字版权保 护技术 ,它 的 原理是销售商在其出售的数字作 品拷 贝中嵌入与购买者 身份 相关的唯 性信息 , 当发现非法拷 贝后 , 销售 商凭 借嵌人信息可 以识别 出非法拷 贝的原始购买者 ,进而通过法律诉讼 和惩罚来达到保护 版权 所有者权 益、 对非法行为进行威慑的 目的。从嵌 人性质上讲 , 它是 数字水印的一 种特殊形式。但在数字指纹系统 中, 由于分发给用户 的指纹 各不相同 , 某一位信息的提取错误就可能导致对用 户的误判 。因此 在嵌 入和提取 的要求上更 为严格 。本文在 阐述小 波变换及 G l od码理论 的基础 上 , 提 出一种基于小波变换和 G l 扩频的指纹嵌入算法。在数字指纹的嵌 od码 入过程 中首先对图象进行二级小波 分解 ,然后将二进系数 中, 这样 既确保 了数字指 纹的不 可见性 , 又保证 了数字指纹的鲁棒性 。实验结果表 明, 算法 既能抵御 该 水印攻击( 如加噪 , 压缩和剪切等 ) 也能抵御数字 指纹所 特有的攻击一 ,
码。
合谋攻击。
2小 波 变 换 理 论 基 础 .
哈尔小波变换的原理及其实现(Haar)
哈尔小波变换的原理及其实现(Haar)另外参见俄罗斯写的/Articles/22243/Real-Time-Object-Tracker-in-CHaar小波在图像处理和数字水印等方面应用较多,这里简单的介绍一下哈尔小波的基本原理以及其实现情况。
一、Haar小波的基本原理数学理论方面的东西我也不是很熟悉,这边主要用简单的例子来介绍下Haar小波的使用情况。
例如:有a=[8,7,6,9]四个数,并使用b[4]数组来保存结果.则一级Haar小波变换的结果为:b[0]=(a[0]+a[1])/2, b[2]=(a[0]-a[1])/2b[1]=(a[2]+a[3])/2, b[3]=(a[2]-a[3])/2即依次从数组中取两个数字,计算它们的和以及差,并将和一半和差的一半依次保存在数组的前半部分和后半部分。
例如:有a[8],要进行一维Haar小波变换,结果保存在b[8]中则一级Haar小波变换的结果为:b[0]=(a[0]+a[1])/2, b[4]=(a[0]-a[1])/2b[1]=(a[2]+a[3])/2, b[5]=(a[2]-a[3])/2b[2]=(a[4]+a[5])/2, b[6]=(a[4-a[5]])/2b[3]=(a[6]+a[7])/2, b[7]=(a[6]-a[7])/2如果需要进行二级Haar小波变换的时候,只需要对b[0]-b[3]进行Haar小波变换.对于二维的矩阵来讲,每一级Haar小波变换需要先后进行水平方向和竖直方向上的两次一维小波变换,行和列的先后次序对结果不影响。
二、Haar小波的实现使用opencv来读取图片及像素,对图像的第一个8*8的矩阵做了一级小波变换#include <cv.h>#include <highgui.h>#include <iostream>using namespace std;int main(){IplImage* srcImg;double imgData[8][8];int i,j;srcImg=cvLoadImage("lena.bmp",0);cout<<"原8*8数据"<<endl;for( i=0;i<8;i++){for( j=0;j<8;j++){imgData[i][j]=cvGetReal2D(srcImg,i+256,j+16); cout<<imgData[i][j]<<" ";}cout<<endl;}double tempData[8];//行小波分解for( i=0;i<8;i++){for( j=0;j<4;j++){double temp1=imgData[i][2*j];double temp2=imgData[i][2*j+1]; tempData[j]=(temp1+temp2)/2;tempData[j+4]=(temp1-temp2)/2;}for( j=0;j<8;j++)imgData[i][j]=tempData[j];}//列小波分解for( i=0;i<8;i++){for( j=0;j<4;j++){double temp1=imgData[2*j][i]; double temp2=imgData[2*j+1][i]; tempData[j]=(temp1+temp2)/2; tempData[j+4]=(temp1-temp2)/2; }for( j=0;j<8;j++)imgData[j][i]=tempData[j];}cout<<"1级小波分解数据"<<endl; for( i=0;i<8;i++){for( j=0;j<8;j++){cout<<imgData[i][j]<<" ";}cout<<endl;}//列小波逆分解for( i=0;i<8;i++){for( j=0;j<4;j++){double temp1=imgData[j][i]; double temp2=imgData[j+4][i]; tempData[2*j]=temp1+temp2; tempData[2*j+1]=temp1-temp2; }for( j=0;j<8;j++){imgData[j][i]=tempData[j];}}//行小波逆分解for( i=0;i<8;i++){for( j=0;j<4;j++){double temp1=imgData[i][j]; double temp2=imgData[i][j+4]; tempData[2*j]=temp1+temp2; tempData[2*j+1]=temp1-temp2; }for( j=0;j<2*4;j++){imgData[i][j]=tempData[j];}}cout<<"1级小波逆分解数据"<<endl; for( i=0;i<8;i++){for( j=0;j<8;j++){cout<<imgData[i][j]<<" ";}cout<<endl;}return 0;}====================================== ===================================== /// 小波变换Mat WDT( const Mat &_src, const string _wname, const int _level )const{int reValue = THID_ERR_NONE;Mat src = Mat_<float>(_src);Mat dst = Mat::zeros( src.rows, src.cols, src.type() );int N = src.rows;int D = src.cols;/// 高通低通滤波器Mat lowFilter;Mat highFilter;wavelet( _wname, lowFilter, highFilter );/// 小波变换int t=1;int row = N;int col = D;while( t<=_level ){///先进行行小波变换for( int i=0; i<row; i++ ){/// 取出src中要处理的数据的一行Mat oneRow = Mat::zeros( 1,col, src.type() );for ( int j=0; j<col; j++ ){oneRow.at<float>(0,j) = src.at<float>(i,j);}oneRow = waveletDecompose( oneRow, lowFilter, highFilter ); /// 将src这一行置为oneRow中的数据for ( int j=0; j<col; j++ ){dst.at<float>(i,j) = oneRow.at<float>(0,j);}}#if 0//normalize( dst, dst, 0, 255, NORM_MINMAX );IplImage dstImg1 = IplImage(dst);cvSaveImage( "dst.jpg", &dstImg1 );#endif/// 小波列变换for ( int j=0; j<col; j++ ){/// 取出src数据的一行输入Mat oneCol = Mat::zeros( row, 1, src.type() );for ( int i=0; i<row; i++ ){oneCol.at<float>(i,0) = dst.at<float>(i,j);}oneCol = ( waveletDecompose( oneCol.t(), lowFilter, highFilter ) ).t();for ( int i=0; i<row; i++ ){dst.at<float>(i,j) = oneCol.at<float>(i,0);}}#if 0//normalize( dst, dst, 0, 255, NORM_MINMAX );IplImage dstImg2 = IplImage(dst);cvSaveImage( "dst.jpg", &dstImg2 );#endif/// 更新row /= 2;col /=2;t++;src = dst;}return dst;}/// 小波逆变换Mat IWDT( const Mat &_src, const string _wname, const int _level )const{int reValue = THID_ERR_NONE;Mat src = Mat_<float>(_src);Mat dst = Mat::zeros( src.rows, src.cols, src.type() );int N = src.rows;int D = src.cols;/// 高通低通滤波器Mat lowFilter;Mat highFilter;wavelet( _wname, lowFilter, highFilter );/// 小波变换int t=1;int row = N/std::pow( 2., _level-1);int col = D/std::pow(2., _level-1);while ( row<=N && col<=D ){/// 小波列逆变换for ( int j=0; j<col; j++ ){/// 取出src数据的一行输入Mat oneCol = Mat::zeros( row, 1, src.type() );for ( int i=0; i<row; i++ ){oneCol.at<float>(i,0) = src.at<float>(i,j);}oneCol = ( waveletReconstruct( oneCol.t(), lowFilter, highFilter ) ).t();for ( int i=0; i<row; i++ ){dst.at<float>(i,j) = oneCol.at<float>(i,0);}}#if 0//normalize( dst, dst, 0, 255, NORM_MINMAX );IplImage dstImg2 = IplImage(dst);cvSaveImage( "dst.jpg", &dstImg2 );#endif///行小波逆变换for( int i=0; i<row; i++ ){/// 取出src中要处理的数据的一行Mat oneRow = Mat::zeros( 1,col, src.type() );for ( int j=0; j<col; j++ ){oneRow.at<float>(0,j) = dst.at<float>(i,j);}oneRow = waveletReconstruct( oneRow, lowFilter, highFilter );/// 将src这一行置为oneRow中的数据for ( int j=0; j<col; j++ ){dst.at<float>(i,j) = oneRow.at<float>(0,j);}}#if 0//normalize( dst, dst, 0, 255, NORM_MINMAX );IplImage dstImg1 = IplImage(dst);cvSaveImage( "dst.jpg", &dstImg1 );#endifrow *= 2;col *= 2;src = dst;}return dst;}/////////////////////////////////////////////////////////////////// //////////////////////////// 调用函数/// 生成不同类型的小波,现在只有haar,sym2void wavelet( const string_wname, Mat &_lowFilter, Mat &_highFilter )const{if ( _wname=="haar" || _wname=="db1" ){int N = 2;_lowFilter = Mat::zeros( 1, N, CV_32F );_highFilter = Mat::zeros( 1, N, CV_32F );_lowFilter.at<float>(0, 0) = 1/sqrtf(N);_lowFilter.at<float>(0, 1) = 1/sqrtf(N);_highFilter.at<float>(0, 0) = -1/sqrtf(N);_highFilter.at<float>(0, 1) = 1/sqrtf(N);}if ( _wname =="sym2" ){int N = 4;float h[] = {-0.483, 0.836, -0.224, -0.129 };float l[] = {-0.129, 0.224, 0.837, 0.483 };_lowFilter = Mat::zeros( 1, N, CV_32F );_highFilter = Mat::zeros( 1, N, CV_32F );for ( int i=0; i<N; i++ ){_lowFilter.at<float>(0, i) = l[i];_highFilter.at<float>(0, i) = h[i];}}}/// 小波分解Mat waveletDecompose( const Mat &_src, const Mat &_lowFilter, const Mat &_highFilter )const{assert( _src.rows==1 && _lowFilter.rows==1 && _highFilter.rows==1 );assert( _src.cols>=_lowFilter.cols && _src.cols>=_highFilter.cols );Mat &src = Mat_<float>(_src);int D = src.cols;Mat &lowFilter = Mat_<float>(_lowFilter);Mat &highFilter = Mat_<float>(_highFilter);/// 频域滤波,或时域卷积;ifft( fft(x) * fft(filter)) = cov(x,filter) Mat dst1 = Mat::zeros( 1, D, src.type() );Mat dst2 = Mat::zeros( 1, D, src.type() );filter2D( src, dst1, -1, lowFilter );filter2D( src, dst2, -1, highFilter );/// 下采样Mat downDst1 = Mat::zeros( 1, D/2, src.type() );Mat downDst2 = Mat::zeros( 1, D/2, src.type() );resize( dst1, downDst1, downDst1.size() );resize( dst2, downDst2, downDst2.size() );/// 数据拼接for ( int i=0; i<D/2; i++ ){src.at<float>(0, i) = downDst1.at<float>( 0, i );src.at<float>(0, i+D/2) = downDst2.at<float>( 0, i );}return src;}/// 小波重建Mat waveletReconstruct( const Mat &_src, const Mat &_lowFilter, const Mat &_highFilter )const{assert( _src.rows==1 && _lowFilter.rows==1 && _highFilter.rows==1 );assert( _src.cols>=_lowFilter.cols && _src.cols>=_highFilter.cols );Mat &src = Mat_<float>(_src);int D = src.cols;Mat &lowFilter = Mat_<float>(_lowFilter);Mat &highFilter = Mat_<float>(_highFilter);/// 插值;Mat Up1 = Mat::zeros( 1, D, src.type() );Mat Up2 = Mat::zeros( 1, D, src.type() );/// 插值为0//for ( int i=0, cnt=1; i<D/2; i++,cnt+=2 )//{// Up1.at<float>( 0, cnt ) = src.at<float>( 0, i ); ///< 前一半// Up2.at<float>( 0, cnt ) = src.at<float>( 0, i+D/2 ); ///< 后一半//}/// 线性插值Mat roi1( src, Rect(0, 0, D/2, 1) );Mat roi2( src, Rect(D/2, 0, D/2, 1) );resize( roi1, Up1, Up1.size(), 0, 0, INTER_CUBIC );resize( roi2, Up2, Up2.size(), 0, 0, INTER_CUBIC );/// 前一半低通,后一半高通Mat dst1 = Mat::zeros( 1, D, src.type() );Mat dst2= Mat::zeros( 1, D, src.type() );filter2D( Up1, dst1, -1, lowFilter );filter2D( Up2, dst2, -1, highFilter );/// 结果相加dst1 = dst1 + dst2;return dst1;}====================================== =====================================*************************************************************** **************************************************其他代码实现*************************************************************** **************************************************// 哈尔小波.cpp : 定义控制台应用程序的入口点。
