目录
双边滤波的概念
双边滤波(Bilateral Filter)是一种非线性、边缘保留的平滑滤波器,常用于去噪,同时保留图像的边缘细节。它通过考虑空间距离和颜色相似性来加权像素,从而在平滑噪声的同时保持边缘的清晰度。
1. 双边滤波的公式
双边滤波的核心公式如下:
其中:
-
I(x):输入图像中像素 x 的强度值
-
I′(x):输出图像中像素 x 的强度值
-
Ω:像素 x 的邻域
-
是空间权重,表示邻域内像素的位置关系,通常是一个高斯函数
-
是颜色权重,表示像素之间的颜色相似性,也是一个高斯函数
-
W 是归一化系数,确保权重的总和为 1
-
3D 权重分布图:
-
左图:空间权重(以目标像素为中心的高斯分布)。
-
中图:值域权重(在像素值相似的区域权重高)。
-
右图:综合权重(仅在空间邻近且像素值相似的区域高亮)。
-
-
滤波结果对比图:
-
左图:带噪声的原图像(明暗边缘清晰)。
-
右图:双边滤波结果(噪声被平滑,边缘保留)。
-
2. cv2.bilateralFilter() 参数解析
cv2.bilateralFilter(img, d, sigmaColor, sigmaSpace)
各个参数的作用:
-
img:输入图像(可以是灰度图或彩色图)
-
d:用于计算滤波的像素邻域直径(一般设为 0,OpenCV 会自动计算)
-
sigmaColor:颜色空间的标准差,值越大,说明更大的颜色差异仍然会被认为是相似的(颜色保持能力更强)
-
sigmaSpace:坐标空间的标准差,值越大,说明更远的像素仍然会被考虑进来(影响范围更广)
3. 双边滤波的特点
(1). 保留边缘信息
-
传统的线性滤波(如均值滤波、高斯滤波)在去噪的同时会导致图像模糊,包括边缘的模糊。
-
双边滤波通过结合空间权重和颜色权重,使得相似颜色的像素被平滑,而边缘的不同颜色像素得以保留,从而避免边缘被模糊化。
-
例如,在处理人脸图像时,可以去除噪声但仍保持五官的清晰度。
(2). 空间权重 + 颜色权重
双边滤波的计算依赖两个权重:
-
空间权重(几何权重):基于像素之间的物理距离,决定了相邻像素的影响程度,通常使用高斯函数计算:
- 由参数 sigmaSpace 控制,值越大,远处的像素影响越大。
- 作用类似于高斯模糊,限制远距离像素的影响。
-
颜色权重(强度权重):基于像素灰度值(或颜色)之间的相似性,决定了颜色接近的像素影响程度,通常使用高斯函数计算:
-
颜色相近的像素权重较高,差异较大的像素影响较小,从而防止边缘模糊。
-
由参数 sigmaColor 控制,值越大,即使颜色相差较大仍然会被平滑。
-
最终的权重由两者的乘积决定:
(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. 应用场景
由于其边缘保留+去噪的特点,双边滤波广泛用于:
-
人像美颜
-
去除皮肤噪声和瑕疵,但保留五官轮廓。
-
许多美颜相机和 Photoshop 处理会使用它。
-
-
卡通化(Pencil Sketch & Cartoonization)
-
结合边缘检测(如 Canny 算子)可以实现卡通风格图像。
-
-
HDR 处理
-
进行局部对比度增强,提高细节清晰度。
-
-
医学图像处理
-
去除噪声,提高 MRI 或 CT 图像的可读性。
-
-
计算机视觉中的图像预处理
-
在进行 OCR(光学字符识别)、目标检测等任务时,双边滤波可以去噪并保留重要边缘信息。
-
对于人像美颜
右图采用的参数是9,75,75保留了大多的图像细节并且美化了人物脸部的瑕疵。