ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

ISP降噪选型:2DNR、3DNR与AI-NR原理及混合部署

ISP降噪选型:2DNR、3DNR与AI-NR原理及混合部署

做ISP调优的人大概都遇到过这种场面:同一颗sensor、同一套镜头,白天样张挑不出毛病,一到夜间或者室内弱光,画面就像撒了一层沙子;你把降噪强度往上推,噪点是没了,头发丝、织物纹理、远处招牌的字也跟着糊成一片;客户那边还追一句“为什么预览看着比拍照干净”。这时候讨论的已经不是“要不要降噪”,而是“用哪种降噪、放在哪一级、参数怎么收敛”。2DNR、3DNR、AI-NR这三条路线,本质上是在时间、空间、算力三个维度上做不同的取舍,选错了路线,后面再怎么调参都是在错误的地基上盖楼。这篇内容我想把这三者的原理拆开讲透,再说清楚什么场景该用谁、混着用的时候先后顺序怎么排,适合刚接手ISP tuning的同学,也适合需要给项目做方案决策的人。

1. ISP里那道降噪工序到底在跟什么较劲

1.1 噪声不是一种东西:从光子到暗电流的账本

很多人一上来就调降噪强度,连噪声是怎么来的都没分清,结果就是参数越调越乱。成像链路的噪声至少有三类来源,它们在不同亮度下的占比完全不同,处理手段也不一样。

第一类是光子散粒噪声,也叫 shot noise。光子打到感光像素上是一个随机过程,服从泊松分布,它的一个重要特性是方差等于均值,也就是说信号越强,绝对噪声越大,但信噪比反而越高。换算成实际感受就是:亮部看着干净,暗部一塌糊涂。这类噪声是弱光场景的主角,而且它是“乘性”的,跟信号强度绑定,所以降噪强度必须随增益变化,不能一个参数打天下。

第二类是读出噪声,包括复位噪声、源跟随器噪声、ADC量化噪声等,它在信号很弱的时候才显现出来,属于加性噪声,量级相对固定。第三类是暗电流噪声和固定模式噪声(FPN),前者跟温度和曝光时间强相关,后者是像素阵列本身的不一致性造成的条纹或网格,通常由DPC(坏点校正)和FPN校正环节处理,不属于常规降噪模块的职责范围。

把这几类合起来看,工程上最常用的近似是“泊松+高斯”混合模型:方差随信号均值线性增长,再叠加一个常数项。这个模型不是学术上的自娱自乐,它直接决定了你后面所有降噪模块的输入参数从哪来。

1.2 为什么降噪必须知道ISO和增益:噪声标定的实际操作

如果你看到某个降噪模块的接口里有“noise level”“sigma”“strength curve”这类参数,并且它们是按ISO分档给的,那说明这套pipeline是基于噪声模型工作的。参数从哪来?靠标定。

标定的常规做法是拍平场。把相机对着均匀光源(积分球或者均匀白板),在每一档增益下拍一组同曝光参数的帧,关掉所有降噪、锐化、伽马,输出线性RAW。然后对同一档位下的多帧求逐像素方差,再对空间做分块统计,得到“局部均值—局部方差”的散点图,用前面那个混合模型去拟合,就能解出散粒噪声的转换增益和读出噪声的底噪水平。这个流程听着简单,实操里有一堆细节要注意:

  • 平场必须真正均匀,光源不均会直接把空间低频当成信号,拟合出来的曲线会系统性偏高;
  • 每档增益至少要拍8到16帧,帧数太少方差估计本身噪声就很大;
  • 一定要在线性域做统计,很多人拿YUV或者伽马之后的图去算,曲线形状会完全变形;
  • 温度要记录,暗电流项对温度敏感,同一颗sensor在冬天和夏天的标定结果可能差出一截。

