2. 双边滤波原理:空间域与值域核、权重计算、数学公式推导

双边滤波这东西,我第一次接触是在做手机HDR拍照算法的时候。当时被噪声和光晕折腾得够呛,后来才发现——嗯,理解清楚它的两个核,很多问题就迎刃而解了。

说白了,双边滤波就是「高斯滤波的升级版」。普通高斯滤波只考虑像素之间的距离,结果边缘也被模糊掉了。双边滤波多了一个心眼——它还看像素值之间的差异。

2.1 空间域核:距离越近,权重越大

空间域核,也叫距离核。它的逻辑很直观:离中心像素越近的邻居,对当前像素的影响越大。

数学上长这样:

G_s(i, j) = exp( - ( (i - cx)² + (j - cy)² ) / (2 * σ_s²) )

其中:

  • (cx, cy) 是当前像素坐标
  • (i, j) 是邻域像素坐标
  • σ_s 是空间标准差,控制空间上的「影响半径」

这个核的形状就是一个标准的高斯钟形曲线。我在项目中习惯把 σ_s 设成 3~5 之间,太小了滤波效果不明显,太大了又容易把细节磨平。

我的经验:σ_s 的值一般取滤波器半径的 1/3 左右。比如你用 9×9 的窗口,σ_s 设 3 就挺合适。

2.2 值域核:差异越大,权重越小

这才是双边滤波的精髓。值域核看的是像素值之间的差异——如果邻居像素和当前像素的亮度差很大,那它的权重就很小。

公式如下:

G_r(p, q) = exp( - ( |I(i, j) - I(cx, cy)|² ) / (2 * σ_r²) )

其中:

  • I(i, j) 是邻居像素的亮度值
  • I(cx, cy) 是当前像素的亮度值
  • σ_r 是值域标准差,控制「多大差异算边缘」

你想想看,如果 σ_r 设得很小,那稍微有点差异的像素就被排除在外了,边缘保留得特别好,但平滑效果就弱。反过来,σ_r 设大了,边缘也开始被模糊。

我曾经踩过的坑:在 HDR 图像上,σ_r 设得太小会导致亮度突变区域出现「阶梯状」伪影。后来我改成根据图像动态范围自适应调整 σ_r,问题才解决。

2.3 权重合成:两个核的乘积

双边滤波的最终权重,就是空间域核和值域核的乘积:

W(i, j) = G_s(i, j) × G_r(p, q)

这个乘积的意义很明确:

  • 只有距离近 并且 亮度也接近的像素,才会获得高权重
  • 距离近但亮度差异大的像素(比如边缘两侧),权重会被值域核压低
  • 亮度接近但距离远的像素,权重会被空间域核压低

最终输出像素的值就是邻域内所有像素的加权平均:

I_filtered(cx, cy) = ( Σ W(i, j) × I(i, j) ) / ( Σ W(i, j) )

分母是归一化因子,保证所有权重之和为 1。

2.4 完整数学公式

把上面所有东西串起来,双边滤波的完整公式就是:

I_filtered(x, y) = (1 / W_p) × Σ_{i=-k}^{k} Σ_{j=-k}^{k} 
    exp( - (i² + j²) / (2σ_s²) ) × 
    exp( - |I(x+i, y+j) - I(x, y)|² / (2σ_r²) ) × 
    I(x+i, y+j)

其中 W_p 是归一化系数:

W_p = Σ_{i=-k}^{k} Σ_{j=-k}^{k} 
    exp( - (i² + j²) / (2σ_s²) ) × 
    exp( - |I(x+i, y+j) - I(x, y)|² / (2σ_r²) )
核心理解:双边滤波的本质就是在高斯滤波的基础上,加了一个「边缘检测门禁」。值域核就是这个门禁——亮度差异超过 σ_r 的像素,一律被挡在门外。

2.5 参数对比与选择指南

参数 控制内容 设小 设大 我常用的范围
σ_s 空间影响半径 只模糊小区域,噪声残留多 平滑范围大,但细节丢失 3 ~ 5
σ_r 亮度差异容忍度 边缘保留强,平滑弱 平滑强,边缘被模糊 0.05 ~ 0.15(归一化后)
窗口半径 邻域大小 计算快,但滤波不充分 计算慢,可能有光晕 3σ_s 取整

2.6 双边滤波的核心逻辑图

下面这张图展示了双边滤波的完整流程:

双边滤波核心逻辑 输入图像 I(x,y) 空间域核 G_s 基于像素距离计算权重 值域核 G_r 基于亮度差异计算权重 权重合成:W = G_s × G_r 只有距离近且亮度接近的像素获得高权重 归一化加权平均 I_filtered = Σ(W × I) / Σ(W) 输出图像 I_filtered

2.7 实际应用中的注意事项

我在实际项目中总结了几条经验:

  1. σ_r 要跟图像动态范围匹配——8位图用 0.1 左右,HDR 图像得放大到 0.3~0.5
  2. 彩色图像要小心——直接在 RGB 三个通道分别做双边滤波,容易产生颜色偏移。我习惯转到 Lab 或 YUV 空间,只在亮度通道做滤波
  3. 计算量很大——双边滤波不是线性滤波,没法用 FFT 加速。实时应用要考虑优化方案
一句话总结:双边滤波 = 高斯滤波 × 边缘感知门禁。理解了这个,你就掌握了 HDR 细节保护的核心工具。