1. 概述
导读:滤波器是图像处理中常用的算子,具有保边属性的滤波器在某场景下是极具使用价值的。这篇文章提出了一种保边滤波算法,它采用多向窗口设计,在滤波器的中心采用多个窗口计算值滤波值,之后argmin的形式对输出的值进行组合,从而得到最后的滤波结果。文章的方法简洁直接,可以在现有的滤波器基础上进行修改得到,具有良好的移植迁移特性。而且并不需要针对性设计额外的超参数,使得具良好的保边属性鲁棒性强。
这篇文章主要关注的3种类型的图像边界情况见下图所示:
上面图像边界中
(
x
,
y
)
(x,y)
(x,y)处的值表示为
g
(
x
,
y
)
g(x,y)
g(x,y),那么是存在如下的关系的:
g
(
x
+
ϵ
,
y
)
≠
g
(
x
−
ϵ
,
y
)
g(x+\epsilon,y)\neq g(x-\epsilon,y)
g(x+ϵ,y)=g(x−ϵ,y)
也就是在边界的两边图像的取值是不一样的,同样的对这个不可导点取导数在一般情况也是不一样的。
g
’
(
x
+
ϵ
,
y
)
≠
g
’
(
x
−
ϵ
,
y
)
g^{’}(x+\epsilon,y)\neq g^{’}(x-\epsilon,y)
g’(x+ϵ,y)=g’(x−ϵ,y)
文章中通过对两边的取值进行泰勒展开,得到:
g
(
x
−
2
ϵ
,
y
)
≈
g
(
x
−
ϵ
,
y
)
+
g
’
(
x
+
ϵ
,
y
)
(
−
ϵ
)
g(x-2\epsilon,y)\approx g(x-\epsilon,y)+g^{’}(x+\epsilon,y)(-\epsilon)
g(x−2ϵ,y)≈g(x−ϵ,y)+g’(x+ϵ,y)(−ϵ)
也就是说边界上的最佳取值是需要在同边界一侧的。那么一种很自然的策略便是采用多方向性滤波,之后取argmin的线性组合形式能获得保边滤波的效果。
2. 滤波算法
这里定义
r
r
r为滤波器的半径,
θ
=
k
∗
π
2
,
k
∈
[
0
,
3
]
\theta=k*\frac{\pi}{2},k\in[0,3]
θ=k∗2π,k∈[0,3]是滤波器窗口与水平的夹角,
ρ
∈
{
0
,
r
}
\rho\in\{0,r\}
ρ∈{0,r}用于控制窗口的展开形状,那么根据上面两个窗口控制参数的不同取值,就可以得到8个不同的窗口,也即是下图所示的8个情况:
其中,上下左右4个半窗它的滤波参数可以描述为:
w
i
U
,
w
i
B
,
w
i
L
,
w
i
R
w_i^U,w_i^B,w_i^L,w_i^R
wiU,wiB,wiL,wiR,之后对应的四个角的窗口参数描述为:
w
i
S
W
,
w
i
S
E
,
w
i
N
E
,
w
i
N
W
w_i^{SW},w_i^{SE},w_i^{NE},w_i^{NW}
wiSW,wiSE,wiNE,wiNW。那么最后的计算过程可以简单描述为下面的算法流程:
3. 实验结果
传统类型的滤波器与按照文章思想改进之后滤波器的效果对比:
这篇文章给出的算法清晰明了,很容易进行移植。这里给出几个讲得不错的文章,以供参考:
- CVPR2019 Oral论文 #5176 Side Window Filtering介绍
- CVPR2019 Oral论文《Side Window Filtering》解读及算法 Python 实现
- Side Window Filtering 论文解读和C++实现