4. 传统降噪方法回顾:BM3D、NLM、小波降噪的优缺点
各位同学,今天我们聊点“老东西”。
别急着划走。我知道你们是冲着深度学习来的,但说实话,我在ISP这行摸爬滚打这么多年,真正让我在项目里救过火的,反而是这些“老家伙”。深度学习不是万能的,尤其在资源受限的嵌入式平台上,传统方法往往更实在。
这一章,我们就把BM3D、NLM、小波降噪这三板斧掰开揉碎,看看它们到底好在哪、坑在哪。你理解了它们的优缺点,后面学深度学习降噪时,才能知道哪些地方需要改进,哪些地方可以直接复用。
4.1 非局部均值降噪(NLM)
NLM的核心思想很直观:图像里有很多相似的纹理块,把它们找出来平均一下,噪声就没了。
举个例子,你拍了一张墙面的照片,墙上的纹理是重复的。NLM会遍历整个图像,找到所有跟当前像素块相似的块,然后加权平均。相似度越高,权重越大。
核心公式(简化版):
NL[v](i) = Σ w(i,j) * v(j)
其中 w(i,j) 是权重,由像素块 i 和 j 的相似度决定。
相似度 = exp(-||v(Ni) - v(Nj)||² / h²)
这里有个关键参数 h,它控制滤波强度。h越大,平滑越狠,但细节也丢得越多。
优点
- 保边效果好:相比高斯滤波那种无差别模糊,NLM能保留边缘和纹理。我在一个手机夜景项目里用过,人像皮肤的纹理保留得比双边滤波好很多。
- 原理简单:没有复杂的数学变换,理解起来很直观。
缺点
- 计算量巨大:这是NLM的硬伤。每处理一个像素,都要在整个图像里搜索相似块。一张1080p的图,跑一次NLM可能要几十秒。我曾经在ARM Cortex-A53上试过,直接卡死。
- 参数敏感:h值调不好,要么过平滑,要么降噪不彻底。我在项目中吃过这个亏,调了一整天参数,最后还是放弃了。
- 边缘伪影:在纹理重复度低的区域(比如天空),NLM容易产生“鬼影”。
避坑指南:我曾经在一个监控项目里用NLM做预处理,结果因为搜索窗口设得太大,内存直接爆了。后来我改成固定搜索半径 + 提前下采样,才勉强跑起来。记住:NLM不适合实时系统,除非你用硬件加速或者大幅缩小搜索范围。
4.2 块匹配三维滤波(BM3D)
BM3D可以说是传统降噪的天花板。它把NLM的思想又往前推了一步:不仅找相似块,还把相似块叠成一个三维数组,然后在三维空间里做协同滤波。
流程分两步:
- 基础估计:对每个参考块,在图像里找相似块,叠成3D数组,做硬阈值滤波,再逆变换回去。
- 最终估计:用基础估计的结果重新计算相似度,再做一次维纳滤波,得到最终结果。
我的经验:BM3D的降噪效果确实好,尤其在中等噪声水平(σ=20-40)下,PSNR能比NLM高2-3dB。但代价是计算量翻了好几倍。我在一个医疗影像项目里用过,一张512x512的CT图,跑一次要3秒多,根本没法用在实时系统里。
优点
- 降噪效果顶级:在PSNR和主观视觉上,BM3D长期霸榜,直到深度学习出现才被超越。
- 细节保留好:三维协同滤波能有效区分噪声和纹理,不会像NLM那样容易产生伪影。
缺点
- 计算量爆炸:搜索相似块 + 3D变换 + 逆变换,每一步都很耗时。在嵌入式平台上基本不可行。
- 参数多且难调:搜索窗口大小、块大小、阈值、步长……十几个参数,调起来让人崩溃。我记得第一次用BM3D时,光调参数就花了两天。
- 对非高斯噪声效果差:BM3D假设噪声是高斯白噪声,遇到散粒噪声、量化噪声等非高斯噪声,效果会大打折扣。
4.3 小波降噪
小波降噪的思路跟前面两个完全不同。它把图像变换到频域,然后在不同尺度上处理噪声。
核心原理:噪声通常集中在高频小波系数上,而图像的主要能量集中在低频。所以,对小波系数做阈值处理,把小的系数(噪声)置零,再逆变换回去,就能得到干净图像。
常用阈值方法:
- 硬阈值:系数值小于阈值就置零,否则保留。简单粗暴,但容易产生振铃效应。
- 软阈值:系数值小于阈值置零,大于阈值的向零收缩。效果更平滑,但会损失一些细节。
- 贝叶斯阈值:根据噪声方差自适应计算阈值,效果最好,但计算量也最大。
优点
- 计算效率高:小波变换有快速算法,复杂度O(N),比NLM和BM3D快得多。我在一个FPGA项目里实现过,实时处理1080p视频完全没问题。
- 多尺度分析:可以在不同分辨率上处理噪声,对低频噪声和高频噪声都能兼顾。
- 数学理论扎实:小波基函数有良好的时频局部化特性,适合处理非平稳信号。
缺点
- 振铃效应:硬阈值处理容易在边缘附近产生伪影,看起来像“鬼影”。
- 细节损失:软阈值虽然平滑,但会把一些弱边缘也当成噪声滤掉。我在一个文本图像增强项目里试过,小波降噪后文字边缘变模糊了,还不如用NLM。
- 小波基选择困难:不同小波基(Haar、Daubechies、Symlet等)对不同图像效果差异很大。没有通用最优解,得靠经验试。
4.4 三种方法对比总结
| 方法 | 降噪效果 | 计算效率 | 保边能力 | 参数调优 | 适用场景 |
|---|---|---|---|---|---|
| NLM | 中等 | 低 | 好 | 中等 | 离线处理、医疗影像 |
| BM3D | 优秀 | 极低 | 优秀 | 困难 | 科研、高质量离线处理 |
| 小波降噪 | 中等偏上 | 高 | 中等 | 简单 | 实时系统、嵌入式平台 |
你想想看,这三种方法各有各的脾气。NLM和BM3D效果虽好,但计算量太大,在手机、相机这种实时系统里基本用不了。小波降噪虽然快,但细节损失和振铃效应又让人头疼。
那怎么办?
嗯,这就是我们后面要讲的内容——深度学习降噪。它能在保持效果的同时,大幅提升速度。但传统方法的这些优缺点,恰恰是深度学习需要攻克的方向。比如,NLM的“非局部”思想,后来被用在了self-attention里;BM3D的“分组+协同滤波”思路,启发了很多深度展开网络。
所以,别小看这些“老东西”。它们是基石,也是灵感来源。
我的建议:如果你现在要做一个ISP降噪模块,先别急着上深度学习。先问问自己:平台算力够吗?实时性要求多高?噪声类型是什么?如果算力有限,小波降噪 + 后处理可能是最稳妥的方案。如果追求极致效果且不要求实时,BM3D仍然是很好的baseline。