图像降噪算法——小波硬阈值滤波(上)
小波变换相对于傅里叶变换要更加抽象难以理解,其实到写这篇博客的时候我也没有完全理解小波变换,下面的基本介绍部分主要是根据《数字图像处理》和《A Tutorial of the Wavelet Transform》这两篇参考文献结合自己的理解过一遍推导过程,然后我基于OpenCV和FFWT库完成了一个简单的基于离散小波变换的图像降噪算法。
1. 多分辨率展开
在推导之前,首先需要引入一个思想,一个函数 f ( x ) f(x) f(x)可以通过函数集合 { φ k ( x ) } \{\varphi_{k}(x)\} {φk(x)}表示(展开),如下: f ( x ) = ∑ k α k φ k ( x ) f(x)=\sum_{k} \alpha_{k} \varphi_{k}(x) f(x)=k∑αkφk(x)如果基于函数集合 { φ k ( x ) } \{\varphi_{k}(x)\} {φk(x)}展开方式唯一,则将 φ k ( x ) \varphi_{k}(x) φk(x)称为基函数,如果基函数满足: ⟨ φ j ( x ) , φ k ( x ) ⟩ = ∫ φ j ( x ) φ k ( x ) ∗ d x = δ j k = { 0 , j ≠ k 1 , j = k \left\langle\varphi_{j}(x), \varphi_{k}(x)\right\rangle=\int \varphi_{j}(x) {\varphi}_{k}(x)^{*} dx=\delta_{j k}=\left\{\begin{array}{ll} 0, & j \neq k \\ 1, & j=k \end{array}\right. ⟨φj(x),φk(x)⟩=∫φj(x)φk(x)∗dx=δjk={0,1,j=kj=k那么我们就可以通过积分来求解展开级数系数 α k \alpha_{k} αk: ⟨ f ( x ) , φ k ( x ) ⟩ = ∫ f ( x ) φ k ∗ ( x ) d x = ∫ ( ∑ k ′ α k ′ φ k ′ ( x ) ) φ k ∗ ( x ) d x = ∑ k ′ α k ′ ( ∫ φ k ′ ( x ) φ k ∗ ( x ) d x ) = ∑ k ′ α k ′ δ k ′ k = α k \begin{aligned} \left\langle f(x), {\varphi}_{k}(x)\right\rangle&=\int f(x) {\varphi}_{k}^{*}(x) dx \\ &=\int\left(\sum_{k^{\prime}} \alpha_{k^{\prime}} \varphi_{k^{\prime}}(x)\right) {\varphi}_{k}^{*}(x) d x \\ &=\sum_{k^{\prime}} \alpha_{k^{\prime}}\left(\int \varphi_{k^{\prime}}(x) {\varphi}_{k}^{*}(x) dx\right) \\ &=\sum_{k^{\prime}} \alpha_{k^{\prime}} \delta_{k^{\prime} k} \\ &=\alpha_{k} \end{aligned} ⟨f(x),φk(x)⟩=∫f(x)φk∗(x)dx=∫(k′∑αk′φk′(x))φk∗(x)dx=k′∑αk′(∫φk′(x)φk∗(x)dx)=k′∑αk′δk′k=αk基函数为 φ k ( x ) = exp ( j 2 π k x / T ) \varphi_{k}(x)=\exp (j 2 \pi k x / T) φk(x)=exp(j2πkx/T)的傅里叶级数展开就是上式的一个特例。
2. 尺度函数
尺度函数是定义为如下所示的一组函数的集合: φ j , k ( x ) = 2 j / 2 φ ( 2 j x − k ) \varphi_{j, k}(x)=2^{j / 2} \varphi\left(2^{j} x-k\right) φj,k(x)=2j/2φ(2jx−k)其中,参数 j j j决定了函数的宽度,参数 k k k决定了函数的位置,这种操作可以理解为高中学的对函数的平移和缩放,以哈尔尺度函数为例: φ ( x ) = { 1 , 0 ≤ x < 1 0 , o t h e r w i s e \varphi(x)=\left\{\begin{array}{ll} 1, & 0 \leq x<1 \\ 0, & otherwise \end{array}\right. φ(x)={1,0,0≤x<1otherwise那么 φ 0 , 0 ( x ) = φ ( x ) = { 1 , 0 ≤ x < 1 0 , o t h e r w i s e \varphi_{0,0}(x)=\varphi(x)=\left\{\begin{array}{ll} 1, & 0 \leq x<1 \\ 0, & otherwise \end{array}\right. φ0,0(x)=φ(x)={1,0,0≤x<1otherwise φ 0 , 1 ( x ) = φ ( x − 1 ) = { 1 , 1 ≤ x < 2 0 , o t h e r w i s e \varphi_{0,1}(x)=\varphi(x-1)=\left\{\begin{array}{ll} 1, & 1 \leq x<2 \\ 0, & otherwise \end{array}\right. φ0,1(x)=φ(x−1)={1,0,1≤x<2otherwise φ 1 , 0 ( x ) = 2 φ ( 2 x ) = { 2 , 0 ≤ x < 1 2 0 , o t h e r w i s e \varphi_{1,0}(x)=\sqrt2\varphi(2x)=\left\{\begin{array}{ll} \sqrt2, & 0 \leq x<\frac{1}{2} \\ 0, & otherwise \end{array}\right. φ1,0(x)=2φ(2x)={2,0,0≤x<21otherwise φ 1 , 1 ( x ) = 2 φ ( 2 x − 1 ) = { 2 , 1 2 ≤ x < 1 0 , o t h e r w i s e \varphi_{1,1}(x)=\sqrt2\varphi(2x-1)=\left\{\begin{array}{ll} \sqrt2, & \frac{1}{2} \leq x<1 \\ 0, & otherwise \end{array}\right. φ1,1(x)=2φ(2x−1)={2,0,21≤x<1otherwise以此类推。
将缩放固定,平移变化(参数
j
j
j 相同,参数
k
k
k 不同)的一组函数构建为一个函数子集合
V
j
V_{j}
Vj:
V
j
=
Span
‾
{
φ
j
,
k
(
x
)
}
V_{j}=\overline{\operatorname{Span}}\left\{\varphi_{j , k}(x)\right\}
Vj=Span{φj,k(x)}其中,
j
j
j越大,缩放后的函数子集合中的函数越“窄”,则代表的细节越多。且“宽”函数子集合可以由“窄”函数子集合表示,即
V
j
V_j
Vj可以由
V
j
+
1
V_{j+1}
Vj+1表示,同样以哈尔尺度函数为例,我们可以发现:
φ
0
,
0
(
x
)
=
1
2
φ
1
,
0
(
x
)
+
1
2
φ
1
,
1
(
x
)
\varphi_{0, 0}(x)=\frac{1}{\sqrt{2}} \varphi_{1,0}(x)+\frac{1}{\sqrt{2}} \varphi_{1,1}(x)
φ0,0(x)=21φ1,0(x)+21φ1,1(x)对
V
0
V_0
V0和
V
1
V_1
V1两个函数子集合有:
φ
0
,
k
(
x
)
=
1
2
φ
1
,
2
k
(
x
)
+
1
2
φ
1
,
2
k
+
1
(
x
)
\varphi_{0, k}(x)=\frac{1}{\sqrt{2}} \varphi_{1,2k}(x)+\frac{1}{\sqrt{2}} \varphi_{1,2k+1}(x)
φ0,k(x)=21φ1,2k(x)+21φ1,2k+1(x)这种关系可以用递推关系式表示为:
φ
(
x
)
=
∑
n
h
φ
(
n
)
2
φ
(
2
x
−
n
)
\varphi(x)=\sum_{n} h_{\varphi}(n) \sqrt{2} \varphi(2 x-n)
φ(x)=n∑hφ(n)2φ(2x−n)其中,
h
φ
(
n
)
h_{\varphi}(n)
hφ(n)成为尺度函数系数,同样是上面的哈尔尺度函数,我们已知
h
φ
(
0
)
=
h
φ
(
1
)
=
1
/
2
h_{\varphi}(0)=h_{\varphi}(1)=1 / \sqrt{2}
hφ(0)=hφ(1)=1/2,
V
0
V_0
V0和
V
1
V_1
V1两个函数子集合的关系就可以通过递推关系式直接获得:
φ
(
x
)
=
1
2
[
2
φ
(
2
x
)
]
+
1
2
[
2
φ
(
2
x
−
1
)
]
=
φ
(
2
x
)
+
φ
(
2
x
−
1
)
\varphi(x)=\frac{1}{\sqrt{2}}[\sqrt{2} \varphi(2 x)]+\frac{1}{\sqrt{2}}[\sqrt{2} \varphi(2 x-1)]=\varphi(2 x)+\varphi(2 x-1)
φ(x)=21[2φ(2x)]+21[2φ(2x−1)]=φ(2x)+φ(2x−1)那么
h
φ
(
n
)
h_{\varphi}(n)
hφ(n)怎么求呢?对于不同的尺度函数是不同的,哈尔尺度函数的尺度函数系数就可以通过公式直接计算出来,即哈尔变换矩阵的计算公式,书上有且有一丢丢复杂,在此就不进行赘述。
3. 小波函数
小波函数是定义为如下所示的一组函数的集合:
ψ
j
,
k
(
x
)
=
2
ψ
(
2
j
x
−
k
)
j
/
2
\psi_{j, k}(x)=2 \sqrt[j / 2]{\psi\left(2^{j} x-k\right)}
ψj,k(x)=2j/2ψ(2jx−k)仿照上面尺度函数,我们同样定义一个函数子集合:
W
j
=
Span
‾
{
ψ
j
,
k
(
x
)
}
W_{j}=\overline{\operatorname{Span}}\left\{\psi_{j,k}(x)\right\}
Wj=Span{ψj,k(x)}小波函数子集合
W
j
W_j
Wj和尺度函数子集合
V
j
V_j
Vj之间的关系为(非常重要)是:
V
j
+
1
=
V
j
⊕
W
j
V_{j+1}=V_{j} \oplus W_{j}
Vj+1=Vj⊕Wj其中,
⊕
\oplus
⊕是并集符号,
V
j
+
1
V_{j+1}
Vj+1和
V
j
V_{j}
Vj的正交补集是
W
j
W_j
Wj,且
V
j
V_{j}
Vj中的所有函数
W
j
W_j
Wj中的所有函数都正交,这种关系我们可以用这样一张图表示:
前面我们知道,即
V
j
V_j
Vj可以由
V
j
+
1
V_{j+1}
Vj+1表示,那么同样的道理,即
W
j
W_j
Wj也可以由
V
j
+
1
V_{j+1}
Vj+1表示,因此我们可以获得和尺度函数类似的递推关系式:
ψ
(
x
)
=
∑
n
h
ψ
(
n
)
2
φ
(
2
x
−
n
)
\psi(x)=\sum_{n} h_{\psi}(n) \sqrt{2} \varphi(2 x-n)
ψ(x)=n∑hψ(n)2φ(2x−n)其中
h
ψ
(
n
)
h_{\psi}(n)
hψ(n)为小波函数系数,并且和尺度函数系数有如下关系:
h
ψ
(
n
)
=
(
−
1
)
n
h
φ
(
1
−
n
)
h_{\psi}(n)=(-1)^{n} h_{\varphi}(1-n)
hψ(n)=(−1)nhφ(1−n)还是以上面的哈尔尺度函数为例,我们来推导哈尔小波函数:
我们已知
h
φ
(
0
)
=
h
φ
(
1
)
=
1
/
2
h_{\varphi}(0)=h_{\varphi}(1)=1 / \sqrt{2}
hφ(0)=hφ(1)=1/2,那么根据上式有
h
ψ
(
0
)
=
(
−
1
)
0
h
φ
(
1
−
0
)
=
1
/
2
h_{\psi}(0)=(-1)^{0} h_{\varphi}(1-0)=1 / \sqrt{2}
hψ(0)=(−1)0hφ(1−0)=1/2
h
ψ
(
1
)
=
(
−
1
)
1
h
φ
(
1
−
1
)
=
−
1
/
2
h_{\psi}(1)=(-1)^{1} h_{\varphi}(1-1)=-1 / \sqrt{2}
hψ(1)=(−1)1hφ(1−1)=−1/2因此我们有:
ψ
(
x
)
=
φ
(
2
x
)
−
φ
(
2
x
−
1
)
\psi(x)=\varphi(2 x)-\varphi(2 x-1)
ψ(x)=φ(2x)−φ(2x−1)我们带入
j
=
0
j=0
j=0,
k
=
0
k=0
k=0时的哈尔尺度函数:
φ
0
,
0
(
x
)
=
φ
(
x
)
=
{
1
,
0
≤
x
<
1
0
,
o
t
h
e
r
w
i
s
e
\varphi_{0,0}(x)=\varphi(x)=\left\{\begin{array}{ll} 1, & 0 \leq x<1 \\ 0, & otherwise \end{array}\right.
φ0,0(x)=φ(x)={1,0,0≤x<1otherwise这样我们就可以推导出
j
=
0
j=0
j=0,
k
=
0
k=0
k=0时的哈尔小波函数:
ψ
0
,
0
(
x
)
=
ψ
(
x
)
=
{
1
,
0
⩽
x
<
0.5
−
1
,
0.5
⩽
x
<
1
0
,
o
t
h
e
r
w
i
s
e
\psi_{0,0}(x)=\psi(x)=\left\{\begin{array}{ll} 1, & 0 \leqslant x<0.5 \\ -1, & 0.5 \leqslant x<1 \\ 0, & otherwise \end{array}\right.
ψ0,0(x)=ψ(x)=⎩⎨⎧1,−1,0,0⩽x<0.50.5⩽x<1otherwise其他的小波函数可以按照同样的方式进行递推。
4. 小波级数展开
有了上面的铺垫,这里就可以给出小波级数展开的公式: f ( x ) = ∑ k c j 0 ( k ) φ j 0 , k ( x ) + ∑ j = j 0 ∞ ∑ k d j ( k ) ψ j , k ( x ) 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) f(x)=k∑cj0(k)φj0,k(x)+j=j0∑∞k∑dj(k)ψj,k(x)其中, φ j 0 , k ( x ) \varphi_{j_0, k}(x) φj0,k(x)和 ψ j , k ( x ) \psi_{j, k}(x) ψj,k(x)就是前面介绍的尺度函数和小波函数。 c j 0 ( k ) c_{j_0}(k) cj0(k)和 d j ( k ) d_{j}(k) dj(k)就是前面提到的尺度系数和小波系数(注意区分尺度函数系数和小波函数系数)。很幸运的是我们的尺度函数和小波函数满足1.1节中介绍的多分辨率展开条件,因此有: c j 0 ( k ) = ⟨ f ( x ) , φ j 0 , k ( x ) ⟩ = ∫ f ( x ) φ j 0 , k ( x ) d x c_{j_0}(k)=\left\langle f(x), \varphi_{j_0, k}(x)\right\rangle=\int f(x) \varphi_{j_0, k}(x) \mathrm{d} x cj0(k)=⟨f(x),φj0,k(x)⟩=∫f(x)φj0,k(x)dx d j ( k ) = ⟨ f ( x ) , ψ j , k ( x ) ⟩ = ∫ f ( x ) ψ j , k ( x ) d x d_{j}(k)=\left\langle f(x), \psi_{j, k}(x)\right\rangle=\int f(x) \psi_{j, k}(x) \mathrm{d} x dj(k)=⟨f(x),ψj,k(x)⟩=∫f(x)ψj,k(x)dx这里可能会有疑问,为什么小波函数的参数 j j j是从 j 0 j_0 j0到 ∞ \infty ∞,而尺度函数的参数 j j j仅仅为 j 0 j_0 j0? 这个问题可以通过上面提到的小波函数子集合 W j W_j Wj和尺度函数子集合 V j V_j Vj之间的关系去理解,因为任何一个函数 f ( x ) f(x) f(x)都最终可以由 V 0 ⊕ W 0 ⊕ W 1 ⊕ W 2 ⊕ ⋅ ⋅ ⋅ V_{0} \oplus W_{0} \oplus W_{1} \oplus W_{2} \oplus ··· V0⊕W0⊕W1⊕W2⊕⋅⋅⋅这样一个函数集合表示,尺度函数子集合 V 0 V_{0} V0 中的函数即 φ j 0 , k ( x ) \varphi_{j 0, k}(x) φj0,k(x),而 W 0 W_{0} W0、 W 1 ⋅ ⋅ ⋅ W_{1}··· W1⋅⋅⋅这样的小波函数子集合中的函数即 ψ 0 , k \psi_{0, k} ψ0,k、 ψ 1 , k ⋅ ⋅ ⋅ \psi_{1, k}··· ψ1,k⋅⋅⋅
这里紧接着上面的哈尔尺度函数和哈尔小波函数的例子进行小波级数展开,给定函数: y = { x 2 , 0 ⩽ x ⩽ 1 0 , o t h e r w i s e y=\left\{\begin{array}{ll} x^{2}, & 0 \leqslant x \leqslant 1 \\ 0, & otherwise \end{array}\right. y={x2,0,0⩽x⩽1otherwise那么按照上面的公式有: c 0 ( 0 ) = ∫ 0 1 x 2 φ 0 , 0 ( x ) d x = ∫ 0 1 x 2 d x = x 3 3 ∣ 0 1 = 1 3 c_{0}(0)=\int_{0}^{1} x^{2} \varphi_{0,0}(x) \mathrm{d} x=\int_{0}^{1} x^{2} \mathrm{d} x=\left.\frac{x^{3}}{3}\right|_{0} ^{1}=\frac{1}{3} c0(0)=∫01x2φ0,0(x)dx=∫01x2dx=3x3∣∣∣∣01=31 d 0 ( 0 ) = ∫ 0 1 x 2 ψ 0 , 0 ( x ) d x = ∫ 0 05 x 2 d x − ∫ 05 1 x 2 d x = − 1 4 d_{0}(0)=\int_{0}^{1} x^{2} \psi_{0,0}(x) \mathrm{d} x=\int_{0}^{05} x^{2} \mathrm{d} x-\int_{05}^{1} x^{2} \mathrm{d} x=-\frac{1}{4} d0(0)=∫01x2ψ0,0(x)dx=∫005x2dx−∫051x2dx=−41 d 1 ( 0 ) = ∫ 0 1 x 2 ψ 1 , 0 ( x ) d x = ∫ 0 0.25 x 2 2 d x − ∫ 0.25 0.5 x 2 2 d x = − 2 32 d_{1}(0)=\int_{0}^{1} x^{2} \psi_{1,0}(x) \mathrm{d} x=\int_{0}^{0.25} x^{2} \sqrt{2} \mathrm{d} x-\int_{0.25}^{0.5} x^{2} \sqrt{2} \mathrm{d} x=-\frac{\sqrt{2}}{32} d1(0)=∫01x2ψ1,0(x)dx=∫00.25x22dx−∫0.250.5x22dx=−322 d 1 ( 1 ) = ∫ 0 1 x 2 ψ 1 , 1 ( x ) d x = ∫ 05 0.75 x 2 2 d x − ∫ 0.75 1 x 2 2 d x = − 3 2 32 d_{1}(1)=\int_{0}^{1} x^{2} \psi_{1,1}(x) \mathrm{d} x=\int_{05}^{0.75} x^{2} \sqrt{2} \mathrm{d} x-\int_{0.75}^{1} x^{2} \sqrt{2} \mathrm{d} x=-\frac{3 \sqrt{2}}{32} d1(1)=∫01x2ψ1,1(x)dx=∫050.75x22dx−∫0.751x22dx=−3232因此次函数的小波级数展开为: y = 1 3 φ 0 , 0 ( x ) ⏟ V 0 + [ − 1 4 ψ 0 , 0 ( x ) ⏟ W 0 + [ − 2 32 ψ 1 , 0 ( x ) − 3 2 32 ψ 1 , 1 ( x ) ] ⏟ W 1 + ⋯ y=\underbrace{\frac{1}{3} \varphi_{0,0}(x)}_{V_{0}}+\underbrace{\left[-\frac{1}{4} \psi_{0,0}(x)\right.}_{W_{0}}+\underbrace{\left[-\frac{\sqrt{2}}{32} \psi_{1,0}(x)-\frac{3 \sqrt{2}}{32} \psi_{1,1}(x)\right]}_{W_{1}}+\cdots y=V0 31φ0,0(x)+W0 [−41ψ0,0(x)+W1 [−322ψ1,0(x)−3232ψ1,1(x)]+⋯
5. 离散小波变换
离散小波变换就是用小波级数展开中小波系数和尺度系数在“小波域”中描述函数,相当于傅里叶变换后频域中的幅值和相角,因为是离散数据,所以需要通过加权求和的方式来代替积分,和如下图所示
其中
W
φ
(
j
0
,
k
)
W_{\varphi}\left(j_{0}, k\right)
Wφ(j0,k)就相当于
c
j
0
(
k
)
c_{j_0}(k)
cj0(k),
W
ψ
(
j
,
k
)
W_{\psi}(j, k)
Wψ(j,k)相当于
d
j
(
k
)
d_{j}(k)
dj(k),参考0小波级数展开,那么正向变换为:
W
φ
(
j
0
,
k
)
=
1
M
∑
n
f
(
n
)
φ
j
0
,
k
(
n
)
W_{\varphi}\left(j_{0}, k\right)=\frac{1}{\sqrt{M}} \sum_{n} f(n) \varphi_{j_0, k}(n)
Wφ(j0,k)=M1n∑f(n)φj0,k(n)
W
ψ
(
j
,
k
)
=
1
M
∑
n
f
(
n
)
ψ
j
,
k
(
n
)
,
j
⩾
j
0
W_{\psi}(j, k)=\frac{1}{\sqrt{M}} \sum_{n} f(n) \psi_{j, k}(n), \quad j \geqslant j_{0}
Wψ(j,k)=M1n∑f(n)ψj,k(n),j⩾j0而反向变换为:
f
(
n
)
=
1
M
∑
k
W
φ
(
j
0
,
k
)
φ
j
0
,
k
(
n
)
+
1
M
∑
j
=
j
0
∞
∑
k
W
ψ
(
j
,
k
)
ψ
j
,
k
(
n
)
f(n)=\frac{1}{\sqrt{M}} \sum_{k} W_{\varphi}\left(j_{0}, k\right) \varphi_{j_{0}, k}(n)+\frac{1}{\sqrt{M}} \sum_{j=j_{0}}^{\infty} \sum_{k} W_{\psi}(j, k) \psi_{j, k}(n)
f(n)=M1k∑Wφ(j0,k)φj0,k(n)+M1j=j0∑∞k∑Wψ(j,k)ψj,k(n)其中
φ
j
0
,
k
(
n
)
\varphi_{j 0, k}(n)
φj0,k(n)和
ψ
j
,
k
(
n
)
\psi_{j, k}(n)
ψj,k(n)是
φ
j
0
,
k
(
x
)
\varphi_{j 0, k}(x)
φj0,k(x)和
ψ
j
,
k
(
x
)
\psi_{j, k}(x)
ψj,k(x)的采样形式,即
φ
j
0
,
k
(
n
)
=
φ
j
0
,
k
(
x
s
+
n
Δ
x
s
)
\varphi_{j_0, k}(n)=\varphi_{j_0, k}\left(x_{s}+n \Delta x_{s}\right)
φj0,k(n)=φj0,k(xs+nΔxs)
ψ
j
,
k
(
n
)
=
ψ
j
,
k
(
x
s
+
n
Δ
x
s
)
\psi_{j , k}(n)=\psi_{j, k}\left(x_{s}+n \Delta x_{s}\right)
ψj,k(n)=ψj,k(xs+nΔxs)
n
=
0
,
1
,
2
,
⋯
M
−
1
n=0,1,2, \cdots M-1
n=0,1,2,⋯M−1,
j
=
0
,
1
,
2
,
⋯
J
−
1
j=0,1,2, \cdots J-1
j=0,1,2,⋯J−1,其中
M
M
M和
J
J
J是有关系的,即
M
=
2
J
M=2^{J}
M=2J,我们可以这么说,变换是由
M
M
M个系数组成的,最小尺度为
0
0
0,最大尺度为
J
−
1
J-1
J−1,起始位置
x
s
x_s
xs和位置间隔
Δ
x
s
\Delta x_{s}
Δxs是可以人为选择的,选择方法通常是使得采样点能够均匀分布到基函数的支撑区,具体怎么操作看下面的例子:
承接上面的例子,给定离散函数
f
(
0
)
=
1
,
f
(
1
)
=
4
,
f
(
2
)
=
−
3
,
f
(
3
)
=
0
f(0)=1, f(1)=4, f(2)=-3,f(3)=0
f(0)=1,f(1)=4,f(2)=−3,f(3)=0,我们以哈尔函数为基函数进行离散小波变换:
(1)首先由给定的采样值我们知道
M
=
4
M=4
M=4,那么
J
=
2
J=2
J=2,因此我们采用的哈尔尺度函数是
φ
0
,
0
(
x
)
\varphi_{0, 0}(x)
φ0,0(x),采用的哈尔小波函数是
ψ
0
,
0
(
x
)
\psi_{0, 0}(x)
ψ0,0(x),
ψ
1
,
0
(
x
)
\psi_{1, 0}(x)
ψ1,0(x),
ψ
1
,
1
(
x
)
\psi_{1, 1}(x)
ψ1,1(x),前面已经推导过这些函数的表达式。
(2)接下来就是选择
x
s
x_s
xs和
Δ
x
s
\Delta x_{s}
Δxs了,哈尔函数的支撑区为
0
0
0到
1
1
1,因此我们就在区间
0
0
0到
1
1
1中选取四个采样点进行离散小波变换,例如令
x
s
=
0.2
,
Δ
x
s
=
0.2
x_s=0.2,\Delta x_s=0.2
xs=0.2,Δxs=0.2,那么四个采样点为
x
0
=
0.2
,
x
1
=
0.4
,
x
2
=
0.6
,
x
3
=
0.8
x_0=0.2, x_1=0.4,x_2=0.6,x_3=0.8
x0=0.2,x1=0.4,x2=0.6,x3=0.8,带入正向变换公式有:
W
φ
(
0
,
0
)
=
1
2
∑
n
=
0
3
f
(
n
)
φ
0
,
0
(
x
n
)
=
1
2
[
1
⋅
1
+
4
⋅
1
−
3
⋅
1
+
0
⋅
1
]
=
1
W_{\varphi}(0,0)=\frac{1}{2} \sum_{n=0}^{3} f(n) \varphi_{0,0}(x_n)=\frac{1}{2}[1 \cdot 1+4 \cdot 1-3 \cdot 1+0 \cdot 1]=1
Wφ(0,0)=21n=0∑3f(n)φ0,0(xn)=21[1⋅1+4⋅1−3⋅1+0⋅1]=1
W
ψ
(
0
,
0
)
=
=
1
2
∑
n
=
0
3
f
(
n
)
ψ
0
,
0
(
x
n
)
=
1
2
[
1
⋅
1
+
4
⋅
1
−
3
⋅
(
−
1
)
+
0
⋅
(
−
1
)
]
=
4
W_{\psi}(0,0)==\frac{1}{2} \sum_{n=0}^{3} f(n) \psi_{0,0}(x_n)=\frac{1}{2}[1 \cdot 1+4 \cdot 1-3 \cdot(-1)+0 \cdot(-1)]=4
Wψ(0,0)==21n=0∑3f(n)ψ0,0(xn)=21[1⋅1+4⋅1−3⋅(−1)+0⋅(−1)]=4
W
ψ
(
1
,
0
)
=
=
1
2
∑
n
=
0
3
f
(
n
)
ψ
1
,
0
(
x
n
)
=
1
2
[
1
⋅
2
+
4
⋅
(
−
2
)
−
3
⋅
0
+
0
⋅
0
]
=
−
1.5
2
W_{\psi}(1,0)==\frac{1}{2} \sum_{n=0}^{3} f(n) \psi_{1,0}(x_n)=\frac{1}{2}[1 \cdot \sqrt{2}+4 \cdot(-\sqrt{2})-3 \cdot 0+0 \cdot 0]=-1.5 \sqrt{2}
Wψ(1,0)==21n=0∑3f(n)ψ1,0(xn)=21[1⋅2+4⋅(−2)−3⋅0+0⋅0]=−1.52
W
ψ
(
1
,
1
)
=
=
1
2
∑
n
=
0
3
f
(
n
)
ψ
1
,
1
(
x
n
)
=
1
2
[
1
⋅
0
+
4
⋅
0
−
3
⋅
2
+
0
⋅
(
−
2
)
]
=
−
1.5
2
W_{\psi}(1,1)==\frac{1}{2} \sum_{n=0}^{3} f(n) \psi_{1,1}(x_n)=\frac{1}{2}[1 \cdot 0+4 \cdot 0-3 \cdot \sqrt{2}+0 \cdot(-\sqrt{2})]=-1.5 \sqrt{2}
Wψ(1,1)==21n=0∑3f(n)ψ1,1(xn)=21[1⋅0+4⋅0−3⋅2+0⋅(−2)]=−1.52那么同样地,反向变换:
f
(
0
)
=
1
2
[
W
φ
(
0
,
0
)
φ
0
,
0
(
x
0
)
+
W
ψ
(
0
,
0
)
ψ
0
,
0
(
x
0
)
+
W
ψ
(
1
,
0
)
ψ
1
,
0
(
x
0
)
+
W
ψ
(
1
,
1
)
ψ
1
,
1
(
x
0
)
]
=
1
2
[
1
⋅
1
+
4
⋅
1
−
1.5
2
⋅
(
2
)
−
1.5
2
⋅
0
]
=
1
f(0)=\frac{1}{2}\left[W_{\varphi}(0,0) \varphi_{0,0}(x_0)+W_{\psi}(0,0) \psi_{0,0}(x_0)+W_{\psi}(1,0) \psi_{1,0}(x_0)+W_{\psi}(1,1) \psi_{1,1}(x_0)\right]=\frac{1}{2}[1 \cdot 1+4 \cdot 1-1.5 \sqrt{2} \cdot(\sqrt{2})-1.5 \sqrt{2} \cdot 0]=1
f(0)=21[Wφ(0,0)φ0,0(x0)+Wψ(0,0)ψ0,0(x0)+Wψ(1,0)ψ1,0(x0)+Wψ(1,1)ψ1,1(x0)]=21[1⋅1+4⋅1−1.52⋅(2)−1.52⋅0]=1
f
(
1
)
f(1)
f(1)、
f
(
2
)
f(2)
f(2)、
f
(
3
)
f(3)
f(3)的反向变换操作以此类推。
6. 快速小波变换
以离散小波变换的正向变换为例,说白了我们就像想要获得的一些列小波系数 W ψ ( j , k ) W_{\psi}(j, k) Wψ(j,k)和尺度系数 W φ ( j 0 , k ) W_{\varphi}\left(j_{0}, k\right) Wφ(j0,k),而我们在上面离散小波变换中的算法是将带变换的函数 f ( n ) f(n) f(n)与尺度函数 φ j 0 , k ( n ) \varphi_{j 0, k}(n) φj0,k(n)和小波函数 ψ j , k ( n ) \psi_{j, k}(n) ψj,k(n)进行內积(加权求和)操作,这样计算量为 O ( M 2 ) O\left(M^2\right) O(M2),那么我们有什么办法可以更加快速地获得 W ψ ( j , k ) W_{\psi}(j, k) Wψ(j,k)和 W φ ( j 0 , k ) W_{\varphi}\left(j_{0}, k\right) Wφ(j0,k)吗?
答案就是快速小波变换,快速小波变换的基础如下:
W
ψ
(
j
,
k
)
=
h
ψ
(
−
n
)
⋆
W
φ
(
j
+
1
,
n
)
∣
n
=
2
k
,
k
⩾
0
W_{\psi}(j, k)=\left.h_{\psi}(-n) \star W_{\varphi}(j+1, n)\right|_{n=2 k, k \geqslant 0}
Wψ(j,k)=hψ(−n)⋆Wφ(j+1,n)∣n=2k,k⩾0
W
φ
(
j
,
k
)
=
h
φ
(
−
n
)
⋆
W
φ
(
j
+
1
,
n
)
∣
n
=
2
k
,
k
⩾
0
W_{\varphi}(j, k)=\left.h_{\varphi}(-n) \star W_{\varphi}(j+1, n)\right|_{n=2 k, k \geqslant 0}
Wφ(j,k)=hφ(−n)⋆Wφ(j+1,n)∣n=2k,k⩾0公式的推导过程可以参考《数字图像处理》,其中,
⋆
\star
⋆是卷积符号,尺度函数系数
h
ψ
(
n
)
h_{\psi}(n)
hψ(n)和小波函数系数
h
φ
(
n
)
h_{\varphi}(n)
hφ(n)前文提到过可以直接通过公式计算,最高尺度系数
W
φ
(
J
,
n
)
W_{\varphi}(J, n)
Wφ(J,n)我们假定为函数本身的采样值
f
(
n
)
f(n)
f(n),那么我们就可以通过卷积以及下采样过程,一层一层地求解
W
ψ
(
j
,
k
)
W_{\psi}(j, k)
Wψ(j,k)和
W
φ
(
j
,
k
)
W_{\varphi}(j, k)
Wφ(j,k),流程如下图所示:
这中间注意两点:
(1)已知
h
ψ
(
n
)
h_{\psi}(n)
hψ(n)和
h
φ
(
n
)
h_{\varphi}(n)
hφ(n),那么与
h
ψ
(
−
n
)
h_{\psi}(-n)
hψ(−n)和
h
φ
(
−
n
)
h_{\varphi}(-n)
hφ(−n)卷积其实就是将已知的
h
ψ
(
n
)
h_{\psi}(n)
hψ(n)和
h
φ
(
n
)
h_{\varphi}(n)
hφ(n)翻转后再卷积;
(2)公式中 的
n
=
2
k
n=2k
n=2k指的是卷积操作是在
n
=
2
k
n=2k
n=2k是进行的,因此在卷积完成后还需要进行以2为基的下采样。
这样说可能还是比较抽象,举个例子就好了,还是离散小波变换中同样的例子:
给定离散函数
f
(
0
)
=
1
,
f
(
1
)
=
4
,
f
(
2
)
=
−
3
,
f
(
3
)
=
0
f(0)=1, f(1)=4, f(2)=-3,f(3)=0
f(0)=1,f(1)=4,f(2)=−3,f(3)=0以哈尔函数为基函数进行离散小波变换:
按照快速小波变换给出的算法我们可以画出上图所示的计算流程图,以
W
ψ
(
1
,
n
)
W_{\psi}(1, n)
Wψ(1,n)的计算过程为例,首先进行卷积操作卷积操作,我们已知
h
φ
(
0
)
=
h
φ
(
1
)
=
1
/
2
,
h
ψ
(
0
)
=
1
/
2
,
h
ψ
(
1
)
=
−
1
/
2
h_{\varphi}(0)=h_{\varphi}(1)=1 / \sqrt{2},h_{\psi}(0)=1 / \sqrt{2},h_{\psi}(1)=-1 / \sqrt{2}
hφ(0)=hφ(1)=1/2,hψ(0)=1/2,hψ(1)=−1/2,那么:
h
ψ
(
−
n
)
⋆
W
φ
(
2
,
n
)
=
h
ψ
(
−
n
)
⋆
f
(
n
)
=
{
−
1
/
2
,
1
/
2
}
⋆
{
1
,
4
,
−
3
,
0
}
=
{
−
1
/
2
,
−
3
/
2
,
7
/
2
,
−
3
/
2
,
0
}
h_{\psi}(-n) \star W_{\varphi}(2, n)=h_{\psi}(-n) \star f(n)=\{-1 / \sqrt{2}, 1 / \sqrt{2}\}\star\{1,4,-3,0\}=\{-1 / \sqrt{2},-3 / \sqrt{2}, 7 / \sqrt{2},-3 / \sqrt{2}, 0\}
hψ(−n)⋆Wφ(2,n)=hψ(−n)⋆f(n)={−1/2,1/2}⋆{1,4,−3,0}={−1/2,−3/2,7/2,−3/2,0}这里解释下,因为
h
ψ
(
−
n
)
h_{\psi}(-n)
hψ(−n)需要将
h
ψ
(
n
)
h_{\psi}(n)
hψ(n)翻转后当做卷积核,因此是
{
−
1
/
2
,
1
/
2
}
\{-1 / \sqrt{2}, 1 / \sqrt{2}\}
{−1/2,1/2},卷积时需要将卷积核翻转后再逐位相乘,因此获得上面的结果。然后进行以2为基的下采样,就可以获得
W
ψ
(
1
,
n
)
=
{
−
3
/
2
,
−
3
/
2
}
W_{\psi}(1, n)=\{-3 / \sqrt{2},-3 / \sqrt{2}\}
Wψ(1,n)={−3/2,−3/2},在图中下采样过程用椭圆进行了标注。
7. 图像小波变换
终于算是切入这篇博客的正题了,图像的小波变换中需要用到二维尺度函数和二维小波函数,它们其实就是通过一维尺度函数和一维小波函数乘积获得的,一共有一个二维尺度函数:
φ
(
x
,
y
)
=
φ
(
x
)
φ
(
y
)
\varphi(x, y)=\varphi(x) \varphi(y)
φ(x,y)=φ(x)φ(y)和三个二维小波函数:
ψ
H
(
x
,
y
)
=
ψ
(
x
)
φ
(
y
)
ψ
V
(
x
,
y
)
=
φ
(
x
)
ψ
(
y
)
ψ
D
(
x
,
y
)
=
ψ
(
x
)
ψ
(
y
)
\begin{aligned} &\psi^{H}(x, y)=\psi(x) \varphi(y)\\ &\psi^{V}(x, y)=\varphi(x) \psi(y)\\ &\psi^{D}(x, y)=\psi(x) \psi(y) \end{aligned}
ψH(x,y)=ψ(x)φ(y)ψV(x,y)=φ(x)ψ(y)ψD(x,y)=ψ(x)ψ(y)其中
ψ
H
\psi^{H}
ψH是度量图像沿列方向的变化,
ψ
V
\psi^{V}
ψV是度量图像沿行方向的变化,
ψ
D
\psi^{D}
ψD是度量图像沿对角线方向的变化,这里首先给出二维尺度函数和二维小波函数公式:
φ
j
,
m
,
n
(
x
,
y
)
=
2
j
/
2
φ
(
2
j
x
−
m
,
2
j
y
−
n
)
\varphi_{j, m, n}(x, y)=2^{j / 2} \varphi\left(2^{j} x-m, 2^{j} y-n\right)
φj,m,n(x,y)=2j/2φ(2jx−m,2jy−n)
ψ
j
,
m
,
n
i
(
x
,
y
)
=
2
j
/
2
ψ
i
(
2
j
x
−
m
,
2
j
y
−
n
)
,
i
=
{
H
,
V
,
D
}
\psi_{j, m, n}^{i}(x, y)=2^{j / 2} \psi^{i}\left(2^{j} x-m, 2^{j} y-n\right), i=\{H, V, D\}
ψj,m,ni(x,y)=2j/2ψi(2jx−m,2jy−n),i={H,V,D}那么
M
×
N
M \times N
M×N图像的小波变换的正向变换为:
W
φ
(
j
0
,
m
,
n
)
=
1
M
N
∑
x
=
0
M
−
1
∑
y
=
0
N
−
1
f
(
x
,
y
)
φ
j
0
,
m
,
n
(
x
,
y
)
W_{\varphi}\left(j_{0}, m, n\right)=\frac{1}{\sqrt{M N}} \sum_{x=0}^{M-1} \sum_{y=0}^{N-1} f(x, y) \varphi_{j_{0}, m, n}(x, y)
Wφ(j0,m,n)=MN1x=0∑M−1y=0∑N−1f(x,y)φj0,m,n(x,y)
W
ψ
i
(
j
,
m
,
n
)
=
1
M
N
∑
x
=
0
M
−
1
∑
y
=
0
N
−
1
f
(
x
,
y
)
ψ
j
,
m
,
n
i
(
x
,
y
)
,
i
=
{
H
,
V
,
D
}
W_{\psi}^{i}(j, m, n)=\frac{1}{\sqrt{M N}} \sum_{x=0}^{M-1} \sum_{y=0}^{N-1} f(x, y) \psi_{j, m, n}^{i}(x, y), i=\{H, V, D\}
Wψi(j,m,n)=MN1x=0∑M−1y=0∑N−1f(x,y)ψj,m,ni(x,y),i={H,V,D}反向变换为
f
(
x
,
y
)
=
1
M
N
∑
m
∑
n
W
φ
(
j
0
,
m
,
n
)
φ
j
0
,
m
,
n
(
x
,
y
)
+
1
M
N
∑
i
=
H
,
V
∑
j
=
j
0
∞
∑
m
∑
n
W
ψ
i
(
j
,
m
,
n
)
ψ
j
,
m
,
n
i
(
x
,
y
)
\begin{aligned} f(x, y)=& \frac{1}{\sqrt{M N}} \sum_{m} \sum_{n} W_{\varphi}\left(j_{0}, m, n\right) \varphi_{j_{0}, m, n}(x, y)+\\ & \frac{1}{\sqrt{M N}} \sum_{i=H, V} \sum_{j=j_{0}}^{\infty} \sum_{m} \sum_{n} W_{\psi}^{i}(j, m, n) \psi_{j, m, n}^{i}(x, y) \end{aligned}
f(x,y)=MN1m∑n∑Wφ(j0,m,n)φj0,m,n(x,y)+MN1i=H,V∑j=j0∑∞m∑n∑Wψi(j,m,n)ψj,m,ni(x,y)这几个求和符号一叠加就知道二维离散小波变换计算量肯定不小,因此在实际操作中采用的更多是二维快速小波变换,其原理和上面介绍的一维快速小波变换一致,先卷积,然后下采样:这里需要注意的是:
(1)卷积是先按列进行,然后再按行进行
(2)因为是以2为基的下采样,因此会导致经过小波变换后的图像分辨率以2为因子下降,因此小波变换后输出的图像如下所示:
原始图像:
J
=
1
J=1
J=1时的小波变换:
J
=
2
J=2
J=2时的小波变换:
J
=
3
J=3
J=3时的小波变换:
这篇博客主要按照《数字图像处理》一书中的思路循序渐进地推导了小波离散变换以及将其应用到图像上,如果想知道如何利用OpenCV和FFWT库实现上面的图像小波变换,以及如果利用小波变换对图像进行降噪,请参考:
那么这个篇博客就先到此为止,欢迎交流~
此外,这里我写一个各种算法的总结目录图像降噪算法——图像降噪算法总结,对图像降噪算法感兴趣的同学欢迎参考