我见过不止一个项目,降噪参数是拍脑袋按“ISO 100给0.3,ISO 3200给0.8”这种线性映射写死的。这种做法在中间档位勉强能用,但一到高增益段就会出现“要么降不干净、要么糊成一片”,因为真实噪声曲线在高增益段并不是线性的,而且不同sensor的转折点差异很大。老老实实做一遍标定,后面调参会省掉大量返工。

1.3 降噪在pipeline的哪个位置动刀:Bayer域与YUV域的取舍

这个问题经常被忽略,但它决定了你能用哪种算法。降噪发生在Bayer域还是YUV域,效果和代价差别很大。

Bayer域降噪的优势在于:此时还没有做去马赛克,噪声是各通道独立的,没有经过色彩插值带来的通道间噪声相关性污染,理论上限更高。缺点是Bayer域每个像素只有单一颜色分量,空间分辨率实际上是打折的,做空域滤波时容易把高频细节和噪声一起抹掉,而且要考虑G通道数量是R/B的两倍这个采样不对称问题。

YUV域降噪的优势是直观:亮度噪声和色度噪声可以分开处理,色噪可以下重手而不影响细节,因为人眼对色度分辨率本来就不敏感。缺点是此时噪声已经被去马赛克和色彩矩阵“搅拌”过,通道间产生了相关性,噪声在频域上的分布也更复杂,某些颜色边缘会出现彩色伪影。

实际主流的做法是两段都用:Bayer域做一轮轻量的、以噪声模型为指导的初级降噪,主要目的是压住高增益下的散粒噪声,为后面的去马赛克减负;YUV域再做一轮针对性的亮度和色度降噪,这一级才是用户感知最明显的。2DNR和3DNR绝大多数部署在YUV域,AI-NR则两种都有,RAW域的网络这两年更常见。

2. 2DNR:只在一帧里做文章的极限在哪

2.1 空域滤波的三种武器与它们各自的代价

2DNR的核心思路就一句话:用同一帧内邻域像素的信息去估计当前像素的真实值。听起来简单,但“邻域怎么选、权重怎么给”决定了它的全部性能边界。

最基础的是线性低通,高斯核或者均值核。它的好处是实现极简、硬件代价低、没有收敛问题;坏处是它不区分噪声和细节,一视同仁地抹平,强度一大画面就像蒙了层塑料膜。这种方案在今天基本只出现在低端方案或者作为兜底。

往上一级是边缘保持型滤波,代表是双边滤波和高斯-双边混合。双边滤波在空间距离权重之外,又加了一个值域相似度权重:颜色差得远的像素,即使离得近,权重也压到接近零。这样边缘两侧的像素不会互相污染,边缘得以保留。代价是它引入了非线性,硬件实现需要查表或者分段线性近似,而且对强噪声输入,值域权重的判断本身就会被噪声干扰,出现“噪声被当成边缘保留下来”的现象。

再往上就是非局部均值(NLM)和BM3D这一类。NLM的思想是:图像里有很多相似的小块,把相似块的加权平均作为估计,比只看邻域更抗噪。BM3D更进一步,先做块匹配分组,再在变换域做协同滤波。这两者效果确实好,但计算量是前者的几十倍,纯软件跑单帧尚可,实时视频基本无缘,通常只在拍照后处理或者高端方案的离线通路里出现。

方案细节保留抗噪能力硬件代价典型部署位置
高斯/均值低通差中极低低端兜底
双边滤波中中中YUV域主流通路
导向滤波中上中中需要保边且低复杂度的场合
NLM好好高拍照后处理
BM3D很好很好极高离线/参考实现

2.2 边缘保持的实现细节:从双边到导向滤波

导向滤波在这几年的ISP里出现频率不低,原因是它有一个很实用的性质:计算复杂度与滤波窗口大小无关,可以做到O(1)每像素(用积分图或者盒式滤波近似)。它的核心假设是输出在局部窗口内是输入的线性变换,这个线性系数由局部均值和方差决定。方差大的窗口(有边缘或纹理),系数趋近于1,输出接近输入,等于不滤波;方差小的窗口(平坦区),系数趋近于0,输出接近局部均值,等于强滤波。

