3、传统降噪方法:均值滤波、高斯滤波、中值滤波、双边滤波、非局部均值(NLM)降噪

在进入深度学习之前,咱们得先把传统方法摸清楚。说实话,虽然现在AI降噪很火,但传统方法在工程落地中依然有不可替代的位置。我做过好几个项目,最后发现混合使用传统+AI才是最优解。

传统降噪的核心思想很简单:利用邻域信息来估计当前像素的真实值。你想想看,噪声是随机的,而真实信号是有结构的。如果我们能找到一个好的方式把邻域信息聚合起来,噪声就会被平均掉。

核心共识:所有传统空间域降噪方法,本质上都是加权平均。区别在于——权重怎么算。

3.1 均值滤波

均值滤波是最朴素的方法。把窗口内的像素值加起来,除以像素个数。说白了就是求平均。

// 3x3均值滤波核
[1/9, 1/9, 1/9]
[1/9, 1/9, 1/9]
[1/9, 1/9, 1/9]

我在项目中遇到过一个问题:用均值滤波处理RAW图,结果边缘全糊了。为什么?因为均值滤波对窗口内所有像素一视同仁,边缘两侧的像素差异很大,一平均就把边缘抹掉了。

优点 缺点
计算极快,适合实时 边缘模糊严重
实现简单,硬件友好 对椒盐噪声效果差
高斯噪声抑制效果尚可 细节丢失不可逆

注意:均值滤波在RAW域要慎用。RAW数据是线性响应,均值滤波会引入偏置误差。我曾经在调试ISP pipeline时吃过这个亏,后来改用高斯滤波才解决。

3.2 高斯滤波

高斯滤波比均值滤波聪明一点。它根据像素到中心点的距离来分配权重——越近权重越大,越远权重越小。权重服从高斯分布。

// 3x3高斯核 (σ=1.0)
[1/16, 2/16, 1/16]
[2/16, 4/16, 2/16]
[1/16, 2/16, 1/16]

我个人习惯用高斯滤波做预处理。比如在NLM之前,先做一次轻量高斯滤波,可以提升后续算法的稳定性。为什么?因为高斯滤波能抑制高频噪声,让后续的块匹配更准确。

但高斯滤波也有问题。它只考虑空间距离,不考虑像素值差异。所以边缘处依然会模糊,只是比均值滤波好一些。

经验值:在RAW域,σ取1.0-1.5比较合适。σ太小没效果,σ太大细节全没了。我一般用σ=1.2作为默认值。

3.3 中值滤波

中值滤波的思路完全不同。它不求和,而是排序取中间值。这对椒盐噪声特别有效。

// 3x3窗口排序示例
原始窗口: [12, 15, 255, 14, 13, 255, 11, 16, 255]
排序后:   [11, 12, 13, 14, 15, 16, 255, 255, 255]
中值:     15

你看,两个255的椒盐噪声直接被排除了。中值滤波对边缘的保护也比均值滤波好很多。我建议在RAW域处理坏点(dead pixel)时,优先考虑中值滤波。

不过中值滤波有个硬伤——计算量大。排序操作在硬件上不友好,尤其是大窗口。3x3还好,5x5就开始吃力了。

噪声类型 中值滤波效果 均值滤波效果
高斯噪声 一般 较好
椒盐噪声 优秀 差
均匀噪声 较差 一般

3.4 双边滤波

双边滤波是个里程碑。它同时考虑空间距离和像素值差异,做到了"保边去噪"。

权重 = 空间权重 × 值域权重

空间权重:离中心越近权重越大(高斯分布)
值域权重:像素值越接近权重越大(高斯分布)

// 双边滤波伪代码
for each pixel p:
    sum_weight = 0
    sum_value = 0
    for each pixel q in window:
        w_spatial = exp(-||p-q||² / (2*σ_s²))
        w_range  = exp(-|I(p)-I(q)|² / (2*σ_r²))
        w = w_spatial * w_range
        sum_weight += w
        sum_value  += w * I(q)
    I'(p) = sum_value / sum_weight

我在项目中遇到过双边滤波的坑。σ_s和σ_r的调参非常敏感。σ_s控制空间范围,σ_r控制值域范围。σ_r设大了,边缘保护失效;设小了,噪声去不掉。

避坑指南:我曾经在RAW域用双边滤波,σ_r设了0.1(归一化后),结果边缘是保住了,但噪声纹丝不动。后来改成0.3才平衡。记住:RAW域的值域范围很大(0-4095或0-1023),一定要归一化后再调参。

双边滤波的另一个问题是计算复杂度。每个像素都要计算窗口内所有像素的权重,O(N×K²)的复杂度在1080p图像上很吃力。

3.5 非局部均值(NLM)降噪

NLM是传统方法的巅峰。它的核心思想是:图像中存在大量重复的纹理结构,我们可以利用这些相似块来降噪。

具体做法:

  1. 对每个像素,取它周围的一个小块(比如7x7)
  2. 在整个图像中搜索与这个块相似的块
  3. 根据相似度加权平均这些块的中心像素
// NLM核心公式
I'(p) = Σ w(p,q) * I(q)
w(p,q) = exp(-||N(p)-N(q)||² / h²) / Z(p)

其中:
N(p) 是以p为中心的块
||·||² 是块间欧氏距离
h 是滤波强度参数
Z(p) 是归一化因子

NLM的效果确实好。纹理区域能保留,平坦区域去噪彻底。但代价也大——计算量爆炸。全图搜索的话,一张1080p图像可能要算几十分钟。

方法 时间复杂度 保边能力 去噪质量
均值滤波 O(N) 差 低
高斯滤波 O(N) 较差 中
中值滤波 O(N log K) 中 中
双边滤波 O(N×K²) 好 较高
NLM O(N×M×K²) 优秀 高

工程优化:实际项目中,NLM不会做全图搜索。我一般用搜索窗口限制(比如21x21),再加上积分图加速,可以把速度提升10倍以上。另外,在RAW域做NLM时,建议先做简单的Bayer插值,或者直接在Bayer格式上做块匹配——后者效果更好但实现更复杂。

3.6 方法对比与选择指南

说了这么多,到底怎么选?我个人的经验是这样的:

  • 实时性要求高(比如手机拍照预览):用高斯滤波或双边滤波
  • 椒盐噪声为主(比如传感器坏点):用中值滤波
  • 追求画质(比如专业相机RAW处理):用NLM或后续的BM3D
  • 作为AI降噪的预处理:轻量高斯滤波就够了

嗯,这里要注意。传统方法虽然不如深度学习强大,但它们的数学原理是相通的。你想想看,深度学习里的卷积层不就是可学习的滤波核吗?注意力机制不就是自适应权重吗?

理解了这些传统方法,你才能真正理解AI降噪模型为什么有效,以及怎么改进。

传统降噪方法知识体系 传统空间域降噪 均值滤波 高斯滤波 中值滤波 双边滤波 NLM 核心共性:加权平均 → 区别在于权重计算方式 对比维度 计算复杂度 保边能力 去噪质量 硬件友好度 复杂度:均值 < 高斯 < 中值 < 双边 < NLM 质量:均值 < 高斯 < 中值 < 双边 < NLM 保边:均值 ≈ 高斯 < 中值 < 双边 ≈ NLM

这张图把五种方法的关系和对比梳理清楚了。从均值到NLM,复杂度在上升,质量也在上升。实际工程中,没有银弹——你得根据场景和资源来选。