025、空间降噪与时域降噪:噪声抑制与细节保留的平衡艺术 025、空间降噪与时域降噪噪声抑制与细节保留的平衡艺术去年在调试一款车载环视系统时遇到一个让人抓狂的问题夜间停车场场景下图像上的噪点像雪花一样闪烁但一旦开启强降噪停车位的白色标线边缘就开始模糊导致车位检测算法频频漏检。更诡异的是车辆静止时画面还算干净一旦起步噪点反而比静止时更明显——这明显是时域降噪的参数没调对把运动物体当成了噪声在“抹平”。这种场景下空间降噪和时域降噪就像一对冤家一个管单帧的干净度一个管帧间的稳定性但稍有不慎就会互相打架。今天这篇笔记就聊聊这对冤家怎么调教才能和谐共处。空间降噪单帧里的“刮骨疗毒”空间降噪的本质是在当前帧内做像素级“投票”。最经典的非局部均值NLM算法原理是找相似像素块做加权平均——这招对高斯噪声效果极好但计算量感人。我在手机影像项目中试过在ISP pipeline里跑NLM结果帧率直接腰斩后来只能在夜景模式这种低帧率场景下用。实际工程中更常用的是双边滤波Bilateral Filter。它的核心思想是像素值相近且空间位置相近的像素才参与平均。这里有个坑——sigma_color和sigma_space两个参数是联动的。sigma_color设太大边缘会被磨平像给图像打了柔光sigma_space设太大远处像素也会被拉进来产生“鬼影”。我一般先固定sigma_space为33x3窗口然后根据噪声水平动态调整sigma_colorISO 100时设10ISO 3200时设30这个经验值在多数场景下够用。别这样写代码// 错误示范sigma_color固定高ISO下边缘全糊floatsigma_color15.0f;正确做法是让sigma_color随ISO线性增长但需要加一个上限防止过曝区域被过度平滑。时域降噪帧间的“记忆效应”时域降噪利用的是帧间冗余信息。最简单的做法是帧平均当前帧与前一帧按比例混合。但这里有个致命问题——运动物体。如果场景中有行人走过帧平均会让他变成“半透明幽灵”。三帧降噪是工业界的标准方案当前帧、前一帧、后一帧或前两帧做加权平均。权重根据像素差异动态调整差异小的区域静态背景给高权重差异大的区域运动物体给低权重。这个权重计算函数我踩过很多坑——用线性函数会导致运动边缘出现“拖尾”用sigmoid函数又太慢。最后发现分段线性函数最实用差异小于阈值T1时权重为1大于T2时权重为0中间线性过渡。这里踩过坑阈值T1和T2不能固定。在车载场景下车速80km/h时运动像素差异比静止时大得多必须根据运动矢量场动态调整。我通常的做法是先做光流估计简化版只算SAD然后根据光流幅值缩放T1和T2。光流大的区域T1/T2整体上移避免把运动物体当成噪声。空间与时间的“联姻”运动自适应降噪真正的高手不会把空间降噪和时域降噪分开调。它们必须协同工作核心是运动检测。我的做法是先做运动检测生成运动掩膜Motion Mask。运动掩膜中静止区域掩膜值接近0交给时域降噪处理运动区域掩膜值接近1交给空间降噪处理中间区域做混合。这个混合权重不能是简单的线性插值——我试过结果在运动边缘会出现“振铃效应”。正确做法是用高斯函数对运动掩膜做模糊让过渡更平滑。运动检测本身也有坑。用帧差法当前帧减前一帧对光照变化极其敏感——车灯扫过时整个画面都会被认为是运动区域。我改用“梯度域帧差”先计算两帧的梯度Sobel算子再对梯度做差分。光照变化主要影响像素值对梯度影响小得多。代价是多了一次梯度计算但在嵌入式平台上用查表法实现Sobel开销可以接受。实战中的“脏活”参数调优理论说完了说说实际调参的脏活。我总结了一套“三步走”策略第一步固定空间降噪参数单独调时域降噪。在静态场景下把时域降噪的帧数从2帧调到8帧观察信噪比提升曲线。通常4帧后提升就饱和了再增加帧数只会引入“记忆拖尾”。第二步固定时域降噪参数调空间降噪。在运动场景下观察运动物体的边缘清晰度。这里有个技巧用“边缘保持指数”EPI来量化——计算降噪前后边缘区域的梯度比值比值越接近1越好。我一般要求EPI不低于0.85。第三步联合调优。在典型场景如夜间城市道路下录制一段视频用主观评价人眼看和客观指标PSNR、SSIM、VMAF综合打分。这里有个反直觉的经验PSNR高不一定好——过度平滑的图像PSNR反而高但细节全没了。我更喜欢用VMAF它更贴近人眼感知。个人经验性建议别迷信算法复杂度。在嵌入式平台上一个简单的3x3中值滤波三帧平均调好参数后效果可能比复杂的NLM光流法还好。关键是参数要适配场景。运动检测是时域降噪的命门。花70%的精力优化运动检测算法剩下30%给降噪本身。运动检测做不好时域降噪就是定时炸弹。给参数留“余量”。在实验室调好的参数到产线上往往要打八折。比如sigma_color在实验室设20产线上设16更安全——宁可保留一点噪点也不能把边缘磨掉。产线质检员对边缘模糊的容忍度远低于噪点。考虑人眼特性。人眼对低频噪声敏感对高频噪声不敏感。所以降噪策略应该是优先压制低频噪声大块色斑对高频噪声细小颗粒可以适当放宽。这可以通过频域分解实现但工程上更简单的方法是对亮度通道做强降噪对色度通道做弱降噪——因为人眼对色度噪声不敏感。最后一条也是最重要的降噪不是目的目的是让下游算法检测、识别、跟踪工作得更好。所以调参时不要只看图像好不好看要看检测率、误报率这些业务指标。我在车载项目里最终是用“车位检测召回率”来验收降噪效果的——图像看起来有点噪但车位线清晰检测召回率从82%提升到94%这就够了。影像系统里没有完美的降噪方案只有最适合场景的妥协。记住你保留的每一个细节都可能是一个算法工程师的救命稻草。