【图像处理】 -036 Guided Image Filter
1 引出
对于输入图像
p
p
p,由于其含有噪声
n
n
n,需要将噪声滤除。朴素的想法是通过低通滤波器,例如boxfilter或高斯滤波等对输入图像进行滤波,得到输出图像
q
q
q,所以:
(1)
q
i
=
p
i
−
n
i
q_{i} = p_{i}-n_{i} \tag{1}
qi=pi−ni(1)
滤波器的输出等于输入减去噪声。由于对于低通滤波,通常采用的是在一个中心为
w
w
w的窗内各个像素的加权平均。例如,对于均值滤波,图像
q
q
q的第
i
i
i个像素由输入图像
p
p
p中的以第
i
i
i个像素为中心的一个窗口
w
w
w的所有像素的平均而求得,
(2)
q
i
=
∑
j
∈
w
i
W
i
j
⋅
p
j
q_{i}=\sum_{j \in w_{i}}W_{ij}·p_{j} \tag{2}
qi=j∈wi∑Wij⋅pj(2)
其中,
W
i
,
j
=
1
n
W_{i,j}=\frac{1}{n}
Wi,j=n1,
n
n
n是窗口
w
w
w中的像素个数。在窗口内部各个像素的权值相同。而高斯滤波中,
W
i
j
W_{ij}
Wij符合二维高斯分布,结果导致离像素
i
i
i近的像素将具有更高的权重,反之离像素
i
i
i较远的像素则具有更小的权重。
无论是简单平滑,还是高斯平滑,它们都有一个共同的弱点,即它们都属于各向同性滤波。我们都知道,一幅自然的图像可以被看成是有(过渡平缓的,也就是梯度较小)区域和(过渡尖锐的,也就是梯度较大)边缘(也包括图像的纹理、细节等)共同组成的。噪声是影响图像质量的不利因素,我们希望将其滤除。噪声的特点通常是以其为中心的各个方向上梯度都较大而且相差不多。边缘则不同,边缘相比于区域也会出现梯度的越变,但是边缘只有在其法向方向上才会出现较大的梯度,而在切向方向上梯度较小。
因此,对于各向同性滤波(例如简单平滑或高斯平滑)而言,它们对待噪声和边缘信息都采取一直的态度。结果,噪声被磨平的同时,图像中具有重要地位的边缘、纹理和细节也同时被抹平了。
2 原理
导向滤波框架中,除了输入图像
p
p
p之外,输出图像
q
q
q之外,还需要一幅导引图
I
I
I。导向滤波的输出被表示为一个窗口内的加权:
(3)
q
i
=
∑
i
W
i
j
(
I
)
p
j
q_{i}=\sum_{i}W_{ij}(I)p_{j} \tag{3}
qi=i∑Wij(I)pj(3)
W
i
j
W_{ij}
Wij为加权权值,是导引图
I
I
I的函数,与输入图像
p
p
p无关。
i
j
ij
ij为像素坐标。
对于双边滤波器,其权值计算公式如下:
(4)
W
i
j
b
f
(
I
)
=
1
K
i
exp
(
−
∣
x
i
−
x
j
∣
2
σ
s
2
)
exp
(
−
∣
I
i
−
I
j
∣
2
σ
r
2
)
W_{ij}^{bf}(I)=\frac{1}{K_{i}}\exp(-\frac{|\bold{x}_i-\bold{x}_j|^2}{\sigma_{s}^2})\exp(-\frac{|\bold{I}_i-\bold{I}_j|^2}{\sigma_{r}^2}) \tag{4}
Wijbf(I)=Ki1exp(−σs2∣xi−xj∣2)exp(−σr2∣Ii−Ij∣2)(4)
可以看出,双边滤波器的权值是空域和颜色域内的两个高斯滤波核相乘之后的结果。所以对于边缘区域,由于颜色差异较大,导致颜色域高斯滤波器输出很小,
W
i
j
W_{ij}
Wij被抑制,滤波器对边缘的平滑作用被抑制,很好的保留了边缘。
导向滤波的一个关键假设是:在局部区域内,输出
q
q
q与导引图
I
I
I之间满足线性关系,即
(5)
q
i
=
a
k
I
i
+
b
k
,
∀
i
∈
w
k
q_{i}=a_{k}I_{i}+b_{k}, \forall i \in w_{k} \tag{5}
qi=akIi+bk,∀i∈wk(5)
其中,
(
a
k
,
b
k
)
(a_k,b_k)
(ak,bk)是线性关系的系数,在局部区域
w
k
w_k
wk内视为常数,
w
k
w_k
wk视为半径为
r
r
r的正方形区域。这个局部线性模型,保证了只有当导引图
I
I
I中有边缘区域时,输出图像
q
q
q中才会有边缘,因为
∇
q
=
a
∇
I
\nabla q=a\nabla I
∇q=a∇I.
导引图像与
q
q
q之间存在线性关系,这样设定是因为我们希望导引图像提供的是信息主要用于指示哪些是边缘哪些是区域,所以在滤波时,如果导引图告诉我们这里是区域,那么就将其磨平。如果导引图告诉我们这里是边缘,这在最终的滤波结果里就要设法保留这些边缘信息。
这里借用了一幅左飞老大的图。
现在已知输入
p
p
p和导引图
I
I
I,要求输出图像
q
q
q,如果能够求得I与q之间的线性关系
q
=
a
I
+
b
q=aI+b
q=aI+b,那么可以通过这个线性关系求出输出q。由于
q
i
=
p
i
−
n
i
q_{i} = p_{i}-n_{i}
qi=pi−ni,所以,可以构造目标函数为
min
∣
∣
n
∣
∣
\min||n||
min∣∣n∣∣,即优化使得噪声最小,
(6)
min
∣
∣
n
∣
∣
  
