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 知识结构图
下面这张图帮你理清三种滤波器的核心逻辑:
3.6 实战中的调参思路
调参这件事,我踩过不少坑。给你几个实用建议:
- 窗口大小从 3×3 开始。别一上来就 5×5、7×7。3×3 效果不够再往上加。
- 高斯滤波先调 σ,再调窗口。σ 决定权重分布,窗口决定范围。σ 固定后,窗口大小取 3σ 左右就够了。
- 中值滤波的窗口要奇数。3×3、5×5、7×7。偶数窗口取中位数会有歧义。
- 边缘区域要特殊处理。我习惯在边缘用较小的窗口,或者干脆不做滤波。
一句话总结:
- 均值滤波:简单但糊,能不用就不用
- 高斯滤波:通用性强,调参灵活,ISP 里最常用
- 中值滤波:专治椒盐噪声,保边效果好