ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ISP降噪算法实战:2DNR、3DNR与AI-NR选型与调试指南

ISP降噪算法实战:2DNR、3DNR与AI-NR选型与调试指南 做ISP调试这行绕不开的就是降噪。去年接手一颗1/1.7英寸CMOS Sensor的夜景项目暗光下ISO飙到3200画面里的颗粒噪点、彩色麻点、边缘残留杂色全跑出来了甲方只丢一句话“画面给我弄干净。”我先动2DNR后台参数一拉噪点是压住了头发丝和皮肤纹理也跟着糊成一片换3DNR人站在原地不动效果惊艳可一转头后脑勺拖出半透明的鬼影后来硬把AI-NR模型从云端搬到端侧算力、带宽、功耗集体报警。这篇文章就是想把2DNR、3DNR、AI-NR这三条去噪路线在我项目里的实测数据、踩坑记录和选型思路整理出来给正在做ISP图像效果、Sensor调试、相机算法选型的同行一个参考。1. 别急着比算法先搞清ISP里“去噪”到底卡在哪个环节降噪不是孤立的一个模块它嵌在整条ISP pipeline里传感器噪声的特性、去噪模块的位置、前后模块的处理方式直接决定你该选哪种降噪策略。在对比2DNR、3DNR和AI-NR之前有两个背景必须梳理清楚。1.1 传感器噪声从哪里来散粒噪声、读出噪声与固定模式噪声很多刚从算法转来做ISP的朋友拿到一张满是噪点的图第一反应就是“上更强的滤波”。但噪声源头不同处理方式完全不一样。第一类是散粒噪声Shot Noise。光子到达传感器像素时是随机事件符合泊松分布。信号强度为N时噪声标准差是√N信噪比就是√N。这意味着场景越暗信噪比越低噪点越扎眼。散粒噪声是随机噪声没有固定的空间规律滤波时只能用统计方法压制2DNR空间域平均、3DNR时间域平均都能对付。第二类是读出噪声。PGA放大器和ADC在把电荷转成数字信号的过程中会引入与温度相关的热噪声。ISO增益升高读出噪声被同步放大这就是暗光下噪点急剧恶化的主要原因。读出噪声同样是随机的但不同传感器的底噪水平差异很大做算法前先摸清Sensor的底噪曲线比上来就调滤波器参数重要得多。第三类是固定模式噪声FPN和列噪声。这类噪声不随时间变化表现为固定的横条纹、竖条纹或像素点偏置差异。用常规的时域、空域随机噪声压制方法处理它效果很差甚至会把条纹“磨”得更开。实际ISP里通常先用坏点矫正DPC和Sensor层面的黑电平校准来消除固定模式部分处理不干净的部分才会流到降噪模块。另外还有暗电流带来的热噪点长曝光时尤其明显通常表现为散布的亮点。所以你看一个“噪点”名词背后是好几类物理机制。做选型前必须先采集分析Sensor在各级增益下的噪声特性方法是暗室拍摄灰卡统计图像的均值和方差分离出随机分量和固定分量。这一步做扎实后面就不会被算法效果牵着鼻子走。1.2 去噪在ISP pipeline中的位置RAW域、RGB域还是YUV域ISP的典型处理流程大致是RAW数据输入 → 坏点矫正 → 黑电平校正 → 去马赛克Demosaic → 白平衡 → 色彩校正 → Gamma → 降噪 → 锐化 → 输出。但不同平台会把降噪放在不同位置。RAW域降噪面临一个麻烦像素按拜耳阵列排列每个像素只有R、G、B中的一个通道不能直接使用常规的RGB滤波算法需要针对四个通道分别处理或者先做通道分离再降噪。优点是处理发生在信息损失之前能把噪声压制在源头上但处理不好容易在后续去马赛克时产生格子状伪彩。多数ISP方案会在去马赛克之后、色彩校正之前的RGB域或YUV域做主要降噪。此时图像已经是完整彩色图算法设计简单双边滤波、NLM这些成熟算法都能直接用。YUV域的好处是亮度噪声和色度噪声可以分开处理因为人眼对亮度的敏感度和对颜色的敏感度不同。3DNR通常放在YUV域做因为帧间融合需要完整的亮度信息来算运动矢量而且时域滤波后还要回到RGB域做后续色彩处理时损失会比较小。AI-NR在工程上多半放在末端精修避免它对整条pipeline产生不可控影响也让模型输入的图像风格更稳定。位置决定了约束。如果你用FPGA做ISP算力极其有限可能只做RAW域轻量2DNR加帧间平均如果是手机SoC算力充足才能考虑RAW域AI-NR。记住一个原则降噪越靠前算法可控性要求越高越靠后模型灵活性越大但对输入图像风格的一致性要求也越高。2. 2DNR空间域滤波为什么能长盛不衰2DNR二维降噪核心思路是一帧图像内部用周围像素的信息来估计当前像素的“真实值”。算力开销低、时延小、逻辑简单这是它在ISP里几十年没被淘汰的根本原因。2.1 核心原理双边滤波如何兼顾去噪和保边如果要选一个最有代表性的2DNR算法我会选双边滤波Bilateral Filter。它在普通高斯滤波的基础上加了一个“亮度权重”公式可以拆成两部分的乘积空间距离权重和亮度差值权重。空间距离权重是离中心像素越近权重越大这相当于普通高斯滤波负责对平坦区域做平均。亮度差值权重是像素值差异越大权重越小这让算法在边缘处“聪明”起来跨越边缘的像素虽然空间距离近但亮度值差得远权重被压得很低所以边缘不会被抹平。你可以把它想象成一群人在讨论一个问题空间距离代表谁坐得离你近亮度差值代表谁的观点跟你一致。最终你的答案只参考“坐得近”且“观点接近”的人这样既不会因为隔壁异见者干扰跑偏也不会漏掉身边同路人的信息。实际ISP里的2DNR还会用更复杂的算法比如NLM非局部均值把搜索范围从邻域扩展到整个图像块找相似纹理区域做加权平均降噪效果更好但计算量成倍上涨。从产品落地角度看双边滤波及其变体依然是性价比最高的选择。2.2 2DNR的典型实现思路与调参边界工程实现上标准双边滤波有四个参数窗口大小、空间域sigmaσ_s、亮度域sigmaσ_r和迭代次数。窗口大小常规选5x5或7x7。3x3太小降噪能力有限9x9以上对算力要求上升但效果提升不明显反而容易把纹理细节“洗”掉。空间域σ_s控制空间权重的衰减速度σ_s越大滤波越接近纯粹的低通细节损失越明显亮度域σ_r是保边关键σ_r越小对边缘保护越强但降噪能力被削弱。我常用的初始参数区间8bit图像σ_s取1.5到3.0σ_r取15到30。暗光高ISO时σ_r适当调大同时把窗口从5x5提到7x7。但这个区间只能当起点具体数值必须根据Sensor噪声水平重新标定。比较高效的做法是固定σ_s先拍一张低照度灰卡调整σ_r让背景噪声方差降到目标值再拍ISO12233分辨率测试卡检查边缘和纹理损失是否可接受。工程上还有个容易被忽略的坑exp函数在嵌入式DSP上逐像素调用极贵。实际实现一般用查表法预先算好亮度差值在0到255区间对应的权重值运行时直接查表。没有做查表优化的双边滤波1080P实时在低端DSP上是跑不动的。2.3 2DNR的软肋分辨率损失与“塑料感”2DNR的问题在夜景人像上暴露得最彻底。降噪强度拉到一定程度皮肤会变得像塑料一样光滑专业说法是“油画感”或“过度磨皮”。原因是人脸的皮肤纹理在空间域上与噪声频率接近滤波器无法区分真实纹理和噪声只能一起干掉。另一个典型问题是在高对比度边缘产生“光晕伪影”。强边缘两侧亮度差极大滤波后边缘位置会向暗侧偏移或产生一条明暗过渡带。这在文字、栏杆条状物体上尤其明显就是常说的“振铃感边缘”。所以我在实际项目中几乎不会把2DNR当作唯一的降噪手段。它适合做的定位是“轻度预处理”把明显的高频颗粒压一下给后续3DNR或AI-NR创造条件。目标不是让画面干净而是让画面“不脏”。3. 3DNR时间域融合的“作弊”优势与鬼影风险3DNR说白了就是利用视频相邻帧之间的高度相关性把多帧信息融合到一起来降噪。它在一个维度上占了便宜时间。3.1 多帧平均为什么效果“数学上就稳”信噪比提升公式假设场景完全静止每一帧图像里的真实信息都相同而噪声是独立随机的。把N帧图像逐像素取平均信号的幅度不变噪声却按√N的规律被压低。信噪比提升量等于10×log10(N) dB单位是分贝。这意味着2帧平均信噪比提升约3dB4帧提升约6dB8帧提升约9dB。相比2DNR在空间域的牺牲细节换平滑3DNR在静态场景里几乎不损失分辨率因为平均过程没有修改空间上的真实信息。这是它在安防摄像头、固定机位场景里备受青睐的根本原因。实际工程中的3DNR不会真的攒N帧再平均那样帧缓存和延迟都受不了。普遍用的是IIR递归结构输出帧 α × 当前帧 (1 - α) × 上一帧的滤波结果。α是融合系数静态场景α取0.2到0.3α越小时间平滑越强等效平均帧数越多。等效帧数大约等于(2 - α) / αα0.25时等效约7帧降噪增益大概8.5dB效果已经很可观。3.2 运动补偿与参考帧缓存3DNR的工程门槛3DNR最大的工程门槛不是算法本身而是“运动了怎么办”。如果场景里任何物体动了一下直接全局融合就会产生拖影——上一帧的人脸残影叠在当前帧的新位置。所以商用3DNR必须包含两个部分运动检测和自适应融合控制。运动检测通常把画面分成8x8或16x16的小块逐块计算当前帧与参考帧之间对应位置的SAD绝对误差和或MAD平均绝对误差。SAD低于阈值的块判定为静态块可以大幅降低融合αSAD高的块判定为运动块融合系数需要提高让当前帧信息占主导必要时完全跳过融合直接输出当前帧。这里有几个容易踩的坑。第一分块粒度太粗小面积运动比如人眼转动、飘动的头发会被“淹没”在16x16块里导致局部鬼影。第二阈值设太松低速运动检测不出来画面会出现那种“飘柔慢动作”般的拖影设太紧3DNR几乎不工作降噪效果直接归零。第三IIR结构下的历史帧本身累积了多帧的平均信息运动物体的新位置一旦进入历史帧会残留很多帧才被稀释掉这就是鬼影迟迟不消失的根因。还有参考帧的内存带宽问题。1080P的YUV420帧大约3MB如果做多帧双向参考DDR带宽和缓存开销都很高。很多安防SoC只做单参考帧加IIR就是被内存预算卡住的无奈之举。3.3 实测中最让人头疼的鬼影问题说一个我在项目中实际处理的案例。某款Sensor在夜间模式下做1080P视频3DNR开启后人物站着不动时画面确实干净但一个转身肩膀后方立刻多了一道半透明的“残影”。拿运动检测mask可视化一看发现16x16分块下人物上半身也被标记成了静态区域——因为人穿深色衣服在暗光下和背景的亮度差异本来就不大转身瞬间帧差反而小于阈值。这个问题的修复分三步。第一步把运动检测从纯亮度SAD改成亮度加梯度SAD梯度信息能捕捉到低对比度物体的轮廓变化。第二步运动块不再一刀切而是根据SAD大小做一个连续映射运动越大α平滑上升到0.9以上避免“静态块干净、运动块突兀”的跳变感。第三步运动区域融合系数升高后对当前帧做一次轻度2DNR补偿防止运动区域因为失去时间降噪而出现噪点爆发。另外要提一下滚动快门的影响。大部分CMOS是逐行曝光快速摇动镜头时画面不同行之间存在时间差做帧间对齐时会产生横向的“果冻撕裂”。凡是用3DNR的平台建议先把电子防抖或机械防抖的相关参数对齐否则3DNR会在运动补偿阶段放大这类形变。还有个经验是3DNR的调试顺序先确保运动检测mask画得准再回头调降噪强度。mask不对后面所有融合系数调得再好都是白搭。4. AI-NR数据驱动的另一条路算力、模型与集成代价AI-NR和前两者思路完全不同。2DNR和3DNR都基于先验的数学模型假设——空间平滑和时间平均而AI-NR通过大量成对数据直接学习“含噪图像到干净图像”的映射关系。它的效果上限高但工程代价也最大。4.1 基于CNN和Transformer的去噪网络怎么工作有代表性的网络可以分几代。DnCNN是入门级方案核心是残差学习输入噪声图网络预测的是“噪声本身”最终输出原本图像减去预测噪声这种设计让训练更稳定。UNet结构则在编码器-解码器之间加了跳连多尺度特征融合能力强能在抑制噪声的同时保留更多细节。后来Transformer架构比如SwinIR、Restormer利用自注意力机制建模长距离像素相关性在复杂纹理场景下表现更细腻但参数量和计算量又上了一个台阶。网络在训练时见过大量“干净-噪声”配对学会了什么情况下该平滑、什么情况下该保边并且能隐式识别出传统算法很难建模的噪声模式比如特定传感器在长时间曝光下产生的彩色斑点。这就是AI-NR主观效果好的原因它不是用固定规则“猜”真实画面而是从数据里“见过”了各种真实的画面退化过程。训练数据的获取是个大问题。最理想的数据是同一场景同一机位分别用不同曝光时间拍一对“干净-噪声图”但实际操作中场景只要有一点点变化配对就失效。业界常用方案是构建光学噪声模型用高斯泊松混合模型模拟传感器噪声再叠加暗角、坏点等特征做数据增强。模型在自己的噪声分布上效果很好但换一颗Sensor就可能崩这是AI-NR落地的主要障碍之一。4.2 端侧量化和真实噪声分布项目里最常见的翻车点我踩过的两个大坑很值得分享。第一个坑是训练数据域与真实数据的偏差。模型训练用合成的高斯泊松噪声但真实Sensor还有列噪声、FPN、坏点。有一次模型在特定色温下把本来不明显的横条纹噪声给“脑补”成了一条条水平纹理因为网络从没见过这种模式强行用学过的知识去匹配反而把伪影放大了。解决方向是收集真实Sensor的噪声样本进训练集退一步也要用更贴近物理模型的噪声生成方式单纯套用通用去噪模型的参数在ISP项目里走不通。第二个坑是端侧INT8量化。跑在DSP或NPU上模型通常要量化到8bit。暗光图像本身动态范围被噪声抬得很高量化后暗部细节的精度进一步丢失输出画面容易出现色阶断层原本轻微的颜色噪声反而被“量化”成了色块。我们试过对敏感层保留INT16或者用量化感知训练把量化误差在训练阶段就模拟进去效果比量化后微调好得多。算力也是硬门槛。一块常见的中等算力NPU1到2TOPS要跑720P、20层以内的去噪网络到达30fps实时非常吃力。可行方案是把输入先缩放到较低分辨率做粗降噪再结合2DNR在原始分辨率上补细节更激进的做法是只在暗光场景触发AI-NR光照充足时完全关闭把平均功耗压下来。4.3 AI-NR与传统NR的联动不是替代而是接力很多项目组听到AI-NR就想着“完全替代传统算法”这是误解。成熟方案里AI-NR往往扮演的是“最后一道精修”的角色而不是第一道主力。我的建议链路是RAW域先用轻量2DNR做前置预处理压低高频颗粒噪声和部分固定模式噪声避免这些噪声干扰AI-NR的输入分布YUV域用3DNR处理时域噪声静态区域细节保留成本低最后AI-NR对画面做空间精修专门处理传统算法比较头疼的暗部彩色噪声、边缘残留伪彩和局部色带。如果算力紧张AI-NR也可以只在极限暗光场景介入作为一个可切换的高画质模式。这样安排的原因很朴素传统NR可控可调出问题能定位AI-NR像一个黑盒出问题了很难解释是哪层网络、哪个特征图产生的调试成本很高。把AI-NR放在末端前端能滤掉的问题尽量在前端解决模型面对的就是风格相对稳定的输入性能也更可靠。5. 三种去噪路线的核心参数与实测对比我整理了一张能直接拿去汇报的表没有实测数据的对比都是耍流氓。我把自己在项目中用过的三套方案在同一个场景1/1.7英寸Sensor、ISO 3200、暗室D65光源、1080P 30fps视频下的表现整理成表再附上我比较看重的评估维度。对比维度2DNR双边滤波3DNRIIR时域融合AI-NR轻量CNN模型去噪域空间域单帧时间域多帧数据驱动单帧等效信号增益不可直接换算4帧融合约6dB模型相关主观提升明显静态场景细节保留中等窗口和σ_r过大就糊高几乎无损高但可能出现“假细节”运动场景表现无鬼影但可能有边缘伪影运动区域需额外处理易拖影无鬼影但可能丢失运动模糊信息算力开销1080P实时极低查表后可跑低端DSP中等主要是MEMC和参考帧带宽高通常需要独立NPU或高性能DSP内存带宽低较高需缓存参考帧高模型参数和中间特征图开销大调参自由度高参数直观可解释中依赖运动检测准确性低调参实际是重训或微调模型典型落地场景所有ISP的通用标配安防、固定机位视频旗舰手机夜景、计算摄影最主要的坑细节丢失、塑料感鬼影、运动拖尾训练域偏差、量化损失、算力功耗表格是给决策层看的但数据背后有个容易被忽略的趋势这三个方案不是“三选一”而是“层层递进”。我在夜景视频方案里的最终结构是2DNR轻度前置、3DNR作为主降噪、AI-NR只在另一个低延迟场景下做单帧精修。这样组合后主观画质评分从原来单用2DNR的6.5分提升到8.7分而整体功耗只增加了18%。期间我做过一个很反直觉的实验单帧静态照片场景下把AI-NR强度调满画面确实最干净但ISO12233测试卡上的某些高频纹理区域出现了“幻觉纹理”——网络脑补出了原图上根本没有的细密纹路。这件事给我提了个醒AI-NR的主观效果好不代表它“真实”。如果产品涉及医疗、工业检测、监控取证这类对真实还原度要求极高的场景AI-NR的输出可信度反而要打问号。6. 项目落地选型建议与调试避坑清单最后这部分是纯干活的东西没有理论推导全是项目里踩出来的经验。6.1 不同产品形态的选型框架先按产品形态对号入座别拿旗舰手机的标准去套低功耗IPC。手机主摄或旗舰级相机模块算力最充足建议“2DNR前置 3DNR视频降噪 AI-NR夜景单帧模式”三层联动。手机夜景模式本质就是多帧融合AI-NR放在多帧融合后做精修收益最大。安防监控和固定机位场景以静态为主3DNR性价比最高。重点投入运动检测的准确性静止画面下用极端α值获得最大信噪比提升。底层算力紧张的话2DNR做辅助就够了没必要上AI-NR。运动相机、车载记录仪、机器人场景高速运动全局时间融合扛不住。3DNR必须保守运动mask要画细可以依赖2DNR做主要空间降噪。AI-NR优先考虑因为在运动和快速变化的场景下模型推理的时延和功耗都可能成为产品负担。FPGA定制ISP或极低成本IP基本只有2DNR加简单帧平均。选型上不要抱有幻想应该在前端Sensor选型和镜头进光量上多下功夫而不是在算法上找补。6.2 调试顺序与几个容易忽略的细节调试顺序比想象中重要。我现在的标准流程是先确认Sensor黑电平校准准确、坏点矫正开启并把残余坏点压干净再检查白平衡是否漂移然后才进入降噪调试。黑电平不准会导致暗部偏色坏点没矫正完会让降噪算法把坏点“涂”成色斑这些前端问题不解决后面调NR参数全是白费功夫。降噪调参不要只在电脑前看效果图必须结合真实场景动态评估。2DNR用静态图和视频各调一遍视频中人脸转动、物体移动时是否产生闪烁感3DNR重点看快速左右摇头、车辆穿过画面这两个场景AI-NR额外看低照度下大面积纯色墙面是否出现色阶断层。评估指标上PSNR和SSIM只能作为参考最终以主观为主。我会用“噪声可见度 细节保留 边缘锐度 色彩准确度”四个维度打分每个维度让三到五个人分别评价取平均。处理得好不好看的判断标准永远是人眼说了算不是算法指标。最后分享一个我自己的体会刚入行时总想找“最强”的降噪算法几年项目做下来感悟变成“匹配才是王道”。2DNR是地基3DNR是主战武器AI-NR是精修工具用在正确的位置每个都能发挥价值盲目上最强方案往往被算力、功耗和调试周期反噬。做ISP降噪和做人有点像先搞清楚自己在什么条件下干活再选合适的工具。如果你正在为某个项目的降噪方案纠结不如先从这三个维度的基础分析开始噪声从哪里来场景动不动算力剩多少。把这三个问题回答清楚答案基本就出来了。
返回列表