⟺
  
min
∣
∣
n
∣
∣
2
=
min
∑
i
∈
w
k
(
q
i
−
p
i
)
\min||n|| \iff \min||n||^2 = \min\sum_{i \in w_k}(q_i-p_i) \tag{6}
min∣∣n∣∣⟺min∣∣n∣∣2=mini∈wk∑(qi−pi)(6)
于是有
KaTeX parse error: Expected 'EOF', got '\argmin' at position 2: \̲a̲r̲g̲m̲i̲n̲ ̲\sum_{i \in w_k…
从而将问题转化为最小二乘问题。由于普通最小而成问题会引起一些麻烦,所以要适当的引入惩罚项,采用正则化的手段。作者在处理这里时所采用的方法借鉴了从普通线性回归改进到岭回归时所采用的方法(正则化、岭回归、或者最小二乘法),即求解下面这个最优化(最小化)目标所对应的参数a和b。
(8)
E
(
a
k
,
b
k
)
=
∑
i
∈
w
k
[
(
a
k
I
i
+
b
k
−
p
i
)
2
+
ϵ
a
k
2
]
E(a_k,b_k)=\sum_{i \in w_k}[(a_kI_i+b_k-p_i)^2+\epsilon a_k^2] \tag{8}
E(ak,bk)=i∈wk∑[(akIi+bk−pi)2+ϵak2](8)
其中的
ϵ
\epsilon
ϵ是正则化项,用于防止
a
k
a_k
ak取值太大。
求解式8之后,可得:
(9)
a
k
=
1
∣
w
∣
∑
i
∈
w
k
I
i
p
i
−
μ
k
p
‾
k
σ
k
2
+
ϵ
a_k=\frac{\frac{1}{|w|}\sum_{i \in w_k}I_i p_i-\mu_k \overline{p}_k}{\sigma_k^2+\epsilon} \tag{9}
ak=σk2+ϵ∣w∣1∑i∈wkIipi−μkpk(9)
(10)
b
k
=
p
‾
k
−
a
k
μ
k
b_k=\overline{p}_k-a_k \mu_k \tag{10}
bk=pk−akμk(10)
其中,
μ
k
\mu _k
μk是导引图
I
I
I中窗口
w
k
w_k
wk中的平均值,
σ
2
\sigma^2
σ2是窗口
w
k
w_k
wk中的方差,
∣
w
∣
|w|
∣w∣是窗口
w
k
w_k
wk中像素的数量,
p
‾
k
\overline{p}_k
pk是输入图像
p
p
p在窗口
w
k
w_k
wk中的均值,
(11)
p
‾
k
=
1
∣
w
∣
∑
i
∈
W
k
p
i
\overline{p}_k=\frac{1}{|w|}\sum_{i \in W_k}p_i \tag{11}
pk=∣w∣1i∈Wk∑pi(11)
在使用最小二乘计算线性系数时,由于一个像素会被多个窗包含,所以,每个像素都由多个线性函数所描述,因此,如之前所说,要具体求某一点的输出值是,只需要将所有包含该点的线性函数平均即可。
(12)
q
i
=
1
∣
w
∣
∑
k
:
i
∈
w
k
(
a
k
I
i
+
b
k
)
=
a
i
‾
I
i
+
b
i
‾
q_i=\frac{1}{|w|}\sum_{k:i\in w_k}(a_k I_i + b_k)=\overline{a_i}I_i+\overline{b_i} \tag{12}
qi=∣w∣1k:i∈wk∑(akIi+bk)=aiIi+bi(12)
其中,
a
i
‾
=
1
∣
w
∣
∑
k
∈
w
i
a
k
\overline{a_i}=\frac{1}{|w|}\sum_{k \in w_i}a_k
ai=∣w∣1∑k∈wiak,
b
i
‾
=
1
∣
w
∣
∑
k
∈
w
i
b
k
\overline{b_i}=\frac{1}{|w|}\sum_{k \in w_i}b_k
bi=∣w∣1∑k∈wibk.
导向滤波的算法流程如下:
fmean是一个窗口半径为r的均值滤波器,对应的窗口大小为2r+1,corr为相关,var为方差,cov为协方差。
Algorithm Guided Filter
Input:filtering input image p, guidance image I, radius r, regularization e
Output:filtering output q
1: mean_I=fmean(I)
mean_p=fmean(p)
corr_I=fmean(I.*I)
corr_IP=fmean(I.*p)
2:var_I=corr_I-mean_I.*mean_I
cov_IP=corr_IP-mean_I.*mean_P
3:a=cov_IP./(var_I+e)
b=mean_p-a.*mean_I
4:mean_a=fmean(a)
mean_b=fmean(b)
5:q=mean_a.*I+mean_b
3 opencv中的实现
在opencv中又自带的guidedFilter函数,不过是在ximgproc模块中,这个模块默认是不安装的,需要自己编译contrib包来使用。