图像滤波问题描述
为了内容的完整性,首先对图像滤波进行简单的回顾。令
I
∈
R
h
×
w
×
c
I\in R^{h\times w\times c}
I∈Rh×w×c表示图像,是一个二维矩阵,
h
,
w
h,w
h,w分别表示图像的高度和宽度,
c
=
1
,
3
c=1,3
c=1,3分别表示灰度图像和彩色图像,
I
I
I中的每个元素
I
(
i
,
j
)
I(i,j)
I(i,j)称作一个像素。不失一般性,我们以
c
=
1
c=1
c=1即灰度图为例。本质上图像
I
I
I是一个定义二维网格点上的函数,也即
I
:
(
i
,
j
)
∈
R
2
→
I
(
i
,
j
)
∈
R
I:(i,j)\in R^{2} \rightarrow I(i,j)\in R
I:(i,j)∈R2→I(i,j)∈R。
令
f
:
I
∈
R
h
×
w
→
I
^
∈
R
h
×
w
f:I\in R^{h\times w}\rightarrow \hat{I}\in R^{h\times w}
f:I∈Rh×w→I^∈Rh×w表示滤波器。常见的滤波过程就是:计算每个像素
I
(
i
,
j
)
I(i,j)
I(i,j)经过滤波后的值
I
^
(
i
,
j
)
\hat{I}(i,j)
I^(i,j),都是通过加权像素
I
(
i
,
j
)
I(i,j)
I(i,j)的邻域像素值,如下公式所示:
(1)
I
^
(
i
,
j
)
=
f
∘
I
(
i
,
j
)
=
1
∑
w
(
i
′
,
j
′
)
∑
(
i
′
,
j
′
)
∈
N
w
(
i
′
,
j
′
)
I
(
i
′
,
j
′
)
\hat{I}(i,j)=f\circ I(i,j)=\frac{1}{\sum w(i',j')}\sum_{(i',j')\in N} w(i',j')I(i',j')\tag{1}
I^(i,j)=f∘I(i,j)=∑w(i′,j′)1(i′,j′)∈N∑w(i′,j′)I(i′,j′)(1)
其中
N
N
N表示像素
I
(
i
,
j
)
I(i,j)
I(i,j)的邻域(也称滤波器的窗口),注意这里的邻域关系仅仅是像素点在定义域的相邻关系,如图像上的8邻域等。
1. 空间(即图像定义域)相邻关系的滤波器
常见的滤波器,如高斯滤波器,均值滤波器等,都属于这一类滤波器。
如(1)式所示,当权重
w
(
i
′
,
j
′
)
=
1
n
w(i',j')=\frac{1}{n}
w(i′,j′)=n1其中
n
=
∣
N
∣
n=|N|
n=∣N∣表示邻域像素的个数, 这就均值滤波器。
当权重
w
(
i
′
,
j
′
)
=
1
2
π
σ
2
e
−
(
i
′
−
i
)
2
+
(
j
′
−
j
)
2
2
σ
2
w(i',j')=\frac{1}{2\pi\sigma^2}e^{-{\frac{(i'-i)^2+(j'-j)^2}{2\sigma^2}}}
w(i′,j′)=2πσ21e−2σ2(i′−i)2+(j′−j)2
就是通常的高斯滤波器。
注意这类滤波器,在进行图像滤波的时候仅仅考虑图像的定义域上的邻域关系(也即空间上的邻域关系)。这样通常会导致图像模糊,因为仅仅按图像定义域或空间上的相邻关系,会导致空间(或定义域)上相邻但是像素值相差巨大的像素参与滤波过程,如下图所示:按8邻域关系,计算点 A A A的高斯滤波或均值滤波时,空间相邻的像素点 B , C , D , E B,C,D,E B,C,D,E(注意它们的像素值(白)与 A A A点的像素值(黑)相差很大),会参与滤波公式(1)中的加权平均。很显然,滤波后会导致,在 A A A点附近的图像边缘会出现模糊。
下面就介绍双边滤波,能够在很大程度上避免这一种仅仅依靠图像定义域相邻引起的图像模糊。
2. 双边滤波器(bilateral filter)
如何将上图中的点 A A A和 B , C , D , E B,C,D,E B,C,D,E区分开来,使得(1)式中计算 A A A点的加权平均时, B , C , D , E B,C,D,E B,C,D,E贡献的权重为0(当然这是理想的情况),就成了关键。那么一个很自然的想法是,同时考虑像素点的像素值,这样将像素点投到高维空间,那么有可能 B , C , D , E B,C,D,E B,C,D,E将不再是 A A A的相邻点。因为在低维空间中不易区分的点,在高维空间中可能比较容易区分开来。这点类似SVM(支持向量机)中的核函数设置的思想。
同时统计像素点
A
A
A的坐标和像素值,这其实就是图像函数
I
:
(
i
,
j
)
→
I
(
i
,
j
)
∈
R
I:(i,j)\rightarrow I(i,j)\in R
I:(i,j)→I(i,j)∈R的graph, 记作
(2)
G
=
{
(
i
,
j
,
I
(
i
,
j
)
)
:
(
i
,
j
)
是
图
像
像
素
坐
标
}
G=\{(i,j,I(i,j)):(i,j)是图像像素坐标\}\tag{2}
G={(i,j,I(i,j)):(i,j)是图像像素坐标}(2)
它是一个二维流形(嵌入在三位欧式空间
R
3
R^3
R3中),其实就是一个曲面,显然在这个graph
G
G
G上,
B
,
C
,
D
,
E
B,C,D,E
B,C,D,E与
A
A
A不再是相邻点。但是在直接二维流形
G
G
G上寻找点的相邻点可能非常复杂,因为曲面的形状可能很不规则(曲率不为0),不像二维平面网格点
(
i
,
j
)
(i,j)
(i,j)那样容易寻找相邻点。
为了计算方便,退而求其次,把二维曲面 G G G嵌入在三维空间中考虑,利用三维欧式空间 R 3 R^3 R3的曲率为0,在三维网格点中寻找相邻点,这样就和在二维网格中种寻找相邻点一样方便。但是考虑到嵌入的 G G G实则是函数 I I I的图像graph,本质上是二维的,所以双边滤波仍按定义域寻找相邻点即可,但是要减弱这些相邻点中颜色差异较大的点对滤波贡献的权重。
可以看到,在把
G
G
G嵌入三维空间考虑时,
A
A
A点在对应
(
i
A
,
j
A
,
I
A
)
(i_A,j_A,I_A)
(iA,jA,IA)。以
D
D
D点为例,
D
D
D对应
(
i
D
,
j
D
,
I
D
)
(i_D,j_D,I_D)
(iD,jD,ID)。不妨以欧式范数为例,在三维空间中
A
,
D
A,D
A,D之间的距离为
(3)
d
(
A
,
D
)
=
(
i
D
−
i
A
)
2
+
(
j
D
−
j
A
)
2
+
(
I
D
−
I
A
)
2
=
1
+
1
+
(
I
D
−
I
A
)
2
d(A,D)=\sqrt{(i_D-i_A)^2+(j_D-j_A)^2+(I_D-I_A)^2}=\sqrt{1+1+(I_D-I_A)^2}\tag{3}
d(A,D)=(iD−iA)2+(jD−jA)2+(ID−IA)2=1+1+(ID−IA)2(3)
则如上面(3)式所示,那么当
A
,
D
A,D
A,D的像素值之差
∣
I
D
−
I
A
∣
|I_D-I_A|
∣ID−IA∣很大时,那么在
G
G
G中
d
(
A
,
D
)
d(A,D)
d(A,D)距离就很远。
而双边滤波正是通过,考虑这种距离来弱化
D
D
D对
A
A
A的影响,这点可以从下面双边滤波的公式中,得到体现
(4)
I
^
A
=
1
∑
w
(
q
,
A
)
∑
q
∈
N
w
(
q
,
A
)
I
q
\hat{I}_A=\frac{1}{\sum w(q,A)}\sum_{q\in N}w(q,A)I_q\tag{4}
I^A=∑w(q,A)1q∈N∑w(q,A)Iq(4)
其中,
N
N
N是点
A
A
A的邻域,
w
(
q
,
A
)
=
e
−
(
i
q
−
i
A
)
2
+
(
j
q
−
j
A
)
2
2
σ
s
2
−
(
I
q
−
I
A
)
2
2
σ
r
2
w(q,A)=e^{-\frac{(i_q-i_A)^2+(j_q-j_A)^2}{2\sigma_{s}^{2}}-\frac{(I_q-I_A)^2}{2\sigma_{r}^2}}
w(q,A)=e−2σs2(iq−iA)2+(jq−jA)2−2σr2(Iq−IA)2
显然,当 q , A q,A q,A之间的像素值相差很大时, w ( q , A ) w(q,A) w(q,A)就会变得很小,从而达到了弱化 q q q点对 A A A点的滤波值的影响,易见上图中的 B , C , D , E B,C,D,E B,C,D,E与 A A A的距离很大(在 R 3 R^3 R3中考虑它们之间的距离时)。所以滤波时, B , C , D , E B,C,D,E B,C,D,E对 A A A的影响就大大减弱,从而大大减轻滤波后边界模糊的现象,达到了保边滤波的效果。
3. 如何快速实现双边滤波
即使双边滤波有很好的保边效果,但是当图像的尺寸以及滤波器的窗口尺寸很大时,双边滤波的速度就可能很慢。双边滤波这不像通常的高斯滤波和均值率波等,双边滤波(4)式中的权重系数 w w w是与图像的像素值有关的,因而不能像高斯滤波或者均值滤波那样有固定的模板通过卷积快速实现。后面系列,会介绍快速实现近似双边滤波的相关文章[1]以及在双边滤波在深度学习中的应用。。。。。
[1]: Fast high-dimensional filtering using the permutohedral lattice.