前言
导向滤波学习,也可以说是论文笔记了。
各向同性(isotropy)滤波与各向异性(anisotropy)滤波
对图像来说,各向同性滤波就是说滤波器在各方向上的梯度变化是相同的,对各个方向一视同仁的进行滤波。各向异性滤波是指滤波器会对各方向进行区别对待,有选择的进行滤波。
高斯滤波属于各向同性滤波,根据二维高斯的图像就可以看出。
双边滤波属于各向异性滤波,因为它会根据图像梯度变化情况改变滤波器形状。
导向滤波(Guided Filter)
导向滤波也属于各向异性滤波,也可以作为一种保边(Edge-preserving)滤波算法。
Derived from a local linear model, the guided filter generates the filtering output by considering the content of a guidance image, which can be the input image itself or another different image.
We demonstrate that the guided filter is both effective and efficient in a great variety of computer vision and computer graphics applications including noise reduction, detail smoothing/enhancement, HDR compression, image matting/feathering, haze removal, and joint upsampling.
导向滤波通过考虑引导图像的内容来生成滤波输出,引导图像可以是输入图像本身或另一个不同的图像。[1]中提到了双边滤波相比于导向滤波的两点缺陷,“have unwanted gradient reversal artifacts near edges”和难以进行维持精度的快速计算,这也是导向滤波的优势。
文中还提到了联合双边滤波器(joint bilateral filter),它也是利用了引导图来改善双边滤波权值不稳定的问题(双边滤波边缘出现梯度翻转现象的原因)。
文中先定义了一个通用的平移不变的线性滤波过程,包括一个引导图像 $\textit{I}$、一个输入图像 $\textit{p}$ 和一个输出图像 $\textit{q}$。
这里 $i$ 和 $j$ 表示的是两个像素,而不是像素的横纵坐标!像素 $i$ 的位置坐标表示为 $\mathbb{x}_i$,$q_i$ 表示输出图的像素 $i$ 处的值,滤波核 $W_{i j}(I)$ 是关于导向图和输入图的函数,当然也与 $i$ 有关。
联合双边滤波器符合上述的线性滤波过程,其滤波核 $W^{\mathrm{bf}}$ 如下:
其中,$K_i$是归一化参数,用于保证$\sum_j W_{i j}^{\mathrm{bf}} = 1$,$\sigma_{\mathrm{s}}$ 和 $\sigma_{\mathrm{r}}$ 分别代表空域和值域(原文说值可以是 intensity 或 color)的对应参数,分别用于调整空域和值域的滤波程度(原文为similarity,我理解就和高斯中的标准差类似)。原文说当导向图和输入图相同时,联合双边滤波就退化为双边滤波,我理解里的双边滤波应该是要加两个2倍在分母的,但是效果应该一样。
下面简单讨论下导向滤波的推导,主要还是学习如何计算。 文中首先假设导向滤波是一个导向图 $I$ 和 输出图 $q$ 间的局部线性模型。令 $w_k$ 是 $I$ 中的一个正方形窗口,其中心为像素 $k$,输出 $q$ 为 $I$ 在 $w_k$ 上的一个线性变换:
这个稍微想一下就可以理解,假设 $w_k$ 是一个在 $I$ 上移动的九宫格,由于 $q$、$I$ 和 $p$都是尺寸一致的,那么每次移动产生的九个线性变化值就是 $q$ 对应 $I$ 位置上的值。当然这会引出一个问题,即同一个像素可能会被不同的窗口计算出多个值,如何确定最终输出的 $q_i$ 呢?文中提出了一种简单的处理办法,即取所有这些输出的平均。
$a_k$ 和 $b_k$ 是窗口 $k$ 中的常量线性系数,顺便一提 $w_k$ 的半径定义为 $r$。 关于为何使用局部线性模型,是因为它确保了输出和导向图的边缘一致,具体可以看原文。
为确定上述的两个线性系数,原文将输出建模为输入减去不想要的内容(噪声、纹理等):
然后通过最小化输入和输出的差异来实现,具体来说,最小化如下函数(cost function in $w_k$):
其中 $\epsilon$ 是正则化参数,用于防止 $a_k$ 变得太大。通过线性回归求解$(4)$可得如下:
其中 $\mu_k$ 和 $\sigma_k^2$ 分别是导向图在窗口 $k$ 中部分的均值和方差(像素值),$|\omega|$ 是窗口 $k$ 中的像素数,$\bar{p}_k$ 是 输入图 $p$ 在窗口 $k$ 中部分的均值,表示为 $\bar{p}_k=\frac{1}{|\omega|} \sum_{i \in \omega_k} p_i$。
解释完各个符号的含义,让我们思考将上述的局部线性模型应用在整幅图像上,将图像中每一个能放置 $w_k$ 的区域进行运算(考虑将 $I$ 和 $p$ 叠放),并采用之前提到的取均值的方式,可得到滤波器输出如下:
其中$\bar{a}_i=\frac{1}{|\omega|} \sum_{k \in \omega_i} a_k$,$\bar{b}_i=\frac{1}{|\omega|} \sum_{k \in \omega_i} b_k$。
下面原文对上述输出的保边性进行了一些论证,并指出$(5), (6), (8)$中的关系是在图像滤波中真实存在的,并且这三个关系(公式)可以分别重写为输入的加权和,如下:
其中 $A_{i j}, B_{i j}, W_{i j}$ 为三个仅依赖于导向图 $I$ 的权重,可以看到最终推出了一个输出和导向图与输入的平移不变线性滤波:$q_i=\sum_j W_{i j}(I) p_j$。那么我们只需要关心权重如何计算即可:
解读一下这个权重,对于给定的输出像素 $i$,我们先寻找重叠图像($I$ 和 $p$)中包含该像素的所有窗口 $k$,对于每个窗口 $k$,在 $I$ 上计算 $\mu_k$ 和 $\sigma_k^2$ 后代入计算权重,然后求得加权和。由于可以证明 $\sum_j W_{i j}(I)=1$,所以不需要对权重再进行归一化处理。
总之,导向滤波符合一个平移不变的线性滤波模型,其权重通过导向图计算,最终结合输入图产生输出。
计算方式
$(5), (6), (8)$ 的三个方程是导向滤波器的一种定义,令 $f_{mean}$ 表示半径为 $r$ 的均值滤波器,correlation(corr,相关系数),variance(var,方差)和covariance(cov,协方差)分别表示其本身含义。则可给出算法的伪代码如下:
算法中出现的./ .*
等分别代表逐像素除、逐像素乘等操作。
个人的一点理解
文中总共提出了两种对导向滤波的定义方式,先是得到全图范围上的线性模型 $q_i=\bar{a}_i I_i+\bar{b}_i$,后又重新整理成线性滤波的形式 $q_i=\sum_j W_{i j}(I) p_j$,并求出了仅依赖导向图的滤波核权重。然后从线性模型和滤波核的角度分别分析了导向滤波Edge-Preserving的性质,考虑 $I \equiv p$ 的情况。
快速导向滤波(Fast Guided Filter)
还没看[3],先贴一个伪代码,日后需要再回来整理。
参考文献
[1]Kaiming He, Jian Sun, Xiaoou Tang, Guided Image Filtering. IEEE Transactions on Pattern Analysis and Machine Intelligence, Volume 35, Issue 6, pp. 1397-1409, June 2013
[2]https://zhuanlan.zhihu.com/p/161666126
[3]https://arxiv.org/abs/1505.00996v1
[4]http://kaiminghe.com/eccv10/
[5]Guided Image Filtering, by Kaiming He, Jian Sun, and Xiaoou Tang, in ECCV 2010 (Oral).
后记
首发于 silencezheng.top。