双边滤波器

在图像处理上，双边滤波器（英语：Bilateral Filter）为使影像平滑化的非线性滤波器。

这个想法由C. Tomasi在1998年提出。

和传统的影像平滑化算法不同，双边滤波器除了使用像素之间几何上的靠近程度之外，还多考虑了像素之间的光度/色彩差异。

使得双边滤波器能够有效的将影像上的噪声去除，同时保存影像上的边缘资讯。

在实作上，双边滤波器和非等向性扩散及Adaptive Smoothing不同，它是非迭代、区域性的。

能够较以上两个方法简化。

## 原理

### 定义

双边滤波器定义如下：

$$\vec{h}(\vec{x}) = k^{-1}(\vec{x}) \iint^{\infty}_{\infty} \vec{f}(\vec{\xi})\, c(\vec{\xi},\vec{x})\, s(\vec{f}(\vec{\xi}),\vec{f}(\vec{x})) \, d\vec{\xi}$$

其中$\vec{h}$为输出影像，$\vec{f}$为输入影像，函数的值代表给定像素上的色彩资讯。

我们将输入影像$\vec{f}$和输出影像$\vec{h}$写成向量的原因是，操作的影像不限定是只有单一通道的灰阶影像，他们也可以是多通道的彩色影像。

式子中的$\vec{x}$代表影像中的任意一点，而$\vec{\xi}$代表在$\vec{x}$邻近的点。

而$k$为归一化函数：

$$k(\vec{x}) = \iint^{\infty}_{\infty} c(\vec{\xi},\vec{x})\, s(\vec{f}(\vec{\xi}),\vec{f}(\vec{x}))\, d\vec{\xi}$$

双边滤波器的目的是，对于影像中的每一个点，都要对邻近的所有点进行加权平均，以达到平滑化的目的。

而对此，双边滤波器在$\vec{x}$邻近的点$\vec{\xi}$采取了不同的权重。

策略包含了两个核心函数$c(\vec{\xi},\vec{x})$和$s(\vec{f}(\vec{\xi}),\vec{f}(\vec{x}))$。

这两个式子分别代表了$\vec{x}$和$\vec{\xi}$在空间几何关系上的差异和光度/色彩差异上的差异。

以下将针对这两个核心函数进行说明。

### 空间几何关系

为了使影像平滑化，考虑像素之间的空间几何分布情形，我们可以把低通滤波器写成以下形式：

$$\vec{h}(\vec{x}) = k^{-1}_{d}(\vec{x}) \iint^{\infty}_{\infty} \vec{f}(\vec{\xi})\, c(\vec{\xi},\vec{x})\, d\vec{\xi}$$

其中$c(\vec{\xi},\vec{x})$为描述影像中任何一点$\vec{x}$和邻近的$\xi$之间几何距离的函数。

而$k^{-1}_{d}(\vec{x})$为归一化函数，如果这个低通滤波器需要保存影像的直流成分，我们可以把$k_d$写成：

$$k_d(\vec{x}) = \iint^{\infty}_{\infty} c(\vec{\xi},\vec{x})\, d\vec{\xi}$$

如果这个滤波器是Shift-invariant的，那么c可以简化为$\xi-\vec{x}$的函数，使得$k_d$为一个和$\vec{x}$无关的常数。

c在选择上一个很好的例子是高斯函数（请见高斯模糊），它在影像平滑上经常被使用。

### 光度/色彩差异

接着我们考虑像素之间的光度/色彩差异，同样可以写出对此的滤波器函数：

$$h(\vec{x}) = k^{-1}_{r}(\vec{x}) \iint^{\infty}_{\infty} \vec{f}(\vec{\xi})\, s(\vec{f}(\vec{\xi}),\vec{f}(\vec{x}))\, d\vec{\xi}$$

和空间关系的滤波器不同的是，光度/色彩差异函数$s(\vec{f}(\vec{\xi}),\vec{f}(\vec{x}))$描述的是$\vec{\xi}$和$\vec{x}$之间的光度差异。

因此差异函数$s(\vec{f}(\vec{\xi}),\vec{f}(\vec{x}))$的输入为影像在$\vec{\xi}$和$\vec{x}$两点上面的内容，也就是这两点对于影像函数$\vec{f}$的输出。

对于灰阶影像，差异函数s的内容很单纯，举例来说，我们可以直接对两点上的灰阶亮度值做相减；而对于彩色影像而言，我们可以使用Lab色彩空间来求得两点之间的光度差异。

而归一化函数可以写为：

$$k_r(\vec{x}) = \iint^{\infty}_{\infty} s(\vec{f}(\vec{\xi}),\vec{f}(\vec{x}))\, d\vec{\xi}$$

和空间几何关系的式子不同，这边的归一化函数会和影像内容有关。如果差异函数s只和$\vec{f}(\vec{\xi})-\vec{f}(\vec{x})$有关的话，我们称s为未偏差的。

对光度/色彩进行低通滤波本身并不具有太大的意义，因为他只不过是将影像直方图中聚集的部分集合在一起，也就是说让影像直方图中相似的色彩更向区域的平均靠近，色彩在空间中的分布情形并不会有任何的影响。

然而，如果同时考虑对空间几何的滤波行为$c(\vec{\xi},\vec{x})$。

$s(\vec{f}(\vec{\xi}),\vec{f}(\vec{x}))$所代表的意义便成为，将影像平滑化的范围限制在光度/色彩差异较小的部分，如此便能够达到边缘保存的目的。

### 离散形式

一般来说，在图像处理上，影像的像素在空间上的分布是离散的，光度/色彩的储存形式也是离散的。因此，双边滤波器常用的为其离散形式：

$$BF[I]_\vec{p} = \frac{1}{W_\vec{p}} \sum_{\vec{q}\in S} G_{\sigma_S} (\left \| \vec{p}-\vec{q} \right \|) G_{\sigma_r} (\left \| I_\vec{p} - I_\vec{q} \right \|) I_\vec{q}$$

## 限制

双边滤波器由于核心函数会随空间不同而变化，它是非线性滤波器，因此在实作上无法使用傅立叶变换来帮助运算。

如果使用暴力算法需要很大的时间来进行运算，在不同应用上有近似的快速算法可以大幅加快运算速度。

## 应用

双边滤波器可以应用在影像降噪、色调映射、图像重照明和材质编辑。

### 色调映射上的应用

色调映射是在有限动态范围媒介上近似显示高动态范围图像的一项7图形学技术。打印结果、CRT 或者 LCD 显示器以及投影仪等都只有有限的动态范围。

本质上来讲，色调映射是要解决的问题是进行大幅度的对比度衰减将场景亮度变换到可以显示的范围，同时要保持图像细节与颜色等对于表现原始场景非常重要的信息。

因此，双边滤波器可以借由对亮度相似区域进行模糊化之后，将高动态范围图像的梯度图像分割成亮度相似区和亮度差异较大的部分，借由改变两者的权重，而将高动态范围图像映射成可显示的有限动态范围。

## 参考文献

- Carlo Tomasi, Roberto Manduchi, Bilateral Filtering for Gray and Color Images (shorter HTML version), proceedings of the ICCV 1998
- Fredo Durand, Julie Dorsey, Fast Bilateral Filtering for the Display of High-Dynamic-Range Images ( HTML ), SIGGRAPH 2002
- Sylvain Paris, Pierre Kornprobst, Jack Tumblin, Frédo Durand, A Gentle Introduction to Bilateral Filtering and its Applications , SIGGRAPH 2008 class