3. 降噪滤波器原理(上):均值、高斯与中值滤波

各位同学,咱们今天聊聊降噪滤波器的基本功。说实话,ISP 流水线里,降噪这块是最容易上手,也最容易翻车的地方。我见过不少新手,一上来就上大核滤波器,结果图像糊得像油画,边缘细节全没了。

今天咱们先啃三块硬骨头:均值滤波、高斯滤波、中值滤波。这三兄弟是后面所有高级降噪算法的基础。你想想看,连它们都搞不明白,后面那些双边滤波、非局部均值就更别想了。

3.1 均值滤波:简单粗暴的“平均主义”

均值滤波,说白了就是“和稀泥”。把目标像素周围一圈像素的值加起来,取个平均值,然后把这个平均值赋给目标像素。

它的数学表达很简单:

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

其中 m×n 是滤波器窗口大小,f(i,j) 是原始像素值,g(x,y) 是滤波后的值。

举个例子,一个 3×3 的均值滤波核长这样:

1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9

所有系数加起来等于 1,保证亮度不变。

核心特点:

  • 计算量极小,硬件实现成本低
  • 对高斯噪声有一定抑制效果
  • 对椒盐噪声几乎无效
  • 严重模糊边缘和纹理

我在项目中遇到过一件事。有一次做低端手机摄像头调试,Sensor 噪声很大,工程师直接上了 7×7 均值滤波。结果呢?人脸拍出来像打了马赛克,边缘全糊了。后来我换成了高斯滤波,效果好了不少。

避坑指南:我曾经在夜景模式下用过 5×5 均值滤波,结果星点全被抹平了。均值滤波的窗口越大,图像越模糊。如果你需要保留细节,窗口尽量别超过 3×3。

3.2 高斯滤波:带权重的“民主投票”

高斯滤波比均值滤波聪明一点。它知道离中心越近的像素越重要,所以给它们更高的权重。这个权重分布,就是高斯函数。

二维高斯函数的数学表达:

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

其中 σ 是标准差,控制着权重的衰减速度。σ 越大,权重分布越平坦,滤波效果越接近均值滤波。

一个 3×3 的高斯滤波核(σ=1.0)长这样:

1/16 2/16 1/16
2/16 4/16 2/16
1/16 2/16 1/16

你看,中心像素的权重是 4/16,是角落像素的 4 倍。这就是“民主投票”——离我近的,说话算数。

个人经验:我建议你在调高斯滤波时,先固定窗口大小,然后调 σ。σ=0.8~1.2 之间,对大多数场景效果都不错。σ 太小(比如 0.3),滤波核几乎退化成单位矩阵,等于没滤波。

高斯滤波还有一个好处——它是可分离的。什么意思?一个二维高斯核可以拆成两个一维高斯核的乘积。先对行做一维高斯滤波,再对列做一维高斯滤波。计算量从 O(n²) 降到 O(2n)。

# 可分离高斯滤波示意
# 先对每一行做一维高斯滤波
for each row:
    row_filtered = convolve(row, gaussian_kernel_1d)

# 再对每一列做一维高斯滤波
for each col:
    result = convolve(col_filtered, gaussian_kernel_1d)

均值 vs 高斯:

  • 均值滤波:所有像素一视同仁,边缘模糊严重
  • 高斯滤波:中心权重高,边缘保留稍好
  • 高斯滤波:可分离,计算效率高
  • 高斯滤波:对高斯噪声抑制效果优于均值滤波

3.3 中值滤波:专治“椒盐噪声”的偏方

中值滤波的思路完全不同。它不求和,不求平均,而是把窗口内的像素值排序,取中间那个值。

数学表达很简单:

g(x, y) = median{f(i, j) | (i, j) ∈ W}

其中 W 是窗口,median 是取中位数操作。

举个例子,一个 3×3 窗口内的像素值:

[120, 125, 130,
 118, 255, 128,   ← 255 是椒盐噪声
 122, 126, 124]

排序后:[118, 120, 122, 124, 125, 126, 128, 130, 255]
中位数:125

你看,255 这个噪声点被直接扔掉了。中值滤波对椒盐噪声几乎是“免疫”的。

注意:中值滤波对高斯噪声效果很差。为什么?因为高斯噪声是均匀分布的,中位数和均值差别不大。我曾经在调试工业相机时,Sensor 有轻微高斯噪声,我用了中值滤波,结果图像出现“块状效应”,还不如不滤。

中值滤波还有一个特点——它不产生新的像素值。所有输出值都是原始图像中真实存在的像素值。这对某些应用场景很重要,比如医学图像处理,不能引入虚假信息。

3.4 三种滤波器的对比与选择

咱们来做个对比,方便你以后选型:

特性 均值滤波 高斯滤波 中值滤波
噪声类型 高斯噪声(一般) 高斯噪声(较好) 椒盐噪声(优秀)
边缘保留 差 一般 较好
计算复杂度 低 中(可分离后低) 高(需要排序)
硬件实现 简单 中等 较复杂
适用场景 实时性要求高、噪声小 通用降噪、预处理 椒盐噪声、脉冲噪声

我的建议:在 ISP 流水线中,我通常这样搭配:

  • 先做中值滤波(3×3),去除 Sensor 产生的坏点和椒盐噪声
  • 再做高斯滤波(5×5,σ=1.0),平滑高斯噪声
  • 均值滤波?我基本不用,除非硬件资源实在紧张

3.5 知识结构图

下面这张图帮你理清三种滤波器的核心逻辑:

降噪滤波器核心逻辑 均值滤波 高斯滤波 中值滤波 原理:窗口内像素 求算术平均 特点:简单、模糊严重 原理:加权平均 权重服从高斯分布 特点:可分离、边缘稍好 原理:窗口内像素 排序取中位数 特点:抗椒盐噪声、保边 适用场景:高斯噪声 → 高斯滤波 | 椒盐噪声 → 中值滤波 | 实时低功耗 → 均值滤波 选型建议 1. 先确定噪声类型(高斯 vs 椒盐) 2. 再考虑硬件资源和实时性要求 3. 最后通过调参(窗口大小、σ)平衡降噪与保边

3.6 实战中的调参思路

调参这件事,我踩过不少坑。给你几个实用建议:

  1. 窗口大小从 3×3 开始。别一上来就 5×5、7×7。3×3 效果不够再往上加。
  2. 高斯滤波先调 σ,再调窗口。σ 决定权重分布,窗口决定范围。σ 固定后,窗口大小取 3σ 左右就够了。
  3. 中值滤波的窗口要奇数。3×3、5×5、7×7。偶数窗口取中位数会有歧义。
  4. 边缘区域要特殊处理。我习惯在边缘用较小的窗口,或者干脆不做滤波。

一句话总结:

  • 均值滤波:简单但糊,能不用就不用
  • 高斯滤波:通用性强,调参灵活,ISP 里最常用
  • 中值滤波:专治椒盐噪声,保边效果好