007、图像质量劣化的熵增定律——RAW到YUV全pipeline中噪声/色彩/细节的逐步退化追踪 007、图像质量劣化的熵增定律——RAW到YUV全pipeline中噪声/色彩/细节的逐步退化追踪从一块偏色的屏幕说起上周三凌晨两点车载项目组的李工把一块屏幕拍在我桌上。屏幕上是夜间行车记录仪的预览画面整体偏紫暗部噪点像撒了一把盐远处路牌的文字边缘糊成一团。他说“ISP那边说RAW没问题3A也收敛了可YUV出来就是这副鬼样子。”我盯着屏幕看了十秒没急着开工具链。先问了他一句“你从哪个节点开始盯的”他愣了一下说“从YUV啊RGB都出来了还能有啥问题。”——这就是问题所在。绝大多数图像质量劣化不是某一个模块“做错了什么”而是从RAW到YUV的每一级处理都在“合法地”损失信息像熵增一样不可逆。你今天看到的偏紫、噪点、糊边是十几个模块各自贡献了5%的劣化叠加出来的结果。第一现场RAW域——你以为的“原始”早就不原始了很多人把RAW当成“没被处理过的真相”这是最大的误解。RAW sensor输出之前已经过了像素寻址、列放大器、ADC量化、黑电平钳位、坏点替换。这一层就有三个隐蔽的熵增源。第一个是列噪声Column Noise。CMOS的列并行读出架构决定了每一列有独立的放大器和ADC列与列之间的增益失配在暗场下会形成竖条纹。你去看暗部区域的FFT会在水平方向出现一条亮线。很多工程师在RAW域做DFC暗场校正时只做了减黑电平没做列向增益归一化结果竖条纹一路带到YUV在压缩后变成带状噪声比随机噪声更难去。第二个是量化噪声与截断。12bit RAW在暗部区域的有效bit可能只有6-7bit因为光子散粒噪声的均方根值本身就大于1个LSB。这时候如果你在RAW域做了任何非线性的增益比如数字增益补偿镜头阴影暗部的量化台阶会被拉伸产生banding。我见过有人为了省内存在RAW域直接右移两位变成10bit再送ISP暗部直接断层后面神仙算法都救不回来。第三个是坏点替换的“副作用”。坏点替换算法通常用邻域均值但如果在暗光下邻域本身噪声很大替换值反而引入了新的异常点。更麻烦的是有些坏点替换会破坏拜耳阵列的相位关系导致后续demosaic出现伪彩。所以坏点表要分亮度区间管理暗光下用中值亮光下用均值别一套参数打天下。第二现场Demosaic——细节与伪彩的第一次博弈Demosaic是整条pipeline里“信息创造”最多的环节也是熵增最剧烈的环节。因为它要从缺失的像素中“猜”出颜色猜的过程就是引入不确定性的过程。最典型的劣化模式是“紫边”Purple Fringe。高光边缘处R和B通道的插值方向不同导致边缘一侧R通道过冲、另一侧B通道过冲叠加出来就是紫色。很多工程师以为是镜头色差拼命调LSC镜头阴影校正的增益曲线其实根子在demosaic的方向判断上。方向判断用的是梯度但梯度在边缘处本身就不稳定一旦判错方向插值就从“沿边缘”变成“跨边缘”细节直接糊掉。另一个隐蔽问题是“锯齿”与“伪纹理”的权衡。边缘导向的demosaic算法比如AHD、DFPD在低噪声下表现很好但噪声一上来方向判断被噪声干扰反而比简单的双线性插值更糟。这就是为什么很多方案在暗光下会切换到低阶插值——不是算法退步是信噪比不支持高阶算法的前提假设。这里有个经验值当RAW域的SNR低于30dB时别用超过3x3窗口的方向性插值否则伪纹理比锯齿更难看。第三现场降噪——噪声与细节的零和博弈降噪是pipeline里最“反熵”的环节但反熵是要付出代价的。代价就是细节。我见过太多团队把降噪强度拉满结果画面像磨皮路牌文字边缘变成水彩画。问题出在降噪的“空间自适应”上。好的降噪应该在平坦区域重降、纹理区域轻降但“平坦”和“纹理”的区分本身就是个病态问题。边缘检测器在噪声下会误判把纹理当噪声抹掉或者把噪声当纹理保留。更麻烦的是时域降噪——运动估计不准时鬼影比噪声更刺眼。我的经验是降噪要分两级做。第一级在RAW域做轻量级空间降噪目标只是把SNR提升到demosaic能接受的水平别追求干净第二级在YUV域做时域空间联合降噪这时候有亮度/色度分离的优势可以在色度通道下重手亮度通道下轻手。很多人反过来在RAW域就下死手结果demosaic把降噪产生的伪结构当成真实纹理放大细节全毁。还有一个反直觉的点降噪参数要跟曝光时间联动。长曝光下噪声主要是固定模式噪声FPN短曝光下主要是随机噪声。FPN可以用帧间相减去掉随机噪声只能靠空间滤波。如果你用同一套降噪参数要么长曝光下FPN残留要么短曝光下细节被抹。所以降噪强度曲线应该是一条随曝光时间变化的斜线不是常数。第四现场色彩校正——矩阵不是万能的CCM色彩校正矩阵是pipeline里最“数学”的环节但也是最容易“过拟合”的环节。很多人拿着24色卡用最小二乘法拟合出一个3x3矩阵然后发现某些颜色尤其是肤色和天空蓝偏得离谱。根因在于CCM是线性变换但sensor的光谱响应是非线性的而且光源光谱也不是理想的黑体辐射。线性矩阵只能逼近不能精确。当你用最小二乘拟合时误差被平均分配到所有色块上结果就是“每个颜色都错一点点”看起来不严重但肤色只要偏2个ΔE人眼就能察觉。更隐蔽的问题是CCM与白平衡的耦合。白平衡增益是在RAW域做的CCM是在RGB域做的两者不是正交的。如果你在AWB里把R增益调高了CCM的R行系数会放大这个偏差。很多偏紫问题追根溯源是AWB的增益和CCM的系数在暗光下“共振”了。我处理过一个案例AWB在低色温下把R增益拉到1.8CCM的R行第一列系数是1.6两者相乘R通道整体增益接近3.0暗部噪声被放大9倍偏紫噪点同时爆发。我的建议是CCM的标定要分色温区间做至少分低色温2800K、中色温4500K、高色温6500K三组然后根据AWB的色温估计值做插值。别用一组矩阵打天下也别用高阶多项式拟合——过拟合的风险比欠拟合更大。第五现场Gamma与色调映射——对比度与色阶的终极博弈Gamma曲线是pipeline里最后一道“非线性整形”也是熵增的“放大器”。因为Gamma在暗部拉伸、亮部压缩暗部的量化误差和噪声会被放大亮部的细节会被压缩丢失。这里有个经典陷阱很多人为了“通透感”把Gamma曲线的暗部斜率调大结果暗部噪声被放大然后为了压噪声又去加强降噪降噪又抹了细节细节没了又去调锐化锐化产生了振铃……这就是一个典型的“劣化循环”每个模块都在弥补上一个模块的副作用最终图像质量比什么都不做还差。我的经验是Gamma曲线的设计要跟降噪、锐化联合优化不能单独调。具体做法是先定Gamma曲线然后根据Gamma的局部斜率推导出噪声放大系数再反推降噪强度分布最后根据降噪后的MTF损失来定锐化强度。这是一个闭环不是单点调优。还有一个容易被忽略的点Gamma对色度的影响。Gamma是作用在RGB三个通道上的但人眼对亮度敏感、对色度不敏感。如果你在Gamma之后做色彩饱和度调整暗部的饱和度会被过度提升产生“脏色”。正确做法是在Gamma之前做饱和度调整或者在YUV域对Cb/Cr单独做非线性映射。方法论沉淀熵增的五个阶段与三个干预点回头看整个pipeline图像质量的劣化遵循一个清晰的“熵增路径”RAW域列噪声、量化截断、坏点替换副作用——这是“源头熵”最便宜但最容易被忽视。Demosaic方向误判、伪彩、锯齿——这是“结构熵”一旦产生就难以消除。降噪细节损失、鬼影、伪纹理——这是“博弈熵”降噪和细节是零和博弈。色彩校正矩阵过拟合、AWB耦合共振——这是“系统熵”模块间交互产生的劣化。Gamma与色调映射暗部噪声放大、亮部细节丢失、色度脏化——这是“放大熵”把前面的所有劣化放大。三个干预点干预点一RAW域的质量门禁。在RAW域做完整的质量检测——列噪声水平、暗部有效bit数、坏点密度、SNR分布。如果RAW域SNR低于25dB后面的所有模块都别按默认参数跑要切换到“低照度模式”参数集。干预点二Demosaic与降噪的联合设计。别把demosaic和降噪当成两个独立模块。降噪强度要参考demosaic的方向置信度——方向置信度高的地方降噪轻一点置信度低的地方降噪重一点。这需要两个模块共享中间数据不能只靠接口传图像。干预点三Gamma与锐化的闭环调优。调Gamma时必须同时看锐化输出调锐化时必须同时看Gamma输出。用“局部对比度”和“振铃幅度”两个指标做联合评估别只看主观效果。个人经验性建议干了十五年影像我最大的体会是图像质量劣化不是某一个模块的“锅”而是整个pipeline的“系统性熵增”。你不可能在每个模块都做到完美但你可以做到“每个模块的劣化都在可控范围内且不放大上一个模块的劣化”。具体建议三条第一条建立“劣化预算”概念。就像功耗预算一样给每个模块分配一个“允许劣化量”。比如demosaic允许引入2%的伪彩降噪允许损失5%的高频细节CCM允许1.5个ΔE的色偏。总预算控制在人眼不可察觉的范围内。一旦某个模块超了预算别急着调它先看是不是上一个模块给它喂了“坏数据”。第二条调试时从后往前看设计时从前往后想。遇到画质问题先看YUV输出然后逐级往前查——Gamma、CCM、降噪、demosaic、RAW。每一级都输出中间结果对比找到第一个“劣化突变点”。但设计新pipeline时要从RAW开始每一级都为下一级“留余地”——比如demosaic别把方向信息用完留一点给降噪做参考降噪别把边缘信息抹光留一点给锐化做增强。第三条永远保留一个“最小处理链路”作为对照。在调试环境里保留一条只做黑电平校正线性化简单demosaic线性CCM的链路不做降噪、不做Gamma、不做锐化。任何画质问题先在这个链路上复现如果最小链路没问题说明问题出在高级模块的交互上如果最小链路也有问题说明源头在RAW或sensor。这个对照链路能帮你省掉至少一半的排查时间。最后说一句影像调试没有银弹每个项目都是“在约束条件下求最优解”。但理解了熵增定律你就知道——你的工作不是“消除劣化”而是“控制劣化的方向和速率”。有些劣化是不可避免的但你可以决定它发生在哪个环节、以什么形式出现、以及是否会被后面的环节放大。这才是架构师和调参侠的本质区别。