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 双边滤波的核心逻辑图
下面这张图展示了双边滤波的完整流程:
2.7 实际应用中的注意事项
我在实际项目中总结了几条经验:
- σ_r 要跟图像动态范围匹配——8位图用 0.1 左右,HDR 图像得放大到 0.3~0.5
- 彩色图像要小心——直接在 RGB 三个通道分别做双边滤波,容易产生颜色偏移。我习惯转到 Lab 或 YUV 空间,只在亮度通道做滤波
- 计算量很大——双边滤波不是线性滤波,没法用 FFT 加速。实时应用要考虑优化方案
一句话总结:双边滤波 = 高斯滤波 × 边缘感知门禁。理解了这个,你就掌握了 HDR 细节保护的核心工具。