这个机制天然适配降噪场景,因为平坦区正是噪声最明显、也最应该被压的地方。但它有一个坑:纹理区和平坦区的判别依赖方差,而方差本身会被噪声抬高。在极高增益下,一片本该平坦的墙面,测出来的方差可能跟真实纹理差不多,导向滤波就判断错了,结果噪点残留。工程上的解法是把噪声标定得到的sigma作为先验,从测得的方差里减掉噪声方差,再去做判别。这一步做了和没做,弱光下的效果差异非常明显。

双边滤波的落地要点则在于值域权重的表设计。常见做法是把像素差映射到0到255,预先算一张查找表,硬件直接查。表的分段密度很关键:差值小的区间要密,因为噪声主要落在小差值区域,这里的分辨率决定了噪声抑制的细腻程度;差值大的区间可以稀疏。我见过一个项目的表在小差值段只有4个采样点,结果就是弱光下出现明显的“色块化”,因为相近的噪声值被量化到了同一个权重桶里。

2.3 亮度色度分开处理:色噪为什么必须重手

YUV域做2DNR,第一件事就是把Y和UV拆开。原因很直接:人眼对亮度细节的分辨力远高于色度,亮度通道要保细节,色度通道可以大幅降分辨率而不被察觉。

色噪在弱光下通常比亮度噪声更刺眼,因为它表现为大片的红绿斑块,视觉上极其不自然。处理手段一般是在色度通道上做更强的低通,甚至先降采样再升采样。常见的配置是色度滤波窗口比亮度大2到4倍,强度系数也高出一截。但这里有个必须注意的点:色度的大窗口滤波会在高饱和度的颜色边界处产生“颜色渗漏”,比如红色物体边缘出现一圈淡淡的红色光晕。压制手段是在色度滤波时同样引入亮度梯度作为引导,颜色边界处降低滤波强度。

还有一个容易被忽略的现象是色彩噪声的时变性。色噪在相邻帧之间的分布变化比亮度噪声更剧烈,所以纯2DNR处理色噪时,即使单帧看着还行,视频播放时也会看到色块在“跳动”。这也是为什么视频通路必须上3DNR的原因之一。

2.4 2DNR的实测表现与涂抹边界

在实拍对比里,2DNR的表现可以用一句话概括:中等噪声下够用,高噪声下必然在“脏”和“糊”之间二选一。当ISO推到比较高的档位,单帧内的信噪比已经低到邻域信息不足以区分噪声和细节的程度,任何空域算法都会面临同一个困境:判断为噪声就抹掉,判断为细节就留下,而真实情况是两者混在一起。

判断2DNR参数是否调到位,我一般看三个位置:一是头发和织物,这是最容易糊的地方,如果发丝变成一整片,说明强度过头;二是平坦渐变区(比如天空),如果出现块状或者条纹,说明滤波窗口的形状或者权重设计有问题;三是高对比边缘,看边缘两侧有没有出现振铃或者光晕。这三处都过关,2DNR才算调明白了。

3. 3DNR:用时间换画质的账怎么算

3.1 递归滤波的数学形式与记忆效应

3DNR的本质是把相邻帧的信息引进来做平均。因为噪声在帧间是不相关的,而真实场景在帧间高度相关,理论上帧数越多,噪声被平均掉的比例越高,理想情况下N帧平均能把噪声标准差压到1/√N。

工程上出于内存和延迟考虑,绝大多数实现用的是递归(IIR)形式而不是多帧缓存:

out(t) = alpha * cur(t) + (1 - alpha) * ref(t-1) ref(t) = out(t) // 参考帧更新

其中alpha是混合系数,取值0到1。alpha越小,时域平均越强,降噪越好,但运动响应越慢;alpha接近1,等于几乎不用历史帧,退化成纯2DNR。这个公式看着简单,但它意味着参考帧是“带记忆”的:一旦某一帧的错误被写进ref,它会以(1-alpha)的比例持续影响后续很多帧,这就是拖影和鬼影的根源。

