导向滤波公式推导和扩展

半世苍凉 提交于 2020-01-17 04:10:49

何凯明大神的代表作之一
论文地址:Guided Image Filtering

导向滤波的一般表达方式

qi=jWij(I)pj q_{i}=\sum_{j} W_{i j}(I) p_{j}
其中qq表示输出,pp表示输入,II表示导向图。

先验假设

假设在局部范围内,输出图与导向图的关系可以用一个线性模型表示:
qi=akIi+bk,iωk q_{i}=a_{k} I_{i}+b_{k}, \forall i \in \omega_{k}
另外输出图是由输入图减去噪声(需要被滤掉的部分)得到
qi=pini q_{i}=p_{i}-n_{i}

能量函数和求解

我们需要做的就是最小化能量函数
E(ak,bk)=iωk((akIi+bkpi)2+ϵak2) E\left(a_{k}, b_{k}\right)=\sum_{i \in \omega_{k}}\left(\left(a_{k} I_{i}+b_{k}-p_{i}\right)^{2}+\epsilon a_{k}^{2}\right)
其中ϵ\epsilon为正则项,防止系数aka_k过大。
aka_kbkb_k求导:
Eak=2iN((pi+akIi+bk)Ii+ϵak) \frac{\partial E}{\partial a_{k}}=2 \sum_{i}^{N}\left(\left(-p_{i}+a_{k} I_{i}+b_{k}\right) I_{i}+\epsilon a_{k}\right)
Ebk=2iN(piakIibk) \frac{\partial E}{\partial b_{k}}=-2 \sum_{i}^{N}\left(p_{i}-a_{k} I_{i}-b_{k}\right)
先求取bkb_k,令偏导数为零:
0=iN(piakIibk)Nbk=iN(piakIi)bk=1NiN(piakIi)bk=1NiNpiak1NiNIibk=pkˉakμk \begin{aligned} &0= \sum_{i}^{N}\left(p_{i}-a_{k} I_{i}-b_{k}\right)\\ &\Rightarrow N b_{k}=\sum_{i}^{N}\left(p_{i}-a_{k} I_{i}\right)\\ &\Rightarrow b_{k}=\frac{1}{N} \sum_{i}^{N}\left(p_{i}-a_{k} I_{i}\right)\\ &\Rightarrow b_{k}=\frac{1}{N} \sum_{i}^{N} p_{i}-a_{k} \frac{1}{N} \sum_{i}^{N} I_{i} \\ &\Rightarrow b_{k}= \bar{p_{k}}-a_{k} \mu_{k} \end{aligned}
其中pkˉ\bar{p_k}为输入图窗口内的平均值,μk\mu_k为导向图在窗口内的平均值。
同理,再来求aka_k
0=iN((pi+akIi+bk)Ii+ϵak)0=piIi+akIi2+bkIi+εakpiIibkIi=ak(Ii2+ϵ)piIi(pkakμk)Ii=ak(Ii2+ϵ)ak=(piIipkIi)(Ii2μkIi+ϵ)ak=(piIi)1NpiIiIi21NIiIi+ϵ=1N(piIi)1Npi1NIi1NIi21NIi1NIi+ϵ \begin{aligned} &0= \sum_{i}^{N}\left(\left(-p_{i}+a_{k} I_{i}+b_{k}\right) I_{i}+\epsilon a_{k}\right)\\ &\Rightarrow 0=\sum-p_{i} I_{i}+\sum a_{k} I_{i}^{2}+\sum b_{k} I_{i}+\sum \varepsilon a_{k}\\ &\Rightarrow \sum p_{i} I_{i}-\sum b_{k} I_{i}=a_{k} \sum\left(I_{i}^{2}+\epsilon\right)\\ &\Rightarrow \sum p_{i} I_{i}-\sum\left(p_{k}-a_{k} \mu_{k}\right) I_{i}=a_{k} \sum\left(I_{i}^{2}+\epsilon\right)\\ &\Rightarrow a_{k}=\frac{\sum\left(p_{i} I_{i}-p_{k} I_{i}\right)}{\sum\left(I_{i}^{2}-\mu_{k} I_{i}+\epsilon\right)}\\ &\Rightarrow a_{k}=\frac{\sum\left(p_{i} I_{i}\right)-\frac{1}{N} \sum p_{i} \sum I_{i}}{\sum I_{i}^{2}-\frac{1}{N} \sum I_{i} \sum I_{i}+\epsilon}=\frac{\frac{1}{N} \sum\left(p_{i} I_{i}\right)-\frac{1}{N} \sum p_{i} \frac{1}{N} \sum I_{i}}{\frac{1}{N} \sum I_{i}^{2}-\frac{1}{N} \sum I_{i} \frac{1}{N} \sum I_{i}+\epsilon} \end{aligned}
根据方差和协方差公式
var(X)=i=1n(XiXˉ)2n1Cov(X,Y)=E[(XE[X])(YE[Y])]Cov(X,Y)=E[XY]E[X]E[Y] \begin{aligned} &\operatorname{var}(X)=\frac{\sum_{i=1}^{n}\left(X_{i}-\bar{X}\right)^2}{n-1}\\ &\operatorname{Cov}(X, Y)=E[(X-E[X])(Y-E[Y])]\\ &\operatorname{Cov}(X, Y)=E[X Y]-E[X] E[Y] \end{aligned}
可以得到
ak=Cov(p,I)Var(I)+Nϵ=Cov(p,I)σk2+ϵ a_{k}=\frac{\operatorname{Cov}(p, I)}{\operatorname{Var}(I)+N \epsilon}=\frac{\operatorname{Cov}(p, I)}{\sigma_{k}^{2}+\epsilon}
当导向图与输入图相同时,导向滤波就变成了以输入图自身为导向的保边滤波。上面表达式就会变成
ak=σk2σk2+εbk=(1ak)μk \begin{aligned} a_{k} &=\frac{\sigma_{k}^{2}}{\sigma_{k}^{2}+\varepsilon} \\ b_{k} &=\left(1-a_{k}\right) \mu_{k} \end{aligned}

  • 当遇到边缘区域,方差较大,此时σk2>>ϵ\sigma_{k}^2>>\epsilon,有q=pq=p
  • 反之,当方差较小,σk2<<ϵ\sigma_{k}^2<<\epsilon,输出均值q=μkq=\mu_k

