Bilateral Filters 双边滤波

本文最后更新于:2022年5月21日 凌晨

双边滤波是一种非线性滤波器,它可以达到保持边缘、降噪平滑的效果。和其他滤波原理一样,双边滤波也是采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度,本文记录原理与实现。

简介

双边滤波(Bilateral filter)是一种可以保边去噪的滤波器。之所以可以达到此去噪效果,是因为滤波器是由两个函数构成。一个函数是由几何空间距离决定滤波器系数。另一个由像素差值决定滤波器系数。

原理

  • 双边滤波器中,输出像素的值依赖于邻域像素的值的加权组合:

$$
g(i, j)=\frac{\sum_{k, l} f(k, l) w(i, j, k, l)}{\sum_{k, l} w(i, j, k, l)}
$$

  • 权重系数$w(i,j,k,l)$取决于空间域核:

$$
d(i, j, k, l)=\exp \left(-\frac{(i-k){2}+(j-l){2}}{2 \sigma_{d}^{2}}\right)
$$

  • 和值域核:

$$
r(i, j, k, l)=\exp \left(-\frac{|f(i, j)-f(k, l)|^{2}}{2 \sigma_{r}^{2}}\right)
$$

  • 二者的乘积构成权重:

$$
w(i, j, k, l)=\exp \left(-\frac{(i-k){2}+(j-l){2}}{2 \sigma_{d}^{2}}-\frac{|f(i, j)-f(k, l)|^{2}}{2 \sigma_{r}^{2}}\right)
$$

  • 同时考虑了空域和值域的信息,简单来说:距离越近、颜色越接近的像素权重越大

实现

1
cv.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]	) ->	dst
  • 示例代码
1
2
3
img = mt.cv_rgb_imread('img1.jpg', gray=False)
res = cv2.bilateralFilter(img, 9, 100, 1000)
PIS(img, res)

参考资料