实际实现里alpha不是全局常数,而是逐像素根据运动量动态计算的。这就引出下一个话题。

3.2 运动检测是3DNR的命门

3DNR的效果上限,几乎完全由运动检测的准确度决定。检测逻辑通常是这样的:对当前帧和参考帧在局部窗口内计算差异,差异小认为静止,给小的alpha(强时域滤波);差异大认为运动,给大的alpha(弱时域滤波,甚至完全用当前帧)。

听起来合理,但“差异大”这件事有两种可能:真运动和噪声。在弱光下噪声本身就很大,帧间差异天然就高,如果直接用绝对差值做判断,会把噪声误判成运动,导致时域滤波完全失效——画面该干净的地方还是脏的。所以运动检测必须做噪声归一化:把差值除以当前增益下的噪声标准差,得到归一化的运动量。这一步是把标定结果真正用起来的典型场景。

窗口大小的选择也是个权衡。窗口太小,单个像素的噪声波动就能触发误判,时域滤波断断续续;窗口太大,小物体的运动被平均掉,检测不出来,产生拖影。常见做法是多尺度:先用小窗口做像素级判断,再用较大窗口做区域一致性校验,两者结合决定最终alpha。有些实现还会引入亮度域和色度域独立的运动量,因为色度噪声更大,需要单独放宽阈值。

另外一个实用技巧是运动量的时间平滑:对运动检测结果本身做一次时域滤波,避免alpha在帧间剧烈跳变。alpha跳变会在画面上表现为噪点的“呼吸感”,静态场景下尤其明显,非常影响观感。

3.3 鬼影产生的三种典型场景与压制手段

鬼影(ghosting)是3DNR最经典的失效模式:画面上出现前一帧的残影,或者运动物体的拖尾。它通常出现在三种场景。

第一种是慢速运动。物体移动速度刚好处于运动检测的模糊地带,差值不够大,被判为静止,于是历史帧的信息被大量混入,物体后面拖出一条淡淡的影子。这类鬼影最难处理,因为阈值调低会引入噪声残留,调高又会误伤。常用的缓解手段是引入运动趋势判断:不只看当前帧差,还看差值在时间上的变化方向,持续增大的差值即使绝对值不大,也判定为运动。

第二种是遮挡解除。物体移开之后,原本被遮住的背景露出来,此时参考帧里存的是物体,当前帧是背景,两者差异巨大,正常情况下会被判为运动。但如果参考帧的“记忆”太强(alpha太小),恢复需要好几帧,就会看到背景“慢慢浮现”。解决思路是对差异极大的区域直接强制alpha=1,跳过时域滤波,也就是“宁可脏一帧,不要糊一片”。

第三种是全局亮度变化。自动曝光调整、闪光灯触发、场景切换时,整帧亮度突变,所有像素都被判为运动,3DNR瞬间失效,画面上噪点会“炸”一下。工程上的处理是在AE(自动曝光)收敛期间主动降低时域滤波强度,或者检测到全局亮度跳变时重置参考帧。这个联动经常被遗漏,结果是视频里每次曝光调整都伴随一次明显的画质抖动。

3.4 3DNR在视频与预览中的参数联动

3DNR的参数不是孤立的一套,它跟帧率、快门时间、防抖状态都有耦合关系。

帧率越高,帧间时间间隔越短,相邻帧的相关性越强,时域滤波的潜力越大,但同时单位时间内需要处理的帧数也更多。在30fps和60fps下,同一组alpha参数的效果是不一样的,通常60fps可以把alpha调得更小一些。

快门时间的影响更直接:快门越长,运动模糊越明显,帧间差异反而不那么大(模糊把运动“抹平”了),运动检测会偏保守,鬼影风险上升。所以在慢快门的夜景模式下,3DNR的运动阈值要相应放宽。