其实更仔细思考一下,这里对“边缘”和“平坦”区域的定义实际上是取决于ϵ\epsilon的取值,当区域方差远大于ϵ\epsilon时,则“定义为”这次滤波中的边缘区域,在滤波时会被保留,反之则是平坦区域。

思考

图像滤波与线性回归的关系

线性回归:有一些离散点xix_i,需要拟合一条直线yiy_i使得ϵ=i(yi(axi+b))2\epsilon=\sum_{i}(y_i-(ax_i+b))^2最小。
图像去噪:有一些含有噪声的像素pip_i,需要拟合一个线性函数找到没有噪声的图像qiq_i,使得ϵ=i(piqi)2\epsilon=\sum_{i}(p_i-q_i)^2最小。

扩展

简化计算

可以看到按照滤波公式,对于输出的每一个像素,都需要计算输入图和导向图在窗口内的均值,以此得到aka_kbkb_k。但是这其中有很多重复计算,此时可以通过计算经过所有覆盖当前像素的窗口的平均aka_kbkb_k来计算单个像素的输出
qi=aˉiIi+bˉi q_{i}=\bar{a}_{i} I_{i}+\bar{b}_{i}
经过这个改变之后可能无法满足最初的q=aI\nabla q = a\nabla I,但是仍然可以保证在强边缘附近导向图的信息是可以被保留下来的qaˉI\nabla q \approx \bar{a} \nabla I

滤波核计算

