引导影像滤波器

在图像处理上，引导影像滤波器（Guided Image Filter）是一种能使影像平滑化的非线性滤波器。

与双边滤波器（Bilateral Filter）相同，这个影像滤波器同样能够在清楚保持影像边界的情况下，达到让影像平滑的效果。

但不同于双边滤波器，引导影像滤波器有两个优点：首先，双边滤波器有非常大的计算复杂度，但引导影像滤波器因为并未用到过于复杂的数学计算，有线性的计算复杂度。再来，双边滤波器因为数学模型的缘故，在某些时候会发生梯度反转（gradient reverse）的状况，出现影像失真；而在引导影像滤波器，因为这个滤波器在数学上以线性组合为基础出发，输出图片（Output Image）必与引导图片（Guidance Image）的梯度方向一致，并不会出现梯度反转的问题。

## 原理

为了达到将影像平滑化、即去除噪声的效果，首先定义输出的结果图片是输入图片减去噪声后的结果；同时，为了让输出的图片符合引导图片的影像边界，将输出图片定为引导图片的线性组合。

以下为引导影像滤波器的基础模型：

(1) $q_{i} = p_{i} - n_{i}$

(2) $q_{i} = aI_{i} + b$

在上述公式中，$q_{i}$是第i个输出的像素，$p_{i}$是第i个输入的像素，$n_{i}$是第i个输入像素的噪声成分，$I_{i}$是第i个引导图片的像素，$a, b$则是用来衡量输入权重的参数。

定义为线性组合（Linear Combination）的原因在于，一物件的边界与其梯度（Gradient）相关，而在线性组合的定义下，输出图片之梯度必与引导图片之梯度成对比（微分时高幂次系数保留而常数项则被去除），故可以达到保留梯度的效果、保留影像边界的目的。

为了导出上述线性组合的参数，将(1)及(2)相减得到公式(3)；同时，定义一个代价方程式(cost function)(4)：

(3) $n_{i} = p_{i} - aI_{i} - b$

(4) $E(a_{k},b_{k})=\sum_{i{\epsilon}{\omega}_{k}}^{}((a_{k}I_{i} + b_{k} - p{i})^{2} + {\epsilon}a_{k}^{2})$

在上式中， $\epsilon$ 是一用来惩罚（penalize）过大的 $a_{k}$ 的参数， $\omega_{k}$ 是以第 $k$ 个像素为中心点的窗格（window）。

在这个方程式中可以看到，希望同时让最终的输出图片做到让噪声减少以及让引导图片在输出图片的影响减小（引导图片的系数项）两件事，遂定义每个像素噪声和系数项的平方总合为最后须付出的价值项（cost）。并且，基于让价值项最小化的原则，可以将(4)以线性回归（linear regression）的方法找出它的线性模型，从而求得、使得出它的价值方程式有最小解的到以下两参数 $a_{k}$ 和 $b_{k}$：

(5) $a_{k} = \frac{\frac{1}{\omega}\sum_{i\epsilon\omega_{k}}I_{i}p_{i} - \mu_{k}\bar{p_{k}}}{\sigma^{2}_{k}+\epsilon}$

(6) $b_{k} = \bar{p_{k}} - a_{k}\mu_{k}$

在这里， $\mu_{k}$ 和 $\sigma^{2}_{k}$ 分别是引导图片 $I$ 在窗格 $\omega_{k}$ 的平均数（mean）和标准差（variance），而 $\bar{p}_{k} = \frac{1}{\left|\omega\right|}\sum_{i\epsilon\omega_{k}}p_{i}$ 是在窗格 $\omega_{i}$ 中像素的平均值；这两项系数，换句话说，即是一以输入图片为考虑计算权重之平均滤波器（weighted mean）。

## 算法

依据上式，可以列出此滤波器之算法：

Algorithm 1. 引导图片滤波器

输入：输入图片 $p$，引导图片 $I$，窗格半径 $r$，修正项 $\epsilon$