防抖状态则决定了画面整体的位移量。OIS工作时画面基本稳定,可以放心用强时域滤波;EIS(电子防抖)通过裁切和位移补偿实现,画面存在系统性的整体偏移,如果不做全局运动补偿就直接算帧差,整帧都会被判为运动。正确做法是先做全局位移估计(哪怕只是简单的块匹配或者投影曲线对齐),把全局位移补偿掉,再做局部运动检测。

场景条件alpha倾向运动阈值额外处理
静态拍摄、OIS开启小(强滤波)收紧无
手持视频、EIS开启中放松全局位移补偿
夜景慢快门中偏大放松防拖影优先
高速运动场景大(弱滤波)收紧强制运动优先
AE切换/场景切换临时置1不适用参考帧重置

4. AI-NR:神经网络到底替掉了哪一段

4.1 网络结构与感受野:为什么主流选择U-Net类编解码

AI-NR不是一个新概念,但它在ISP里真正落地,靠的是网络结构上的一个关键匹配:降噪需要大感受野,同时又需要像素级输出。这两点正好对上编解码结构。

U-Net这类结构的做法是:先用若干下采样层把分辨率降低、通道数增加,让每个特征点覆盖更大的空间范围(感受野扩大),此时网络“看得到”足够多的上下文,能判断哪些是噪声、哪些是结构;然后再逐级上采样恢复分辨率,同时通过跳跃连接把浅层的高频细节引过来,避免上采样过程丢失纹理。这个设计对降噪特别友好,因为噪声的判别本质上需要上下文,单个像素的邻域信息往往不够。

另一条路线是残差学习:网络不直接预测干净图像,而是预测噪声,然后用输入减去预测噪声。这种做法的好处是网络的学习目标更聚焦,收敛更快,而且在噪声较弱的区域,网络只需要输出接近零的值,不容易引入额外的结构失真。DnCNN那一套就是这个思路。

还有一类是多帧/时域网络,把相邻几帧一起送进网络,让网络自己去学帧间对齐和融合。理论上这是3DNR的升级版,能同时利用时域和空域信息,还能避免手工设计运动检测。代价是内存带宽翻倍、延迟上升,而且需要光流或者可变形卷积来做对齐,部署复杂度高,目前多见于对功耗不敏感的场景。

4.2 训练数据的合成与真实配对难题

AI-NR最大的工程难点不在网络结构,在数据。

理想情况下你需要“同一场景、同一时刻”的干净图和噪声图配对,这几乎不可能直接采到,因为任何真实拍摄都有噪声。业界的做法主要有三条。

第一条是合成噪声:拿干净图像(可以是高光下低ISO拍摄的,或者干脆用公开数据集),按照标定得到的噪声模型注入噪声。前面讲的泊松+高斯模型在这里派上用场:给定信号强度,按模型采样噪声叠加。这种方法的优点是配对精确、数据量无限,缺点是合成噪声跟真实噪声在空间相关性上存在差距——真实sensor的噪声经过一系列模拟和数字处理后,已经不是逐像素独立的了,某些sensor还有明显的行噪声和条纹。

第二条是真实噪声采集:在极低ISO或者短曝光下拍大量帧做平均,得到近似无噪的参考图,再跟单帧配对。这种方法得到的是真实噪声分布,但平均本身会引入运动伪影,需要严格对齐和剔除,而且采集成本高。

第三条是无监督/自监督:利用噪声帧本身构造训练信号,比如Noise2Noise的思路,用两张独立噪声的同一场景图互为监督。这对静态场景可行,动态场景依然要面对对齐问题。

实操中通常是混合策略:以合成噪声为主,掺入一定比例的真实噪声数据做微调。这里有个很实际的建议——合成噪声的参数不要只用理论标定值,要留一点扰动范围。因为实际产品的sensor批次、温度、增益曲线都有个体差异,如果训练时噪声模型过于理想,网络会在真实数据上出现“某些ISO段特别差”的现象。

