1. 从“鬼影”和“果冻”说起:为什么我们需要运动感知去噪?
刚入行做图像处理那会儿,我最头疼的就是处理动态视频里的噪声。你肯定见过那种画面:一个原本清晰的人走过,身后却拖着一道模糊的“鬼影”;或者视频里稍微有点快速运动,整个画面就像“果冻”一样抖动、粘连。早期我们用传统的3DNR(三维降噪)算法,效果是有的,静态画面干净得像抹了油,可一动起来就全露馅了。问题就出在,算法把每一帧都“一视同仁”了。
简单来说,传统3DNR的核心思想是“时间平均”。它会综合当前帧以及前面好几帧的信息,把对应位置的像素值混合一下,噪声是随机的,一平均就被削弱了,画面就干净了。这招对静止的背景、不动的物体非常有效。但你想,如果一个物体从A点移动到了B点,算法还傻乎乎地把A点过去的像素和B点现在的像素混在一起平均,那可不就在B点留下了A点的“残影”吗?这就是“鬼影”。反过来,如果因为怕产生鬼影,而完全放弃使用时间信息,只靠当前帧自己(这叫空间滤波),那去噪能力就会大打折扣,画面在运动时就会因为噪声去除不干净而产生抖动或模糊,看起来像“果冻”。
所以,真正的挑战在于:如何让算法“聪明”地知道画面里哪里在动,哪里没动? 动了的地方,就少用甚至不用过去帧的信息,主要靠当前帧自己“解决”噪声;没动的地方,就放心大胆地融合多帧信息,把噪声压得死死的。这就是“运动感知”或“运动自适应”3DNR的核心。而要实现这个“感知”,我们需要一个可靠的运动检测器。今天要聊的基于SAD(绝对差值和)的运动感知3DNR,就是一种在效果和计算成本之间取得绝佳平衡的实战方案,我很多智能摄像头和行车记录仪的项目里都用它,实测下来非常稳。
2. 核心侦察兵:SAD如何成为运动的“尺子”
要让算法感知运动,我们得先定义什么叫“运动”。在数字图像的世界里,运动最直接的体现就是像素值的变化。一个点,从前一帧到这一帧,颜色(亮度)变了,那它很可能动了,或者它所在区域的物体动了。但是,单纯一个像素点的变化太不可靠,万一是噪声呢?所以,我们需要看一个“小团队”的变化。
这就是 SAD(Sum of Absolute Differences,绝对差值和) 登场的时候。你可以把它想象成一个非常勤快的侦察兵。它的工作流程是这样的:
- 划定侦察区域:对于当前帧里我们要处理的每一个像素点(比如中心点),侦察兵不会只看它自己。它会以这个点为中心,划出一个小的邻域窗口,比如一个 5x5 的像素方块(一共25个“兵”)。这个方块就是它的侦察范围。
- 对比历史快照:侦察兵手里有一张“上一帧”在同一位置、同样大小的5x5区域的像素值快照(这张快照是已经经过降噪处理的干净画面)。
- 计算差异总和:侦察兵把当前帧方块里的每一个像素值,减去上一帧对应位置像素值的绝对值,然后把这25个绝对值全部加起来。这个总和,就是SAD值。


4914

被折叠的 条评论
为什么被折叠?



