目标

首先, 既然是变换, 那么就是从一个域到另一个域, 即如下:

\[f(x) = \sum_k c_{j_0} (k) \varphi_{j_0, k} (x) + \sum_{j=j_0}^{\infty} \sum_k d_j (k) \psi_{j, k}(x), \\
c_{j_0} = \langle f(x), \varphi_{j_0, k}(x) \rangle, \\
d_{j} = \langle f(x), \psi_{j, k}(x) \rangle. \\
\]

或者离散的情况:

\[f(x) = \frac{1}{\sqrt{N}}[\sum_{k} T_{\varphi}(j_0, k) \varphi_{0, 0}(x) + \sum_{j=j_0}^{J-1}\sum_{k=0}^{2^j -1} T_{\psi}(j, k)\psi_{j, k}(x)], \\
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), 小波变换主要关注的就是下面几个目标:

  1. 迭代的构建正交基;
  2. \(\varphi\)能够提取低频信息, \(\psi\)能够提取高频信息;
  3. 快速变换, 即高效计算\(c, d, T\).

小波变换

Scaling Functions

小波变换的正交基是通过scaling functions引入的, 即如下的scaled and translated functions:

\[\varphi_{j, k}(x) = 2^{j/2}\varphi (2^j x - k), \\
\]

定义\(V_j\)为固定\(j\)平移\(k\)所张成的空间\(\overline{\mathrm{span}\{\varphi_{j, k}|k \in \mathbb{Z} \}}\), 平方可积的scaling functions 同时需要满足下列的四个条件:

  1. \(\langle \varphi (x) , \varphi(x - k) \rangle, k \not = 0\);
  2. \(V_{-\infty} \subset \cdots \subset V_{-1} \subset V_0 \subset V_2 \cdots \subset V_{+\infty}\);
  3. \(f(x) = 0\)是唯一属于任意空间\(V\)的函数;
  4. \(V_{+\infty} = L^2(\mathbb{R})\).

上面的4个条件的严格叙述还是看书上比较好, 不确定是否就是这样, 我没有看过原论文, 只是按照自己理解来.

对于平方可积函数, 可知:

\[\langle \varphi (x) , \varphi(x - k) \rangle, \Rightarrow
\langle \varphi_{j,n} (x) , \varphi_{j, n}(x - k) \rangle, k \not = 0.
\]

并由条件二可知:

\[\varphi (x) = \sum_{k \in \mathbb{Z}} h_{\varphi}(k) \sqrt{2} \varphi (2x - k),
\]

将\(x = 2^j x - n\)代入可知,

\[\varphi_{j, n}(x) = \sum_{k \in \mathbb{Z}} h_{\varphi}(k)\varphi_{j, 2n+k}(x).
\]

接着, 根据