4.3 部署侧的现实:算力、内存、延迟与量化损失

网络在服务器上跑出漂亮的PSNR,和在手机或者嵌入式设备上实时跑出好看的画面,是两件事。

算力方面,一个中等规模的U-Net在1080p分辨率上跑一次,即便经过剪枝和轻量化,也需要相当可观的MACs。很多平台的NPU算力是共享的,图像处理、人脸检测、场景识别都要抢,AI-NR能分到的预算往往比想象中少。所以实际部署的网络通常是“窄而深”或者“宽而浅”的权衡,通道数被压得很低,层数也不敢堆。

内存带宽是更容易被低估的成本。降噪是逐像素密集操作,输入输出都是全分辨率,中间特征图在多级编解码结构里会被反复读写。有些平台算力够但带宽不够,结果就是跑得动但跑不快,或者必须降分辨率处理——而降分辨率恰恰会丢失降噪最需要的细节信息。

量化是另一个坑。把浮点模型转成定点(通常是int8)能大幅提速,但降噪网络的输出是残差,数值范围很小,量化误差在这个尺度上占比很高。常见的现象是:量化后整体降噪能力还在,但平坦区出现轻微的块状或者色偏,弱纹理区出现“涂抹感”加重。缓解手段包括对第一层和最后一层保留更高精度、对残差分支做单独的量化缩放、以及在训练阶段引入量化感知训练。这些工作不做,量产后一定会被画面效果打回来。

延迟方面,AI-NR通常是帧级处理,不像3DNR那样逐像素流式处理,这意味着它可能引入额外的pipeline延迟。在预览和视频场景下,这个延迟会跟AE/AF的收敛速度、防抖的响应耦合,需要在系统层面做流水线排布。

4.4 AI-NR的失效边界:极端ISO与未见噪声分布

AI-NR不是万能的,它的失效模式跟传统算法性质不同,但同样存在。

第一类是极端高增益。当噪声强度超过训练分布的上限时,网络没见过这么脏的输入,表现会急剧下降:要么过度平滑,要么把噪声“结构化”成奇怪的纹理。很多网络在ISO超过某个阈值后,效果反而不如调好的3DNR。

第二类是噪声分布偏移。换一颗sensor、换一个温度区间、甚至同一颗sensor在不同增益下的噪声特性变化,都可能让网络的表现打折扣。这也是为什么AI-NR的落地往往需要针对具体硬件做数据闭环,通用模型直接拿来用,效果经常不如预期。

第三类是纹理与噪声的混淆。网络在训练中见过大量“噪声被抹掉”的样本,会形成一个倾向:遇到不确定的高频信息,倾向于当噪声处理。结果是细密的纹理(比如远景的树叶、砖墙、织物)被抹成一片,这种损失是不可逆的,因为它发生在信息层面而不是滤波层面。

第四类是色彩伪影。网络在RAW域或者YUV域处理时,如果训练数据里色噪样本不足,弱光下可能出现局部色偏或者彩色斑块。这类问题在大分辨率下看不太出来,一放大就很明显。

判断一个AI-NR模型能不能上,我一般会做一组“压力测试”:固定场景,从低ISO一路拍到高ISO,每个档位拍静态和动态各一组,重点看高增益段是否出现纹理丢失和色彩异常,以及动态场景是否有拖影。这套测试跑下来,模型的真实边界基本就摸清了。

5. 三种方案横向对比与选型决策

5.1 多维度对比表

把三者放在同一张表里,差异会更直观。需要说明的是,这里的“消耗”是相对量级,具体数值强依赖平台和实现。

