Wavelet Transforms
目标
首先, 既然是变换, 那么就是从一个域到另一个域, 即如下:
c_{j_0} = \langle f(x), \varphi_{j_0, k}(x) \rangle, \\
d_{j} = \langle f(x), \psi_{j, k}(x) \rangle. \\
\]
或者离散的情况:
T_{\varphi}(j_0, k) = \langle f(x), \varphi_{0, 0}(x) \rangle = \langle f(x),\varphi_{j_0, k} (x) \rangle = \frac{1}{\sqrt{N}} \sum_{x=0}^{N-1}f(x) \varphi_{j_0, k}^*(x), \\
T_{\psi}(j, k) = \langle f(x), \psi_{j, k}(x) \rangle = \frac{1}{\sqrt{N}} \sum_{x=0}^{N-1}f(x)\psi_{j, k}^* (x).
\]
通过上述的变换, 将\(f\)变换至系数\(c, d, T\).
上面\(\{\varphi, \psi\}\)共同组成正交基(或者书中定义的biorthogonal), 小波变换主要关注的就是下面几个目标:
- 迭代的构建正交基;
- \(\varphi\)能够提取低频信息, \(\psi\)能够提取高频信息;
- 快速变换, 即高效计算\(c, d, T\).
小波变换
Scaling Functions
小波变换的正交基是通过scaling functions引入的, 即如下的scaled and translated functions:
\]
定义\(V_j\)为固定\(j\)平移\(k\)所张成的空间\(\overline{\mathrm{span}\{\varphi_{j, k}|k \in \mathbb{Z} \}}\), 平方可积的scaling functions 同时需要满足下列的四个条件:
- \(\langle \varphi (x) , \varphi(x - k) \rangle, k \not = 0\);
- \(V_{-\infty} \subset \cdots \subset V_{-1} \subset V_0 \subset V_2 \cdots \subset V_{+\infty}\);
- \(f(x) = 0\)是唯一属于任意空间\(V\)的函数;
- \(V_{+\infty} = L^2(\mathbb{R})\).
上面的4个条件的严格叙述还是看书上比较好, 不确定是否就是这样, 我没有看过原论文, 只是按照自己理解来.
对于平方可积函数, 可知:
\langle \varphi_{j,n} (x) , \varphi_{j, n}(x - k) \rangle, k \not = 0.
\]
并由条件二可知:
\]
将\(x = 2^j x - n\)代入可知,
\]
接着, 根据
\]
可知
h_{\varphi}'(k) = h_{\varphi}(-k).
\]
注: 这里\(\star\)为卷积符号.
这说明, \(\{h_{\varphi}\}\)偶数个是正交向量组. 其重要意义, 请看refer部分.
Wavelet Functions
既然
\]
那么, 我们可以进而定义正交补\(W_j\)满足:
\]
且
\]
进一步, 我们可以知道
\]
且
\langle f, g \rangle = 0, \quad \forall f\in W_i, \forall g \in W_j, i\not=j.
\]
倘若\(W_j\)由下列满足上述4个条件的函数:
\]
生成, 即
\]
同样有:
\psi_{j, n}(x) = \sum_{k \in \mathbb{Z}} h_{\varphi}(k)\psi_{j, 2n+k}(x).
\]
以及
h_{\psi}'(k) = h_{\psi}(-k).
\]
倘若我们通过
\]
可以得出
\]
这说明\(h_{\varphi}(2n)\), 加上\(h_{\psi}(2n)\)能够构成正交基.
二者的联系
实际上, 可以证明(没去找这个证明),
\]
以haar小波为例:
\left \{
\begin{array}{ll}
1 & 0 \le x < 1, \\
0 & \text{otherwise}.
\end{array}
\right .
\]
\]
所以
h_{\varphi}(n) = 0, \quad n \not =0 ,1. \\
h_{\psi}(0) = \frac{1}{\sqrt{2}}, \\
h_{\psi}(1) = -\frac{1}{\sqrt{2}}, \\
h_{\psi}(n) = 0, \quad n \not =0 ,1.
\]
离散的情形
上面的说明实际上都是在围绕平方可积的函数\(\varphi\)说明的, 在离散的情况下需要特殊的处理(此处只能写点自己的理解了, 不是特别明白). 以haar小波为例:
\]
因为\(\varphi\)的支撑是\([0, 1]\). 以\(N=4\)为例:
\begin{array}{cccc}
1 & 1 & 1 & 1 \\
1 & 1 & -1 & -1 \\
\sqrt{2} & -\sqrt{2} & 0 & 0 \\
0 & 0 & \sqrt{2} & -\sqrt{2}
\end{array}
\right ]
\begin{array}{c}
\rightarrow \varphi_{0, 0} \\
\rightarrow \varphi_{0, 1} \\
\rightarrow \varphi_{1, 0} \\
\rightarrow \varphi_{1, 1} \\
\end{array}.
\]
但是需要注意的是, \(h_{\varphi}\)是不变的(既然我们只是等式两边都需要进行相同的变量替换).
只是, 问题是, 如何证明离散后的向量之间依旧能够保持正交关系(应该是需要别的条件吧). 不过幸运的是\(h\)之间的正交关系是保持的.
高效变换
假设我们已经求出\(\{h_{\varphi}, h_{\psi}\}\), 如何快速计算系数:
\]
实际上,
d_j(k) = \sum_{n} h_{\psi}(n - 2k) c_{j+1}(n) = c \star h_{\psi}'(2k), \\
T_{\varphi}(j, k) = \sum_{n} h_{\varphi}(n-2k)T_{\varphi}(j+1, n) = T_{\varphi}(j + 1, \cdot) \star h_{\varphi}' (2k), \\
T_{\psi}(j, k) = \sum_{n} h_{\psi}(n-2k)T_{\varphi}(j+1, n) = T_{\varphi}(j + 1, \cdot) \star h_{\psi}' (2k). \\
\]
从上面的公式可以看出, 我们可以从后向前地逐步计算系数. 又
[f \star g (0), f \star g (1) \cdots f\star g (n) \cdots]_{2\downarrow},
\]
其中\(2\downarrow\)表示下采样, 即
\]
具体的计算流程便如下图所示:

