3、传统降噪方法回顾:均值滤波、中值滤波、高斯滤波、双边滤波的原理与局限性
聊深度学习降噪之前,我觉得有必要先把老伙计们请出来回顾一下。均值滤波、中值滤波、高斯滤波、双边滤波——这四个可以说是图像降噪的"四大金刚",我在刚入行那几年,几乎天天跟它们打交道。
说白了,传统降噪方法的核心思路就一个:用邻域信息来修复当前像素。但怎么用、用多少、保不保留边缘,这就分出高下了。
核心观点:传统滤波方法本质都是"局部加权平均",区别在于权重的定义方式。理解了这个,你就能明白为什么深度学习最终会胜出。
3.1 均值滤波:最朴素的思路
均值滤波的原理简单到令人发指——把目标像素周围一个窗口里的所有像素取个平均值,然后替换掉原来的值。
// 3×3 均值滤波核示例
[1/9, 1/9, 1/9]
[1/9, 1/9, 1/9]
[1/9, 1/9, 1/9]
每个像素的权重完全相等。嗯,这里要注意:所有像素一视同仁,包括噪声点本身。
| 优点 | 缺点 |
|---|---|
| 实现简单,计算极快 | 严重模糊边缘和纹理 |
| 对高斯噪声有一定效果 | 对椒盐噪声几乎无效 |
| 可分离卷积,效率高 | 细节丢失不可逆 |
我记得有一次做工业质检项目,直接用均值滤波去噪,结果产品边缘全糊了,检测精度直接掉到60%。后来我才意识到——均值滤波的本质是低通滤波,它把高频细节和噪声一起干掉了。
避坑:我曾经在医学影像预处理中用均值滤波,结果医生投诉说"血管边缘都看不到了"。从此我再也不敢在需要保留边缘的场景里用均值滤波。
3.2 中值滤波:对抗椒盐噪声的利器
中值滤波的思路完全不同——它不取平均,而是取窗口内所有像素的中位数。
// 3×3 窗口像素值排序
原始窗口:
[12, 15, 18]
[11, 255, 14] // 255 是椒盐噪声
[13, 16, 17]
排序后:11, 12, 13, 14, 15, 16, 17, 18, 255
中位数:15
输出:15(噪声被完美去除)
为什么中值滤波对椒盐噪声这么有效?你想想看,椒盐噪声是极端值(0或255),排序后它要么在头要么在尾,根本影响不到中位数。这个特性在实战中非常有用。
- 优势:保护边缘能力远强于均值滤波
- 优势:对椒盐噪声效果极佳
- 劣势:计算量大(需要排序),窗口越大越慢
- 劣势:对高斯噪声效果一般
- 劣势:细线、尖角等细节会被抹掉
个人经验:我习惯在预处理阶段先用中值滤波做一次椒盐噪声去除,然后再用其他方法处理高斯噪声。两步走往往比一步到位效果好。
3.3 高斯滤波:更科学的加权平均
高斯滤波比均值滤波聪明了一点——它不再给所有邻域像素相同的权重,而是根据空间距离来分配权重。离中心越近,权重越大。
// 3×3 高斯核(σ=1)
[0.075, 0.124, 0.075]
[0.124, 0.204, 0.124]
[0.075, 0.124, 0.075]
这个核是怎么来的?就是二维高斯函数离散化采样。公式我就不写了,你记住一点:σ越大,核越平缓,模糊越严重。
| σ值 | 效果 | 适用场景 |
|---|---|---|
| σ=0.5 | 轻微模糊,保留较多细节 | 低噪声图像 |
| σ=1.0 | 适中模糊,平衡去噪与细节 | 通用场景 |
| σ=2.0 | 强模糊,细节损失大 | 高噪声图像 |
高斯滤波比均值滤波好,但好得有限。为什么?因为它只考虑了空间距离,没考虑像素值差异。边缘两侧的像素虽然空间上很近,但像素值差异很大,高斯滤波照样把它们加权平均在一起——边缘还是糊了。
关键洞察:高斯滤波的局限性在于它"只认位置不认内容"。这个缺陷直接催生了双边滤波的诞生。
3.4 双边滤波:试图兼顾去噪与保边
双边滤波在高斯滤波的基础上加了一个像素值权重。它的权重由两部分相乘得到:
- 空间权重:和高斯滤波一样,距离越近权重越大
- 值域权重:像素值越接近,权重越大
这样一来,边缘两侧的像素虽然空间距离近,但像素值差异大,值域权重会变得很小,从而保护了边缘。
// 双边滤波权重示意
权重 = 空间权重 × 值域权重
// 空间权重(高斯)
w_s = exp(-||p - q||² / 2σ_s²)
// 值域权重(高斯)
w_r = exp(-|I(p) - I(q)|² / 2σ_r²)
// 最终权重
w = w_s × w_r
| 参数 | 作用 | 调参经验 |
|---|---|---|
| σ_s(空间sigma) | 控制空间邻域范围 | 一般取 3-5,太大则计算量爆炸 |
| σ_r(值域sigma) | 控制像素值相似度阈值 | 一般取 0.1-0.3(归一化后),太小则去噪不足 |
听起来很完美对吧?但我在实际项目中踩过坑——双边滤波有两个硬伤:
- 计算量巨大:每个像素都要计算值域权重,没法用可分离卷积加速。一张1080p的图,双边滤波能跑好几秒。
- 梯度反转伪影:在强边缘附近,双边滤波会产生"光晕"效果,看起来像边缘被描了一圈。
我曾经踩过的坑:在一个夜景降噪项目里,我用双边滤波处理星空照片,结果星星周围出现了一圈圈的光晕,看起来像外星人来了。后来换成深度学习模型才解决。
3.5 四种方法对比总结
| 方法 | 去噪能力 | 保边能力 | 计算速度 | 适用噪声类型 |
|---|---|---|---|---|
| 均值滤波 | ★☆☆☆☆ | ★☆☆☆☆ | ★★★★★ | 高斯噪声(弱) |
| 中值滤波 | ★★★☆☆ | ★★★★☆ | ★★★☆☆ | 椒盐噪声 |
| 高斯滤波 | ★★☆☆☆ | ★★☆☆☆ | ★★★★★ | 高斯噪声 |
| 双边滤波 | ★★★☆☆ | ★★★★★ | ★☆☆☆☆ | 高斯噪声+保边 |
我的建议:传统滤波方法在简单场景下仍然有用。比如快速预览、低算力设备、或者作为深度学习的预处理步骤。但如果你追求极致效果,尤其是复杂纹理和低光照场景,还是得上深度学习。
3.6 传统方法的共同局限
说了这么多,其实传统滤波方法有一个根本性的问题:它们都是手工设计的固定规则。
- 规则固定:无论图像内容是什么,滤波核都是一样的
- 参数难调:σ_s、σ_r、窗口大小,全靠人工试
- 无法适应:平坦区域和纹理区域用同一套规则,必然顾此失彼
- 信息利用有限:只用局部邻域信息,没有全局上下文
说白了,传统方法就像用一个固定尺寸的筛子去筛所有东西——细沙能筛,石子也能筛,但你要同时筛出细沙和石子,它就无能为力了。
这也是为什么后来大家转向了深度学习——让网络自己去学什么样的"筛子"最适合当前的图像内容。