维度2DNR3DNRAI-NR
信息来源单帧空域多帧时域+空域学习到的先验
降噪能力(弱光)中强强到很强
细节保留中,强度大时明显损失中上,静态场景好依赖训练,纹理区有风险
运动处理无影响需运动检测,有鬼影风险视结构,多帧网络也有拖影
内存开销低需参考帧缓存,中到高需特征图缓存,高
算力开销低低到中高
延迟无额外无额外(流式)可能有帧级延迟
参数调试难度低高(运动检测难调)中(调参少但数据难)
泛化能力强强弱,依赖训练分布
典型场景预览兜底、色度降噪视频、夜景多帧拍照后处理、旗舰夜景

5.2 按场景选型:预览/拍照/视频/低照

预览场景的第一约束是实时性和功耗。预览通常要长时间开着,功耗预算紧,算力也不能全给降噪。这个场景下2DNR是基本盘,配合轻量级的3DNR(alpha保守一些,避免鬼影在实时画面上太明显)是主流组合。AI-NR在预览里用得相对少,除非平台NPU有充足余量且做了专门的低功耗优化。

拍照场景的约束松得多,允许几百毫秒甚至更长的处理时间,也可以做多帧合成。这是AI-NR最能发挥价值的地方:多帧对齐加上神经网络降噪,能在保留纹理的同时把噪声压得很低。很多方案的做法是拍多帧、对齐、时域平均得到一张较干净的图,再送进AI-NR做最后的去噪和细节恢复。3DNR在这个链路里退化成“多帧平均”的一个环节,而2DNR主要负责色度预处理。

视频场景的核心是稳定性和一致性。逐帧效果好看不够,还要保证帧间不闪烁、不跳变。3DNR在这里几乎是必选项,因为它是唯一能在流式处理中利用时域信息的方案。AI-NR如果要用,通常是轻量模型,且必须保证帧间输出的一致性,否则会出现“呼吸”式的画质波动,观感比噪点还难受。

低照场景是最考验选型的。这个时候噪声极强,2DNR独木难支,3DNR受限于运动检测的可靠性,AI-NR受限于训练分布。实际有效的做法是组合:先用噪声模型指导的Bayer域降噪压住散粒噪声,再用保守参数的3DNR做时域累积,最后用轻量AI-NR做残余噪声清理和纹理恢复。三段各司其职,比任何单一方案硬扛都稳。

5.3 混合架构:把AI-NR放在3DNR前面还是后面

这个问题在实际项目里争论很多,我的经验是要看AI-NR的处理域和它擅长的东西。

如果AI-NR是RAW域模型,它通常放在3DNR之前。原因是RAW域噪声特性更接近独立同分布,网络处理起来更符合训练假设;而且先去掉大部分噪声,后面的去马赛克和色彩处理会更干净,彩色伪影更少。此时3DNR在YUV域做的是“锦上添花”,主要处理残余噪声和色噪。

如果AI-NR是YUV域模型,且带有时域能力,那它可以替代3DNR的位置;如果不带时域能力,放在3DNR之后更合理——让3DNR先把时域能利用的信息榨干,AI-NR只负责空域上的残余噪声和纹理判别。反过来的话,AI-NR先做一轮强空域平滑,会破坏帧间相关性,3DNR的运动检测精度会下降。

还有一个现实约束是调试闭环。AI-NR的参数少,但一旦出问题(比如某类场景纹理丢失),修改需要重新训练,周期长;2DNR/3DNR参数多但可即时调整。所以在产品化阶段,我会保留传统降噪的可调空间,把AI-NR的强度做成可配置档位,出现问题时有降级路径。这个设计在项目后期救过不少次场。

6. 联调现场最容易踩的几个坑

6.1 降噪和锐化的相互拆台

降噪和锐化在pipeline里是一对天然对手,它们的相互作用经常被低估。典型现象是:降噪强度调高之后,锐化环节把残余的噪声放大,画面上出现细密的“白点”闪烁;或者锐化过强导致边缘出现过冲,而后续的降噪又把这个过冲当成噪声抹掉,等于白做。

