最近看了一些关于图像去噪的论文,从传统的基于统计的方法,到现在很火的利用深度学习来进行去噪的方法。今天分享一篇在去噪领域算是标杆的算法,文章名称为 Image Denoising by Sparse 3-D Transform-Domain CollaborativeFiltering。简称为BM3D。
该算法由两部分组成(step1和step2),每一步的处理有一些不同,但大体相同。
该算法基于这样一个假设,通过一组基础元素的线性组合,真实的信号能够被很好的近似的表示出来。
信号在转换域被稀疏的表示出来。通过保存信号在转换域内高幅度的转换系数(传递大部分真实信号的能量),将剩余的系数(主要包含噪声)舍弃,真实的信号就能被很好的估计
step1
grouping by block-matching
首先是对噪声图像进行操作。首先选定一个参考块
Z
x
R
Z_{xR}
ZxR,以其左上点的坐标值为中心,设置一个一定大小的窗口,利用以下公式计算出当前块与参考块的相似度
其中,
τ
2
D
h
t
\tau_{2D}^{ht}
τ2Dht是二维线性转换,常用的有二维离散余弦变换,
γ
′
\gamma^{'}
γ′为硬阈值函数,但是在代码中没有体现。
N
1
h
t
N^{ht}_1
N1ht为参考块的大小。
通过这个公式,计算出窗口内所有的图像块与参考块的
d
d
d,即相似性,将满足以下条件的图像块的坐标和图像块分别保存
τ
m
a
t
c
h
h
t
\tau_{match}^{ht}
τmatchht是阈值,在编写代码时,将各个图像块的相似度计算出来,满足以上条件的将其保存(图像块和坐标),然后进行排序,如果满足条件的图像块的数目多于我们所设置的块数,选择前n(设置的最大的块数)个相似度最大的块。否则将全部的块保存。
通过上面的步骤,找到了以一个图像块为参考,与其相似度比较大的块的集合,为一个三维的数组,用 Z S x R h t \textbf{Z}_{S^{ht}_{x_R}} ZSxRht表示,接下俩对其进行collaborativ filtering(协同滤波)。
collaborative filtering(协同滤波)
在该步骤中,是按位置进行操作,每一次都取出同一组同一位置的像素,组成一个数组,对其进行操作。
首先,对
Z
S
x
R
h
t
\textbf{Z}_{S^{ht}_{x_R}}
ZSxRht进行三维离散变换,之前在block-matching时,已经对图像块进行二维离散变换,我们将之前的计算结果保存,利用变换的可分性,取出group中相同位置、不同图像块中的像素,对其进行二维离散变换。通过以上操作,将三维离散变换
τ
3
D
h
t
\tau_{3D}^{ht}
τ3Dht转换为二维离散变换,提高计算效率。可参考二维离散变换的可分性 二维离散变换.,三维变换类似。
然后上面的结果进行硬阈值变换 γ ′ \gamma^{'} γ′,去掉较小的频率部分,赋值为0。在这里要记录这一组中非零元素的个数 N h a r x R N^{x_{R}}_{har} NharxR。
最后进行反变换
τ
3
D
h
t
−
1
{\tau_{3D}^{ht}}^{-1}
τ3Dht−1,将最后的结果赋值给原来的位置。
到此,得到的结果在文中被命名为Block-wise estimates。
Aggregation 聚合
通过之前的滤波,图像中的大部分噪声被滤除,接下来打算将滤波后的图像块恢复到原来的位置。因为组之间的图像块之间存在重叠相交的情况,即过完备。如何复原对去噪的结果也有很大的影响。
在存在相交的位置,采用权值平均的方法来进行聚合复原,权值通过如下函数进行设置。
简单分析一下权重这么设置的原因:其实我也不太清楚哈,不过这的确需要好好思考,先放在这吧
接下来,对图像进行初步去噪。
到此,step1完成
step2
step2 在block-matching 步骤与step1不同,是对第一步Basic estimates 和噪声图像都进行操作。
首先在Basic estimates中选择一个参考块,计算二维离散余弦变换,将噪声图中相对应位置的图像块也进行二维离散余弦变换,分别将其保存。
在Basic estimates 中,以参考块左上角坐标为中心,设置一个窗口,在这个窗口内按照下式找到与其相似的图像块,组成一个group。
S
x
R
w
i
e
S^{wie}_{x_R}
SxRwie是符合条件的坐标组成的数组,目的是在Basic estimates和噪声图中找到相应的图像块,组成两个group,分别用
Y
S
x
R
w
i
e
b
a
s
i
c
\textbf{Y}^{basic}_{S^{wie}_{x_R}}
YSxRwiebasic和
Z
S
x
R
w
i
e
\textbf{Z}_{S^{wie}_{x_R}}
ZSxRwie表示。
利用下式定义维纳收缩系数
τ
3
D
w
i
e
\tau_{3D}^{wie}
τ3Dwie为三维离散变换,
σ
\sigma
σ为噪声偏差。
再利用下式对
Z
S
x
R
w
i
e
\textbf{Z}_{S^{wie}_{x_R}}
ZSxRwie进行计算,得到每组的估计
同样,在该步骤中,是按位置进行操作,每一次都取出同一组同一位置的像素,组成一个数组,对其进行操作。
Aggregation 聚合
与step1同样的方式进行整合,得到最后的去噪图像
实验分析
我测试了一下这个算法的去噪效果。
从图中可以看出,这个方法的处理效果还是不错的,图像中物体细节的恢复很不错,但是一些细节被平滑掉。我之前用房屋的那个房子进行去噪,去噪后大部分细节全部丢失。