从上图可以看出, 我们首先需要知道\(T_{\varphi}(J, k)\), 但是实际上, 我们不会直接计算此, 而是直接从\(f(x)\)中采样. 具体原因见p515 底部, 但是说实话此解释并不是很理解, 这给我的感觉像是脱离了原来的基\(\varphi, \psi\)了. 而且书中给出的例子中, \(\varphi, \psi\)也似乎只有一个计算\(h\)的功能, 这让我对最初的变换的目标产生困惑, 但是暂时还是先不深入了.
我们可以通过下列的操作, 从叶节点回推之前的结果.

其原理如下:
注意到
a(n) = [h(0), h(n-1), \cdots, h(n-N+1)],
\]
则
\left [
\begin{array}{cccc}
h(0) & h(1) &\cdots & h(N-1) \\
h(-1) & h(0) & \cdots & h(N-2)\\
\vdots & \vdots & \ddots & \vdots \\
h(1-N) & h(2-N) & \cdots & h(0),
\end{array}
\right ]
[h \star f] = A^T f.
\]
定义
\]
则有
\]
特别定义\(A_{\varphi}, A_{\psi}\)来特别指明\(h_{\varphi}, h_{\psi}\)所对于的矩阵, \(A_{\varphi_{2n}} = [a_0, a_2, \cdots, a_{2n} \cdots]\) 表示\(A_{\varphi}\)的偶数行, 则
\]
于是:
\]
类似地, 有
\]
又
+A^T_{\psi{2n}} A_{\psi{2n}}=
[A_{\varphi_{2n}}^T, A_{\psi_{2n}}^T]
\left [
\begin{array}{cc}
A_{\varphi_{2n}}\\
A_{\psi_{2n}}
\end{array}
\right ]
= I,
\]
这就保证了能够恢复\(f\), 这也是为什么需要\(2\downarrow, 2\uparrow\)的原因.
注: 不论\(j\)为多少, $ h \star f = \sum_{k=0}{2J-1}\dots$而不是 \(h \star f = \sum_{k=0}^{2^j-1}\dots\), 个人感觉后者是推不出上面的结果的.
二维的情形
二维考虑可分的情况, 按照下面的基:
\psi^H (x, y) = \psi(x)\varphi(y), \\
\psi^V (x, y) = \varphi(x)\psi(y), \\
\psi^D (x, y) = \psi(x)\psi(y). \\
\]
容易证明上面能够构成一组基.
假设
\]
为了计算对应的系数, 步骤如下:


计算的过程, 实际上就是将逐步采用一维的方式来(既然基是可分的), 第一步, 沿着\(x\)轴, 对每一列采取一维的DWT, 分别得到高频和低频信息, 如上图的阴影部分表示高频部分. 然后再在此基础上, 对于每一行采取一维的DWT, 再区分高频和低频信息. 故\(\phi\)实际上提取的是低频信息, \(\psi^H\)实际上提取的是水平方向的高频信息, \(\psi^V\)提取的是垂直方向上的高频信息, \(\psi^D\)是整体的高频信息(对角).
示例
import numpy as np
import matplotlib.pyplot as plt
import pywt
from PIL import Image
img = np.array(Image.open("Lenna.jpg").convert('L'))
LL, (LH, HL, HH) = pywt.dwt2(img, 'haar')
fig, axes = plt.subplots(2, 2)
axes[0, 0].imshow(LL, cmap=plt.cm.gray)
axes[0, 1].imshow(LH, cmap=plt.cm.gray)
axes[1, 0].imshow(HL, cmap=plt.cm.gray)
axes[1, 1].imshow(HH, cmap=plt.cm.gray)