正确的处理顺序和参数配合是:降噪在前,锐化在后,但锐化必须知道降噪的强度。常见做法是把降噪强度作为一个输入,动态调整锐化的增益和阈值——降噪强的地方,锐化的阈值要相应提高,避免把噪声当边缘增强。反过来,锐化环节的边缘检测结果也可以反馈给降噪,让降噪在真实边缘处减弱强度。这种双向联调在很多方案里是缺失的,结果就是两个模块各自“看起来都对”,合在一起效果不行。

还有一个细节是色度通道不要锐化。色度锐化几乎只会放大色噪,对观感没有正面贡献,很多方案里色度锐化是默认关闭的,如果打开,一定要配合更强的色度降噪。

6.2 时域降噪与防抖、自动对焦的时序耦合

3DNR的参考帧机制决定了它对时序极其敏感。任何导致画面整体位移或者亮度突变的操作,都会打乱参考帧的有效性。

自动对焦的过程就是一个典型例子。对焦马达移动时,画面会经历一段模糊到清晰的过程,这段时间内的帧间差异很大,但又不是“物体运动”。如果运动检测不做区分,会把整段过程判为运动,3DNR失效,画面上噪点会明显增多。处理办法是在AF动作期间给3DNR一个“降级信号”,临时提高alpha,等对焦稳定后再恢复。

防抖的联动前面提过,这里补充一个细节:OIS的补偿量是可以读到的,把它转换成画面位移的先验,喂给运动检测做补偿,比纯粹靠图像估计要准得多,也更省算力。

还有一个容易被忽略的是AE收敛期间的参考帧管理。AE调整曝光时,如果增益变化较大,当前帧和参考帧的亮度基准不同,直接做帧差会全部判为运动。正确做法是在增益变化超过一定比例时,对参考帧做亮度归一化,或者干脆重置参考帧。不做这一步,视频里每次AE调整都会看到一次画质抖动,用户感知非常明显。

6.3 评测方法:怎么用客观指标加主观评估避免自欺

降噪的评测是最容易自欺的环节。PSNR和SSIM这类指标在降噪任务上有天然的偏向:它们奖励平滑,惩罚纹理。一个把细节全抹掉的算法,PSNR可能比保细节的算法还高。所以只看指标一定会调出“糊但分数高”的方案。

我的做法是三层评测。

第一层是受控场景的主观对比。固定灯箱、固定色卡和纹理板,从低照到高照拍一整套,重点看纹理板的细节保留和色卡的色偏。这一层靠人眼,但要有明确的评判清单:平坦区噪声、纹理区细节、边缘锐度、色噪、伪影。

第二层是客观指标的辅助验证。用带干净参考图的合成噪声数据集算PSNR/SSIM,主要用于横向对比不同算法的相对趋势,而不是绝对判断。另外可以补充一些针对性指标,比如平坦区的噪声方差(衡量降噪能力)、纹理区的梯度分布相似度(衡量细节保留),比单一的PSNR更有信息量。

第三层是动态场景的实拍验证。这是最容易被跳过但最重要的一层。静态场景下表现再好的3DNR,到了手持走动、物体进出画面、光线变化的场景里都可能崩掉。评测时要专门设计这些场景:慢速平移、快速摇镜、遮挡解除、明暗交替。鬼影和拖影只会在这些场景里暴露。

提示:评测时一定要关闭其他美化模块(美颜、HDR、色彩增强),否则你无法判断画质变化到底来自降噪还是别的环节。这个低级错误在实际项目里出现的频率比想象中高。

最后再分享一个我在实际项目里反复验证过的经验:降噪参数不要追求“一套参数打天下”,也不要在项目后期才想起来做分场景策略。比较省心的做法是在架构设计阶段就把“场景识别结果”作为降噪模块的输入预留出来,哪怕一开始只区分“静态/动态”“低照/正常”四个组合,后面扩展起来也比重构接口容易得多。另外,每一版参数调整都留一份带日期的样张归档,标注当时的增益、场景、参数组合,等到项目后期回头查“这个鬼影是哪一版引入的”,这份记录能救命。

返回列表