\[\langle \varphi_{j, n}(x), \varphi_{j, n}(x-n')\rangle = 0, n' \not = 0,
\]

可知

\[\sum_{k \in \mathbb{Z}} h_{\varphi}(k)h_{\varphi}(k-2n') = h_{\varphi} \star h_{\varphi}' (2n') = 0, n' \not = 0\\
h_{\varphi}'(k) = h_{\varphi}(-k).
\]

注: 这里\(\star\)为卷积符号.

这说明, \(\{h_{\varphi}\}\)偶数个是正交向量组. 其重要意义, 请看refer部分.

Wavelet Functions

既然

\[V_{j} \subset V_{j+1},
\]

那么, 我们可以进而定义正交补\(W_j\)满足:

\[V_{j+1} = V_j \oplus W_j,
\]

\[\langle f, g \rangle = 0, \quad \forall f \in V_j, g \in W_j,
\]

进一步, 我们可以知道

\[V_{j} = V_{j_0} \oplus W_{j_0} \oplus W_{j_0 + 1} \oplus \cdots \oplus W_{j-1},
\]

\[\langle f, g \rangle = 0, \quad \forall f\in V_i, \forall g \in W_j, i \le 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, k}(x) = 2^{j/2} \psi (2^j x - k),
\]

生成, 即

\[W_j := \overline{\mathrm{span}\{\psi_{j, k}| k \in \mathbb{Z}\}}.
\]

同样有:

\[\psi (x) = \sum_{k \in \mathbb{Z}} h_{\psi}(k) \sqrt{2} \varphi (2x - k), \\
\psi_{j, n}(x) = \sum_{k \in \mathbb{Z}} h_{\varphi}(k)\psi_{j, 2n+k}(x).
\]

以及

\[\sum_{k \in \mathbb{Z}} h_{\psi}(k)h_{\psi}(k-2n') = h_{\psi} \star h_{\psi}' (2n') = 0, n' \not = 0\\
h_{\psi}'(k) = h_{\psi}(-k).
\]

倘若我们通过

\[\langle \psi_{j, n}(x), \varphi_{j, n}(x - k) \rangle = 0,
\]

可以得出

\[\sum_{k \in \mathbb{Z}} h_{\psi}(k)h_{\varphi}(k-2n') = h_{\psi} \star h_{\varphi}' (2n') = 0, n' \not = 0.\\
\]

这说明\(h_{\varphi}(2n)\), 加上\(h_{\psi}(2n)\)能够构成正交基.

二者的联系

实际上, 可以证明(没去找这个证明),

\[h_{\psi}(k) = (-1)^k h_{\varphi}(1-k).
\]

以haar小波为例:

\[\varphi(x) =
\left \{
\begin{array}{ll}
1 & 0 \le x < 1, \\
0 & \text{otherwise}.
\end{array}
\right .
\]
\[\varphi_{0, k}(x) = \frac{1}{\sqrt{2}}\varphi_{1, 2k}(x) + \frac{1}{\sqrt{2}}\varphi_{1, 2k+1}(x),
\]

所以

\[h_{\varphi}(0) = h_{\varphi}(1) = \frac{1}{\sqrt{2}}, \\
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小波为例:

\[\tilde{\varphi}_{j, k}(x) = \varphi_{j, k}(\frac{x}{N}), \quad x = 0, 1, \cdots, N-1.
\]

因为\(\varphi\)的支撑是\([0, 1]\). 以\(N=4\)为例:

\[\left [
\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}\}\), 如何快速计算系数:

\[c, d, T.
\]

实际上,

\[c_j(k) = \sum_{n} h_{\varphi}(n - 2k) c_{j+1}(n) = c \star h_{\varphi}' (2k), \\
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 (2) \cdots f\star g (2n) \cdots] =
[f \star g (0), f \star g (1) \cdots f\star g (n) \cdots]_{2\downarrow},
\]

其中\(2\downarrow\)表示下采样, 即

\[y_{2\downarrow}(n) = y(2n).
\]

具体的计算流程便如下图所示:

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

我们可以通过下列的操作, 从叶节点回推之前的结果.

其原理如下:

注意到

\[h \star f (n) = \sum_{k=0}^{N-1} h(n-k) f(k) = a^T_n f, \\
a(n) = [h(0), h(n-1), \cdots, h(n-N+1)],
\]

\[A = [a_0, a_1, \cdots, a_{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.
\]

定义

\[h'(n) = h(-n),
\]

则有

\[[h' \star f] = Af.
\]

特别定义\(A_{\varphi}, A_{\psi}\)来特别指明\(h_{\varphi}, h_{\psi}\)所对于的矩阵, \(A_{\varphi_{2n}} = [a_0, a_2, \cdots, a_{2n} \cdots]\) 表示\(A_{\varphi}\)的偶数行, 则

\[[h_{\varphi}' \star f]_{2\downarrow} = {A_{\varphi_{2n}}} f,
\]

于是:

\[[h_{\varphi} \star [h_{\varphi}' \star f]_{2\downarrow 2 \uparrow}] = A_{\varphi_{2n}}^T{A_{\varphi_{2n}}} f,
\]

类似地, 有

\[[h_{\psi} \star [h_{\psi}' \star f]_{2\downarrow 2 \uparrow}] = A_{\psi_{2n}}^T{A_{\psi_{2n}}} f,
\]

\[A^T_{\varphi_{2n}} A_{\varphi_{2n}}
+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\), 个人感觉后者是推不出上面的结果的.

二维的情形

二维考虑可分的情况, 按照下面的基:

\[\phi (x, y) = \varphi(x)\varphi(y), \\
\psi^H (x, y) = \psi(x)\varphi(y), \\
\psi^V (x, y) = \varphi(x)\psi(y), \\
\psi^D (x, y) = \psi(x)\psi(y). \\
\]

容易证明上面能够构成一组基.

假设

\[f(x, y), \quad x = 0, 1, \cdots, 2^{J_1-1}, y = 0 ,1 ,\cdots, 2^{J_2-1}.
\]

为了计算对应的系数, 步骤如下:

计算的过程, 实际上就是将逐步采用一维的方式来(既然基是可分的), 第一步, 沿着\(x\)轴, 对每一列采取一维的DWT, 分别得到高频和低频信息, 如上图的阴影部分表示高频部分. 然后再在此基础上, 对于每一行采取一维的DWT, 再区分高频和低频信息. 故\(\phi\)实际上提取的是低频信息, \(\psi^H\)实际上提取的是水平方向的高频信息, \(\psi^V\)提取的是垂直方向上的高频信息, \(\psi^D\)是整体的高频信息(对角).

示例

PyWavelets

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的更多相关文章

  1. PP: Multilevel wavelet decomposition network for interpretable time series analysis

    Problem: the important frequency information is lack of effective modelling. ?? what is frequency in ...

  2. 理工科应该的知道的C/C++数学计算库(转)

    理工科应该的知道的C/C++数学计算库(转) 作为理工科学生,想必有限元分析.数值计算.三维建模.信号处理.性能分析.仿真分析...这些或多或少与我们常用的软件息息相关,假如有一天你只需要这些大型软件 ...

  3. {ICIP2014}{收录论文列表}

    This article come from HEREARS-L1: Learning Tuesday 10:30–12:30; Oral Session; Room: Leonard de Vinc ...

  4. Computer Graphics Research Software

    Computer Graphics Research Software Helping you avoid re-inventing the wheel since 2009! Last update ...

  5. 计算机视觉code与软件

    Research Code A rational methodology for lossy compression - REWIC is a software-based implementatio ...

  6. 在WINDOWS中安装使用GSL(MinGW64+Sublime Text3 & Visual Studio)

    本文介绍在Windows下安装使用GSL库,涉及GSL两个版本(官方最新版及GSL1.8 VC版).msys shell.GCC.G++等内容,最终实现对GSL安装及示例基于MinGW64在Subli ...

  7. Windows Python Extension Packages

    备注: 1.先要安装wheel库:pip install wheel 2.下载wheel,切换至下载路径,然后安装:pip install wheel库名.whl Windows Python Ext ...

  8. python 不同版本下载资源

    Unofficial Windows Binaries for Python Extension Packages by Christoph Gohlke, Laboratory for Fluore ...

  9. 常见的C++数学计算库

    来源: https://blog.csdn.net/panhao762/article/details/55276811 作为理工科学生,想必有限元分析.数值计算.三维建模.信号处理.性能分析.仿真分 ...

随机推荐

  1. Hadoop入门 运行环境搭建

    模板虚拟机 目录 模板虚拟机 1 硬件 2 操作系统 3 IP地址和主机名称 vm windows10 Hadoop100服务器 远程访问工具 其他准备 克隆虚拟机 克隆 修改主机名/ip 安装jdk ...

  2. Docker学习(一)——安装docker

    Suse12上安装docker   对于suse13.2之后的版本,因为docker已经被添加到了suse仓库中,直接使用sudo zypper install docker即可.   suse12不 ...

  3. Linux学习 - 网络命令

    一.write 1 功能 给指定在线用户发信息,以Ctrl + D保存结束 2 语法 write  <用户名>  [信息] 二.wall(write all) 1 功能 给所有在线用户发送 ...

  4. proxysql+MHA+半同步复制

    先配置成主从同步 先在各节点安装服务 [root@inotify ~]# yum install mariadb-server -y 编辑主节点的配置文件,并启动 [root@centos7 ~]# ...

  5. 通过Shell统计PV和UV

    PV.UV是网站分析中最基础.最常见的指标.PV即PageView,网站浏览量,指页面的浏览次数,用以衡量网站用户访问的网页数量.用户没打开一个页面便记录1次PV,多次打开同一页面则浏览量累计:UV即 ...

  6. 【Linux】【Shell】【text】Vim

    文本编辑器: 文本:纯文本,ASCII text:Unicode: 文本编辑种类: 行编辑器:sed 全屏编辑器:nano, vi vi: Visual Interface vim: Vi IMpro ...

  7. 【JavaWeb】【JSP】JSP传值到Servlet后端为NULL的问题

    JSP传值到Servlet后端为NULL的问题 哔哩哔哩@萌狼蓝天 博客:萌狼工作室-博客园 联系QQ:#3447902411# | 仅限技术交流可添加 | 添加请说明你的方向和来意 1.目标文件路径 ...

  8. Java分层思想

    从最常规的分层结构来说,系统层次从上到下依次为: 表现层/UI层/界面层:主要是客户端的展示. 服务层/业务层:直接为客户端提供的服务或功能.也是系统所能对外提供的功能. 领域层:系统内的领域活动. ...

  9. Redis cluster 集群部署和配置

    目录 一.集群简介 cluster介绍 cluster原理 cluster特点 应用场景 二.集群部署 环境介绍 节点部署 启动集群 三.集群测试 一.集群简介 cluster介绍 redis clu ...

  10. Hive实战UDF 外部依赖文件找不到的问题

    目录 关于外部依赖文件找不到的问题 为什么要使用外部依赖 为什么idea 里面可以运行上线之后不行 依赖文件直接打包在jar 包里面不香吗 学会独立思考并且解决问题 继承DbSearcher 读取文件 ...