输出：输出图片 $q$

第一部分

```
<math>mean_{I}</math> = <math>f_{mean}(I)</math>
<math>mean_{p}</math> = <math>f_{mean}(p)</math>
<math>corr_{I}</math> = <math>f_{mean}(I.*I)</math>
<math>corr_{Ip}</math> = <math>f_{mean}(I.*p)</math>
```

第二部分

```
<math>var_{I}</math> = <math>corr_{I} - mean_{I.} * mean_{I}</math>
<math>cov_{Ip}</math> = <math>corr_{Ip} - mean_{I.} * mean_{p}</math>
```

第三部分

```
<math>a</math> = <math>cov_{Ip}./(var_{I} + \epsilon)</math>
<math>b</math> = <math>mean_{p} - a. * mean_{I}</math>
```

第四部分

```
<math>mean_{a}</math> = <math>f_{maean}(a)</math>
<math>mean_{b}</math> = <math>f_{maean}(b)</math>
```

第五部分

```
<math>q</math> = <math>mean_{a.} * I + mean_{b}</math>
```

/*$f_{mean}$ 是一个有线性计算复杂度的平均滤波器（mean filter）*/

## 特性

- 边界保留过滤 (Edge-Preserving Filtering)

引导影像滤波器保留边界的特性，其实也可以被理解为是保留梯度的特性。由下图可以看到，可以将一张图分为细节图层和基底图层两层，基底图层的能量并无小振幅的升降，只有大振幅诸入梯度的能量升降；而细节图层，只有噪声式的小振幅能量升降。而引导影像滤波器所作的，其实就是将细节层和基底层分离并保留基底层，也就是保留梯度而去除噪声，达到平滑效果。

具体而言，可以通过引导影像滤波器的参数$\epsilon$定义什么是“平坦区块(patch)”或“高变化区块”。若一个区块的变异数(variance)远低于参数$\epsilon$，其通过滤波器后将被平滑；反之，变异数远高于$\epsilon$的区块将被视为边界而被保留。双边滤波器中的范围方差(range variance)参数$\sigma_r^2$的功能和引导影像滤波器的$\epsilon$相似。它们都定义了怎么样的区块应该被平滑，而怎样的区块应该被保留。

- 梯度保留过滤 (Gradient-Preserving Filtering)

使用双边滤波器过滤图片时，经常会在边界处出现梯度翻转伪像。这是因为像素值在这些地方变化地很剧烈。这些伪像通常难以被避免，因为不论是任何图片经常都会包含边界。

引导影像滤波器在避免梯度反转方面表现地较佳。此外，在某些情况下，甚至可以确保必定不会发生梯度反转的现象。

- 结构转移过滤 (Structure-Transferring Filtering)

由于局部线性模型$q = aI + b$的线性组合特性，这让引导影像滤波器拥有可以将引导图像$I$的结构转换至算法输出$q$。这个特性使得一些特殊的滤波应用成为可能，如：feathering、matting以及dehazing等。

## 延伸功能

由引导图片滤波器的特性，可以延伸出除了原先的平滑化外的几项功能

### 细节加强

当一影像图同时为输出图片和引导图片时，可知最终得到的会是以该图片的边界为依据的基底层和细节层；因此，若要加强依影像之细节，可以将细节层的能量放大n倍后再次叠加回基底层，以达到增强细节的效果。

### 深度图修整

无论是利用光场（light field）技术或是焦点合成（focal-stack）所制作的深度图（depth map），在出制作完成时往往都会有一些坑洞（holo）；而这时若使用引导影像滤波器，以原始影像为引导图片、以深度图为输入图片，便可得到一完整、无坑洞的深度图。

## 实作

- 官方MATLAB中实作了引导影像滤波器
- 官方OpenCV中实作了引导影像滤波器

## 参考文献

- Computer Vision -- ECCV 2010: 11th European Conference on Computer ..., 第 1 篇