一文看懂什么是双边滤波

目录

双边滤波的概念

1. 双边滤波的公式

2. cv2.bilateralFilter() 参数解析

3. 双边滤波的特点

(1). 保留边缘信息

(2). 空间权重 + 颜色权重

(3). 去噪的同时保持细节

(4). 计算量较大

(5). 参数选择对效果影响很大

4. 示例代码

5. 双边滤波 vs 其他滤波

6. 应用场景


双边滤波的概念

        双边滤波(Bilateral Filter)是一种非线性、边缘保留的平滑滤波器,常用于去噪,同时保留图像的边缘细节。它通过考虑空间距离颜色相似性来加权像素,从而在平滑噪声的同时保持边缘的清晰度。


1. 双边滤波的公式

双边滤波的核心公式如下:

I^{'}(x) = \frac{1}{W} \sum_{y \in \Omega} I(y) \cdot f_{\sigma_s}(\|x-y\|) \cdot f_{r}(|I(x)-I(y)|)

其中:

  • I(x):输入图像中像素 x 的强度值

  • I′(x):输出图像中像素 x 的强度值

  • Ω:像素 x 的邻域

  • f_d(\|x - y\|)空间权重,表示邻域内像素的位置关系,通常是一个高斯函数

  • f_r(|I(x) - I(y)|)颜色权重,表示像素之间的颜色相似性,也是一个高斯函数

  • W 是归一化系数,确保权重的总和为 1

  1. 3D 权重分布图

    • 左图:空间权重(以目标像素为中心的高斯分布)。

    • 中图:值域权重(在像素值相似的区域权重高)。

    • 右图:综合权重(仅在空间邻近且像素值相似的区域高亮)。

  2. 滤波结果对比图

    • 左图:带噪声的原图像(明暗边缘清晰)。

    • 右图:双边滤波结果(噪声被平滑,边缘保留)。


2. cv2.bilateralFilter() 参数解析

cv2.bilateralFilter(img, d, sigmaColor, sigmaSpace)

各个参数的作用:

  • img:输入图像(可以是灰度图或彩色图)

  • d:用于计算滤波的像素邻域直径(一般设为 0,OpenCV 会自动计算)

  • sigmaColor:颜色空间的标准差,值越大,说明更大的颜色差异仍然会被认为是相似的(颜色保持能力更强)

  • sigmaSpace:坐标空间的标准差,值越大,说明更远的像素仍然会被考虑进来(影响范围更广)


3. 双边滤波的特点

(1). 保留边缘信息

  • 传统的线性滤波(如均值滤波、高斯滤波)在去噪的同时会导致图像模糊,包括边缘的模糊。

  • 双边滤波通过结合空间权重和颜色权重,使得相似颜色的像素被平滑,而边缘的不同颜色像素得以保留,从而避免边缘被模糊化。

  • 例如,在处理人脸图像时,可以去除噪声但仍保持五官的清晰度。


(2). 空间权重 + 颜色权重

双边滤波的计算依赖两个权重:

  1. 空间权重(几何权重):基于像素之间的物理距离,决定了相邻像素的影响程度,通常使用高斯函数计算:

                                                   f_d(\|x - y\|) = e^{-\frac{\|x - y\|^2}{2\sigma_s^2}}
    1. 由参数 sigmaSpace 控制,值越大,远处的像素影响越大。
    2. 作用类似于高斯模糊,限制远距离像素的影响。
  2. 颜色权重(强度权重):基于像素灰度值(或颜色)之间的相似性,决定了颜色接近的像素影响程度,通常使用高斯函数计算:

                                             f_r(|I(x) - I(y)|) = e^{-\frac{|I(x) - I(y)|^2}{2\sigma_r^2}}
    • 颜色相近的像素权重较高,差异较大的像素影响较小,从而防止边缘模糊。

    • 由参数 sigmaColor 控制,值越大,即使颜色相差较大仍然会被平滑。

最终的权重由两者的乘积决定:

w(x, y) = f_d(\|x - y\|) \cdot f_r(|I(x) - I(y)|)


(3). 去噪的同时保持细节

  • 普通均值滤波会平均周围像素的值,导致细节丢失,图像变模糊。

  • 双边滤波只平滑相似颜色的像素,不同颜色的像素(如边缘)权重较低,因此边缘能得到保留。​​​​​​​


(4). 计算量较大

  • 由于每个像素的计算都需要遍历其邻域并计算权重,双边滤波的计算量远大于普通高斯滤波。

  • 计算复杂度为 O(N^2),比高斯滤波的 O(1) 复杂得多,因此在大图像上处理较慢。

  • 改进方法

    • 高效双边滤波(Fast Bilateral Filter):使用降采样和快速卷积优化计算。

    • 导向滤波(Guided Filter):计算复杂度降低至 O(1),且效果接近双边滤波。


(5). 参数选择对效果影响很大

双边滤波的参数选择直接决定了效果:

  • d(邻域直径)

    • 小值(如 5):影响范围小,平滑效果较弱,但边缘保持较好。

    • 大值(如 15+):影响范围大,平滑更强,但可能损失更多细节。

  • sigmaColor(颜色标准差)

    • 小值(如 20):只考虑颜色非常相近的像素,保留更多细节,但去噪效果较差。

    • 大值(如 100):即使颜色差距较大也会平滑,去噪更强,但可能导致色彩丢失。

  • sigmaSpace(空间标准差)

    • 小值(如 10):仅影响局部区域,细节保留较好。

    • 大值(如 100):影响更大范围,模糊效果更强。

示例:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取带噪声的图像
img = cv2.imread("./imgs/001.png", cv2.IMREAD_GRAYSCALE)

# 应用双边滤波
bilateral = cv2.bilateralFilter(img, d=5, sigmaColor=50, sigmaSpace=50)

# 显示对比结果
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(img, cmap='gray')
plt.title("Noisy Image")
plt.axis("off")

plt.subplot(1, 2, 2)
plt.imshow(bilateral, cmap='gray')
plt.title("Bilateral Filtered")
plt.axis("off")

plt.show()

原图:

不同参数的效果

d=5, sigmaColor=50, sigmaSpace=50

d=9, sigmaColor=75, sigmaSpace=75

d=15, sigmaColor=150, sigmaSpace=150

示例效果对比

参数 d=5, sigmaColor=50, sigmaSpace=50 d=9, sigmaColor=75, sigmaSpace=75 d=15, sigmaColor=150, sigmaSpace=150
去噪能力 中等
细节保留 平衡
边缘锐利度 适中

 


4. 示例代码

import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg')

# 双边滤波
filtered_img = cv2.bilateralFilter(img, d=9, sigmaColor=75, sigmaSpace=75)

# 显示结果
cv2.imshow('Original', img)
cv2.imshow('Bilateral Filter', filtered_img)
cv2.waitKey(0)
cv2.destroyAllWindows()


5. 双边滤波 vs 其他滤波

滤波方法 原理 适用场景 计算量 边缘保留 适合实时处理
均值滤波 取邻域均值 去除高频噪声
高斯滤波 加权均值 去除高斯噪声
中值滤波 取中值 处理椒盐噪声 中等
双边滤波 结合颜色和空间权重 保留边缘的去噪
导向滤波 线性近似双边滤波 高效边缘保留

6. 应用场景

由于其边缘保留+去噪的特点,双边滤波广泛用于:

  1. 人像美颜

    • 去除皮肤噪声和瑕疵,但保留五官轮廓。

    • 许多美颜相机和 Photoshop 处理会使用它。

  2. 卡通化(Pencil Sketch & Cartoonization)

    • 结合边缘检测(如 Canny 算子)可以实现卡通风格图像。

  3. HDR 处理

    • 进行局部对比度增强,提高细节清晰度。

  4. 医学图像处理

    • 去除噪声,提高 MRI 或 CT 图像的可读性。

  5. 计算机视觉中的图像预处理

    • 在进行 OCR(光学字符识别)、目标检测等任务时,双边滤波可以去噪并保留重要边缘信息。

对于人像美颜

右图采用的参数是9,75,75保留了大多的图像细节并且美化了人物脸部的瑕疵。