4、空域滤波基础:高斯滤波、双边滤波、非局部均值滤波
多帧HDR合成里,噪声抑制是个绕不开的坎。你想想看,多帧融合本身能压低随机噪声,但遇到运动物体、边缘闪烁,光靠帧平均就不够用了。这时候,空域滤波就得登场。
空域滤波,说白了就是在单帧图像上,用像素邻域的信息来平滑噪声。我刚开始做HDR时,总觉得空域滤波太“基础”,后来发现——基础的东西往往最考验功底。选错了滤波器,细节糊成一片,HDR的高动态范围优势全白费。
这一节,我带你过三种经典空域滤波器:高斯滤波、双边滤波、非局部均值滤波。它们各有脾气,用对了地方,噪声抑制效果天差地别。
4.1 高斯滤波:最朴素的平滑器
高斯滤波是所有空域滤波的起点。它的核心思想很简单:用邻域像素的加权平均来替代中心像素值,权重由高斯函数决定。
公式长这样:
G(x, y) = (1 / (2πσ²)) * exp(-(x² + y²) / (2σ²))
其中σ控制平滑强度。σ越大,邻域范围越广,平滑效果越强,但边缘也越模糊。
我在项目中遇到过一个问题:用高斯滤波处理HDR合成前的低曝光帧,结果高光区域的边缘全糊了。为什么?因为高斯滤波不考虑像素值差异,它一视同仁地平滑所有区域——包括边缘。
核心结论:高斯滤波适合平坦区域(天空、墙面)的噪声抑制,不适合边缘保留。在HDR多帧合成中,我通常只把它用在预处理阶段,比如去除传感器读出噪声。
| 参数 | 作用 | 典型值 |
|---|---|---|
| σ(标准差) | 控制平滑强度 | 0.5 ~ 3.0 |
| 核大小 | 邻域窗口尺寸 | 3×3, 5×5, 7×7 |
我的习惯:核大小取 6σ+1 的奇数。比如σ=1.0,核就用 7×7。这样能保证高斯函数的能量基本覆盖整个核。
4.2 双边滤波:边缘保留的进阶方案
高斯滤波的痛点在于“一刀切”。双边滤波就是为了解决这个问题诞生的。它在高斯滤波的基础上,加了一个像素值差异的权重项。
公式变成:
BF[I]_p = (1/W_p) * Σ G_s(||p - q||) * G_r(|I_p - I_q|) * I_q
其中G_s是空间权重(和高斯滤波一样),G_r是像素值权重。两个权重相乘,结果就是:
- 平坦区域:像素值相近,G_r接近1,平滑效果强
- 边缘区域:像素值差异大,G_r接近0,边缘被保留
听起来很完美,对吧?但实际用起来有坑。
我曾经踩过的坑:双边滤波的参数σ_s和σ_r需要仔细调。σ_r设太大,边缘保留效果消失,退化成高斯滤波;σ_r设太小,噪声根本压不下去。在HDR合成中,我建议σ_r取 0.1~0.3(像素值归一化到0~1),σ_s取 1.5~3.0。
另外,双边滤波的计算量比高斯滤波大不少。核大小固定时,双边滤波的复杂度是O(k²×N),k是核边长,N是像素数。实时处理时,我一般用分离核近似或查表法加速。
4.3 非局部均值滤波:自相似性的力量
非局部均值滤波(NLM)的思路和前面两种完全不同。它不只看邻域,而是搜索整张图像中与当前像素块相似的块,用这些相似块的均值来去噪。
核心公式:
NLM[I](i) = Σ w(i, j) * I(j)
其中权重w(i, j)由像素块i和像素块j的相似度决定:
w(i, j) = (1/Z(i)) * exp(-||B(i) - B(j)||² / h²)
B(i)和B(j)是以i、j为中心的图像块,h是滤波强度参数。
你想想看,NLM为什么效果好?因为它利用了图像的自相似性。纹理、边缘、甚至噪声模式,在图像中往往重复出现。用这些重复信息去噪,比单纯用邻域信息更鲁棒。
实际效果:在HDR多帧合成中,NLM对低曝光帧的噪声抑制效果明显优于双边滤波。尤其是暗部区域的彩色噪声,NLM能保留更多细节。但代价是计算量巨大——搜索整张图像,复杂度是O(N²)。
| 滤波器 | 边缘保留 | 计算复杂度 | 适用场景 |
|---|---|---|---|
| 高斯滤波 | 差 | O(k²N) | 预处理、平坦区域 |
| 双边滤波 | 好 | O(k²N) | 边缘保留去噪 |
| 非局部均值 | 极好 | O(N²) | 低曝光帧、暗部噪声 |
加速技巧:实际工程中,NLM的搜索范围可以限制在局部窗口(比如21×21),相似块数量也做截断。我常用的配置:搜索窗口21×21,相似块窗口7×7,h=0.4~0.6。这样速度能提升10倍以上,效果损失可接受。
4.4 三种滤波器的对比与选择
讲到这里,你可能会问:到底该用哪个?
我的建议是:
- 高斯滤波:用在预处理阶段,去除传感器读出噪声。速度快,效果稳定。
- 双边滤波:用在HDR合成前的单帧去噪,尤其是边缘需要保留的场景。参数调好了,效果很均衡。
- 非局部均值滤波:用在低曝光帧的暗部区域,或者对画质要求极高的场景。计算量大,但效果最好。
我个人习惯在HDR合成流程中这样组合:先用高斯滤波做预处理,再用双边滤波做边缘保留去噪,最后对低曝光帧单独用NLM做精细处理。这样既控制了计算量,又保证了噪声抑制效果。
嗯,这里要注意:空域滤波只是噪声抑制的第一步。多帧HDR合成中,时域滤波(帧间滤波)和空域滤波的配合才是关键。下一节我们会深入时域滤波,到时候再细聊。