4. 去噪基础:空间域滤波、变换域滤波与非局部均值

去噪,说白了就是跟噪声抢细节。在RAW域做HDR,这个博弈尤其激烈——你稍微手重一点,纹理就糊了;手轻一点,噪点又在那晃眼。我这些年踩过的坑,十有八九都跟这个平衡有关。

这一章我们先把地基打牢。三种主流去噪思路:空间域、变换域、非局部均值。它们各有脾气,也各有绝活。

4.1 空间域滤波:最朴素的降噪手段

空间域滤波,就是直接在像素格子上做文章。用一个窗口滑过图像,把窗口内的像素按某种规则合并成一个新值。简单,但有效。

4.1.1 均值滤波

均值滤波,取窗口内所有像素的平均值。公式很简单:

g(x, y) = (1 / (m × n)) × Σ f(i, j)

其中 m×n 是窗口大小。窗口越大,平滑越强,但细节丢失也越严重。

我曾经踩过的坑: 在RAW域用均值滤波去噪,结果把高光边缘搞成了“毛玻璃”。因为RAW数据还没做去马赛克,均值滤波会直接破坏拜耳阵列的相位信息。后来我学乖了——要么先转成RGB,要么只在暗部区域用。
滤波器 优点 缺点 典型场景
均值滤波 计算快,实现简单 边缘模糊严重,对椒盐噪声无效 均匀区域的轻度噪声
高斯滤波 平滑自然,权重合理 仍会模糊边缘 高斯噪声为主的环境
中值滤波 保边性好,抗椒盐噪声 计算稍慢,对高斯噪声效果一般 传感器坏点、脉冲噪声

4.1.2 高斯滤波

高斯滤波跟均值滤波的区别在于——它给窗口内的像素加了权重。离中心越近的像素,权重越大;越远的,权重越小。权重由高斯函数决定:

G(x, y) = (1 / (2πσ²)) × exp(-(x² + y²) / (2σ²))

σ 控制着平滑程度。σ 越大,高斯曲线越胖,平滑效果越强。

我个人习惯: 在RAW域HDR中,我通常把 σ 设为 1.0~1.5。太小了没效果,太大了细节全没了。你想想看,HDR场景里暗部提亮后噪声会放大,这时候高斯滤波可以快速压住噪声,但千万别指望它保留纹理。

4.1.3 中值滤波

中值滤波不取平均,取中间值。把窗口内所有像素排序,挑中间那个。这招对付椒盐噪声特别管用——那些孤立的亮/暗点会被直接剔除。

我在项目中遇到过一个问题:RAW域的中值滤波如果窗口选 3×3,对单像素坏点很有效;但窗口到 5×5 以上,细线条就开始扭曲了。所以我的建议是——中值滤波只用来做“预处理”,别当主力。

4.2 变换域滤波:换个角度看噪声

空间域滤波搞不定的,我们换个战场。变换域滤波把图像从像素空间变换到频率空间,在频率域里做手脚。

4.2.1 小波去噪

小波变换把图像分解成不同尺度的子带:低频近似分量 + 高频细节分量。噪声通常集中在高频子带。我们只需要对高频系数做阈值处理,再反变换回来。

流程如下:

  1. 对图像做小波分解(比如 Haar、Daubechies)
  2. 对高频子带系数做软阈值或硬阈值处理
  3. 反小波变换重建图像
# 伪代码示意
coeffs = dwt2(image, 'db4')      # 小波分解
cA, (cH, cV, cD) = coeffs       # 近似 + 三个方向细节
cH = soft_threshold(cH, T)      # 软阈值
cV = soft_threshold(cV, T)
cD = soft_threshold(cD, T)
denoised = idwt2((cA, (cH, cV, cD)), 'db4')  # 重建
关键点: 阈值 T 的选择决定了去噪强度。太小了噪声残留,太大了细节被削平。我常用的方法是基于噪声标准差估算:T = σ × √(2 × log(N)),其中 N 是像素数。

4.2.2 BM3D:变换域的天花板

BM3D(Block-Matching and 3D Filtering)是目前公认的经典去噪算法。它把空间域和变换域结合了起来。

核心思路:

  • 在图像中找相似的图像块(块匹配)
  • 把这些相似块堆叠成一个三维数组
  • 对三维数组做联合变换(2D DCT + 1D Haar)
  • 在变换域做协同滤波
  • 反变换后加权聚合回原图

BM3D 的效果确实好,但计算量也大。我记得第一次在嵌入式平台上跑 BM3D,一帧 1080p 图像跑了 40 多秒——完全不可用。后来我做了优化:缩小搜索范围、降低块匹配精度,才勉强压到 2 秒以内。

注意: BM3D 在 RAW 域使用时,要小心拜耳阵列的周期性结构。块匹配可能会匹配到同色通道的块,但跨通道匹配会引入伪影。我建议在 RAW 域做 BM3D 时,先按通道分离处理。

4.3 非局部均值(NLM):让图像自己教自己

非局部均值(Non-Local Means)的思路很巧妙——图像里有很多重复的纹理和结构。与其只用一个窗口内的像素,不如在全图范围内找相似的像素块,用它们的加权平均来去噪。

权重由两个像素块之间的相似度决定:

w(i, j) = exp(-||v(Ni) - v(Nj)||² / h²)

其中 v(Ni) 和 v(Nj) 是以像素 i 和 j 为中心的图像块,h 是滤波参数。

NLM 的优点是保边性极好——只要找到足够多的相似块,纹理可以被完美保留。但缺点也很明显:

  • 计算量巨大:每个像素都要在全图搜索
  • 对非重复纹理(比如草地、沙地)效果一般
  • 参数 h 敏感:调不好要么过平滑,要么噪声残留
我的经验: 在 RAW 域 HDR 中,NLM 最适合处理“有规律纹理”的区域,比如砖墙、织物、树叶。对于天空、皮肤这类平滑区域,用高斯滤波就够了,没必要上 NLM 浪费算力。我通常的做法是——先做边缘检测,只在纹理区域启用 NLM,平滑区域用高斯滤波。这样既保细节,又省时间。

4.4 本章知识体系

下面这张图把三种去噪思路的脉络梳理了一下:

去噪基础:三种核心思路 图像去噪方法 空间域滤波 均值 / 高斯 / 中值 变换域滤波 小波去噪 / BM3D 非局部均值 NLM 块匹配加权 三种思路对比 维度 空间域 变换域 非局部均值 计算速度 快 中等 慢 保边能力 弱(中值除外) 中等 强 纹理保留 差 好(BM3D) 极好 RAW域适配 需注意拜耳结构 需分通道处理 需分通道处理

4.5 小结

三种去噪思路,各有各的舞台:

  • 空间域滤波:快,但粗糙。适合预处理或低噪声场景。
  • 变换域滤波:精度高,BM3D 是标杆。但计算成本摆在那。
  • 非局部均值:保纹理之王。但慢,且依赖图像的自相似性。

在 RAW 域 HDR 的实际工程中,我很少只用一种方法。通常是组合拳——先用中值滤波干掉坏点,再用小波或 BM3D 处理中高频噪声,最后用 NLM 在纹理区域做精细修复。每一步都要控制力度,不然细节就没了。

嗯,去噪的基础就聊到这。下一层我们开始碰真正的硬骨头——RAW 域特有的噪声模型和去噪策略。