Wavelet Transforms的更多相关文章
- PP: Multilevel wavelet decomposition network for interpretable time series analysis
Problem: the important frequency information is lack of effective modelling. ?? what is frequency in ...
- 理工科应该的知道的C/C++数学计算库(转)
理工科应该的知道的C/C++数学计算库(转) 作为理工科学生,想必有限元分析.数值计算.三维建模.信号处理.性能分析.仿真分析...这些或多或少与我们常用的软件息息相关,假如有一天你只需要这些大型软件 ...
- {ICIP2014}{收录论文列表}
This article come from HEREARS-L1: Learning Tuesday 10:30–12:30; Oral Session; Room: Leonard de Vinc ...
- Computer Graphics Research Software
Computer Graphics Research Software Helping you avoid re-inventing the wheel since 2009! Last update ...
- 计算机视觉code与软件
Research Code A rational methodology for lossy compression - REWIC is a software-based implementatio ...
- 在WINDOWS中安装使用GSL(MinGW64+Sublime Text3 & Visual Studio)
本文介绍在Windows下安装使用GSL库,涉及GSL两个版本(官方最新版及GSL1.8 VC版).msys shell.GCC.G++等内容,最终实现对GSL安装及示例基于MinGW64在Subli ...
- Windows Python Extension Packages
备注: 1.先要安装wheel库:pip install wheel 2.下载wheel,切换至下载路径,然后安装:pip install wheel库名.whl Windows Python Ext ...
- python 不同版本下载资源
Unofficial Windows Binaries for Python Extension Packages by Christoph Gohlke, Laboratory for Fluore ...
- 常见的C++数学计算库
来源: https://blog.csdn.net/panhao762/article/details/55276811 作为理工科学生,想必有限元分析.数值计算.三维建模.信号处理.性能分析.仿真分 ...
随机推荐
- 日常Java测试第一段 2021/11/12
课堂测试一 package word_show;import java.io.BufferedReader;import java.io.FileNotFoundException;import ja ...
- 转 GSON
转 https://www.jianshu.com/p/75a50aa0cad1 GSON弥补了JSON的许多不足的地方,在实际应用中更加适用于Java开发.在这里,我们主要讲解的是利用GSON来操作 ...
- 最新的Android Sdk 使用Ant多渠道批量打包
实例工程.所需的文件都在最后的附件中. 今天花费了几个小时,参考网上的资料,期间遇到了好几个问题, 终于实现了使用Ant批量多渠道打包,现在,梳理一下思路,总结使用Ant批量多渠道打包的方法:1 ...
- Java——数组的定义与使用
数组的定义与使用 1.数组的基本概念 (1)数组的动态初始化: 数组首先先开辟内存空间,而后再使用索引进行内容的设置,这种定义数组的方式称为动态初始化 数组是引用数据类型,存在有内存分配问题.在使用前 ...
- Spring Cloud声明式调用Feign负载均衡FeignClient详解
为了深入理解Feign,下面将从源码的角度来讲解Feign.首先来看看FeignClient注解@FeignClient的源码,代码如下: FeignClient注解被@Target(ElementT ...
- Git上项目代码拉到本地方法
1.先在本地打开workspace文件夹,或者自定义的文件夹,用来保存项目代码的地方. 2.然后登陆GitHub账号,点击复制项目路径 3.在刚才文件夹下空白处点击鼠标右键,打开Git窗口 4.在以下 ...
- mybatis中返回自动生成的id
当有时我们插入一条数据时,由于id很可能是自动生成的,如果我们想要返回这条刚插入的id怎么办呢. 在mysql数据中我们可以在insert下添加一个selectKey用以指定返回的类型和值: ...
- 通过DT10获取程序执行过程中的实时覆盖率
DT10是新一代的动态测试工具,可以长时间跟踪记录目标程序执行情况,获取目标程序动态执行数据,帮助进行难于重现的Bug错误分析,覆盖率检测,性能测试,变量跟踪等等功能. 系统测试覆盖率,通常是用于判断 ...
- netty系列之:性能为王!创建多路复用http2服务器
目录 简介 多路复用的基础 多路复用在server端的使用 配置TLS处理器 配置clear text upgrade 总结 简介 在之前的文章中,我们提到了在netty的客户端通过使用Http2Fr ...
- 如何为Dash/Zeal生成c++ 文档: 以abseil文档为例
目录 1. 软件安装 2 Sample源文件下载: 3. 生成步骤 3.1 使用doxygen生成html文件 3.2 使用docsetutil 生成 dash/Zeal 格式 1. 软件安装: 1. ...