根据最开始的一般表达式,可以知道输出qiq_i是线性依赖于输入pip_i,所以要求取滤波核只需要使用qiq_ipip_i求导就可以。将上面表达式中的bkb_k替换掉,可以得到
qi=1ωkωi(ak(Iiμk)+pˉk) q_{i}=\frac{1}{|\omega|} \sum_{k \in \omega_{i}}\left(a_{k}\left(I_{i}-\mu_{k}\right)+\bar{p}_{k}\right)
qipj=1ωkωi(akpj(Iiμk)+pˉkpj) \frac{\partial q_{i}}{\partial p_{j}}=\frac{1}{|\omega|} \sum_{k \in \omega_{i}}\left(\frac{\partial a_{k}}{\partial p_{j}}\left(I_{i}-\mu_{k}\right)+\frac{\partial \bar{p}_{k}}{\partial p_{j}}\right)
其中
pˉkpj=1ωδjωk=1ωδkωj \frac{\partial \bar{p}_{k}}{\partial p_{j}}=\frac{1}{|\omega|} \delta_{j \in \omega_{k}}=\frac{1}{|\omega|} \delta_{k \in \omega_{j}}
是一个狄拉克函数,在窗口内部为1,其余地方为0。
在根据aka_k的表达式对pjp_j求导
akpj=1σk2+ϵ(1ωiωkpipjIipˉkpjμk)=1σk2+ϵ(1ωIj1ωμk)δkωj \begin{aligned} \frac{\partial a_{k}}{\partial p_{j}} &=\frac{1}{\sigma_{k}^{2}+\epsilon}\left(\frac{1}{|\omega|} \sum_{i \in \omega_{k}} \frac{\partial p_{i}}{\partial p_{j}} I_{i}-\frac{\partial \bar{p}_{k}}{\partial p_{j}} \mu_{k}\right) \\ &=\frac{1}{\sigma_{k}^{2}+\epsilon}\left(\frac{1}{|\omega|} I_{j}-\frac{1}{|\omega|} \mu_{k}\right) \delta_{k \in \omega_{j}} \end{aligned}
代回原式就得到了滤波核的表达式
qipj=1ω2kωi,kωj(1+(Iiμk)(Ijμk)σk2+ϵ) \frac{\partial q_{i}}{\partial p_{j}}=\frac{1}{|\omega|^{2}} \sum_{k \in \omega_{i}, k \in \omega_{j}}\left(1+\frac{\left(I_{i}-\mu_{k}\right)\left(I_{j}-\mu_{k}\right)}{\sigma_{k}^{2}+\epsilon}\right)
根据滤波核表达式,当像素iijj都在窗口内部,但处于一个边缘的同侧时(颜色相近),括号内后半部分的计算结果为正,融合权重很高;反之如果处于边缘的异侧,括号内后半部分结果为负,融合权重就会小很多。

高斯导向滤波

由于导向滤波算法采用的是均值滤波,在纹理不那么强或是均匀纹理时,导向滤波会退化成两个均值滤波的串联,多次均值滤波的串联虽然可以近似高斯滤波,但是仅两次均值滤波还是会造成权重在x和y方向附近比其他方向稍大,如图
这是可以在能量函数前面加一个高斯核,让权重可以更加均匀分布
E(ak,bk)=iωkwik((akIi+bkpi)2+ϵak2) E\left(a_{k}, b_{k}\right)=\sum_{i \in \omega_{k}} w_{i k}\left(\left(a_{k} I_{i}+b_{k}-p_{i}\right)^{2}+\epsilon a_{k}^{2}\right)
在这里插入图片描述

Gradient-preserving

双边滤波会存在一个问题,主要体现在对边缘做滤波的时候,由于边缘像素本身和周围像素在数值上差距较大,会导致由数值差距判断的权重都很小,这时候融合权重就主要取决于高斯核,就可能融合出很多奇怪的效果,例如原本平滑过渡的边缘,会变得更加锐利,或者边缘过渡会变得不平滑,甚至出现梯度反向。经作者实验导向滤波是可以减轻甚至消除这种问题。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!