
1. 夕阳场景到底发生了什么把跳变拆成三个现象1.1 不是所有偏色都能叫跳变先区分渐变、突变和振荡接手过高通平台Camera调试的兄弟大概率都遇到过类似工单用户反馈手机在日落时拍视频画面颜色会突然从暖黄变成冷白过两秒又跳回去。这种问题挂在AWB自动白平衡头上没有争议但我要提醒一句接到问题先别急着动参数第一步是确认它到底属于哪一类异常。我们日常遇到的白平衡异常大致可以分成三种渐变性漂移色温随环境光缓慢变化画面从暖到冷是平滑过渡的观感正常。这种其实不算bug最多是用户觉得颜色不够氛围感。突变性跳变前后几帧之间画面色温发生明显跳变比如从5500K直接跳到3000K画面瞬间从白色变成橘红色或者反过来。这是本文要解决的核心问题。振荡性跳变画面颜色在两个色温之间来回摆动周期不定像呼吸灯一样。这种通常是收敛速度和迟滞hysteresis配置互相打架造成的比单纯的突变更难处理。为什么会把这三者混为一谈因为大多数现场反馈只有一段录屏没有log单看画面很难区分。但排查方向完全不同渐变偏色大概率是AWB算法在连续光照变化下的响应曲线问题突变跳变多半是色温估计器在某些光照条件下产生了歧义振荡则是稳定性和收敛性的平衡没做好。我自己的习惯是接到问题先连续录三到五段现场视频再配合log分析把跳变的发生时刻、持续时间、恢复方式都记录下来。你发现没有夕阳场景下出问题的case多数是突变型而且往往发生在太阳接近地平线到完全落山这个时间窗口里。这个窗口的光照条件极其特殊是AWB算法的天然雷区。1.2 为什么偏偏是夕阳场景最容易被触发很多人以为AWB跳变是算法笨其实不是。是夕阳场景的光照特性恰好踩中了色温估计器的几个薄弱点叠加区。日落时分的环境光是由多个光源叠加而成的太阳直射光、天穹散射光、地面建筑和云层的反射光再加上周围人工光源逐渐亮起的混合光。这几个光源的色温差异极大太阳直射光在低角度时色温可能只有2000K~3000K甚至更低而天穹散射光在上方可能是6000K~8000K的冷白光。两路光同时进入镜头打到sensor上的结果是画面中不同区域的R/G、B/G比值差异非常大同一帧里有的区域偏暖、有的区域偏冷。高通平台的AWB统计模块通常是基于整帧或者特定分区统计RGB平均值再通过某种色温估计模型推算当前光源色温。当画面里存在大量冷暖混杂区域时统计出来的均值可能就是一组不落在标准色温曲线上的点。色温估计器看到这组数据就会在两个甚至多个候选色温之间产生模糊判断。再加上日落阶段还有一个要命的特点亮度在持续下降。照度一低sensor的增益Gain就会往上抬尤其是R通道和B通道的增益差会拉得很大。增益一大噪声被放大AWB统计的稳定性就变差色温估计结果开始抖动。你在log里会看到AWB输出的色温值在相邻帧之间大幅度摆动比如上一帧3000K、下一帧突然8000K来回跳。这种环境光成分极端复杂照度持续下降增益放大噪声三件事叠加在同一个场景里AWB跳变几乎必然会来。这不是高通一家的问题MTK平台同样会踩只是两家平台的统计方式、算法库和tuning接口不同表现和调法有区别而已。高通平台因为有比较成熟的调试工具链定位起来会更直观一些但参数陷阱也多。1.3 高通ISP里AWB的完整数据路径以及哪一环最容易出问题要在高通平台上做AWB调试脑子里得先有一张数据流图。我简化一下方便后面讲参数时对得上号。sensor曝光输出RAW图后数据进入ISP前端首先经过坏点校正、黑电平校正、镜头阴影校正LSC然后进入三个统计模块AEC统计、AWB统计、AF统计。AWB统计模块会在设定的分区网格里输出每个区域的R/G/B平均值和饱和度等信息这些统计结果通过memory map传给上层的高通3A算法库不同平台演进中包括常见的AWB算法模块算法库根据统计值估算当前色温和光照增益输出R/G/B三通道的AWB增益。这个增益再回写到ISP的AWB通道乘到每个像素上完成白平衡校正。这条链路里最容易出问题的环节有三个AWB统计的ROI配置如果统计区域包含了过曝或过暗的区域统计信噪比会急剧下降。色温估计器在候选色温之间的选择逻辑当统计值落在两个色温区间边界时选左选右全靠算法内部的置信度判断。增益平滑/限幅策略算法算出了目标增益但在应用路径上如果缺少合理的平滑和限幅增益突变就会直接表现为画面色温跳变。我遇到过不少同事一上来就调算法库里的速度参数结果跳变没解决倒是把原本正常的场景调出了渐变迟钝。原因就是没搞清楚问题到底出在统计端还是估计端还是应用端。排查AWB跳变本质上就是顺着这条数据路径逐级定位先用log和数据排除法把问题锁定在某一环再针对性调参。2. 定位跳变从抓Log到离线复现的完整证据链2.1 抓Log前的准备工作3A log、stats dump、sensor info缺一不可调试AWB问题最忌讳的就是手里只有一段录屏就开始瞎调参数。参数调优必须有数据支撑而数据的第一步是抓log。高通平台抓AWB相关log我建议至少覆盖以下几类3A算法log这是核心里面会打印AWB估计的色温值、R/G/B增益、各通道统计值、收敛状态等信息。抓的时候要把3A log等级调到对应调试级别确保能完整看到每一帧的计算结果。stats logAWB统计模块的输出能看到每个分区zone的RGB平均值、亮度、饱和度等。这个log能帮你确认统计端是否正常ROI里有没有混入明显不该参与统计的区域。sensor log包括曝光时间、模拟增益、数字增益、帧率等信息。因为AWB跳变经常和照度变化绑定有了sensor log才能把亮度下降导致增益升高这个变量和色温跳变关联起来。帧信息/时间戳log方便你把跳变帧精确锚定到时间点和数据流里的其他事件对齐。抓log有个小技巧不要只抓跳变发生后的log要从跳变前至少5秒开始抓覆盖整个变化过程。因为AWB算法是有记忆的上一帧的状态会影响下一帧的收敛方向只看跳变后的log很容易漏掉触发条件。另外建议在抓log的同时录制sensor原始RAW图和isp pipeline处理后的图像。高通平台一般有对应的工具可以在线dump或者离线通过抓取的数据包回放。有了RAW图后续做离线复现和参数调整验证会方便很多。2.2 从log中锚定跳变帧看哪些字段、怎么判断先后顺序拿到log以后第一步是在log时间轴上找到画面颜色突变对应的帧位置。这个动作看起来简单但实际操作时有一个关键点log里打印的色温值和增益值与画面实际呈现的颜色之间存在一个延迟。这个延迟来自两个地方一是统计模块的曝光和读出需要时间二是算法计算完成后增益回写ISP、ISP再输出图像也需要时间。所以你在log里看到色温值突变的那一帧对应到录屏里的画面突变可能已经隔了几帧甚至十几帧。如果直接用log时间点去对画面很容易对不上。我惯用的做法是先根据log里AWB增益曲线的突变点向前回溯找统计值的异常点再根据帧号对应到画面上。具体看log时重点看这几个字段的变化估计色温值CCT看它在跳变前后的数值差是一下子跳了几千K还是有过渡。R/G、B/G增益值这是AWB直接输出的通道增益也是最直接影响画面的东西。看它是否突变突变方向。AWB置信度或状态标志很多算法库会输出当前估计的置信度如果跳变前置信度明显下降说明算法自己都拿不准。统计值均值看跳变前是否出现统计均值的明显异常比如亮度骤降、某个颜色通道统计值出现尖峰。一个典型的异常log模式是某帧开始AWB统计值中B/G突然飙升估计色温从5000K跳到9000KAWB增益里的R通道增益猛增。然后过几十帧统计值恢复色温和增益又跳回来。这种情况通常就是算法在多个候选色温之间做了错误选择。2.3 分不清色温跳还是增益跳做一个离线复现实验有时候log数据显示色温估计值没有跳但画面颜色明显跳了那就得怀疑是增益应用环节出了问题。反过来色温跳了但增益被算法平滑函数压住了画面可能也只有轻微变化。搞清楚到底是估计端跳还是应用端跳是调参方向的第一道分叉口。怎么判断我推荐做一个离线复现实验用抓到的RAW图数据在高通PC端的调试工具里离线跑AWB算法固定统计输入和sensor信息反复调整参数看看在相同输入下算法输出是否稳定。如果离线复现时算法输出也在跳那就是算法估计逻辑的问题如果离线复现正常但实机上跳那就要检查从统计到算法再到增益回写的整条链路有没有数据异常。另外一个实用技巧是在实机调试时把sensor固定在一个中间增益值即关闭自动曝光固定曝光时间和增益在均匀光源下观察AWB是否还会跳。如果在固定增益下AWB不跳说明跳变大概率是低照度高增益复杂光源共同作用的结果重点调增益相关参数和噪声对统计的影响如果固定增益下还跳说明是统计端或算法逻辑的问题要进一步查ROI配置和色温估计逻辑。这一步往往能省下大量无效调参时间。我自己调试生涯里至少有三分之一的AWB跳变case最后定位出来是统计端混入了异常区域而不是算法参数不行。3. 参数调优的取舍收敛速度、迟滞区间与增益上限怎么配3.1 收敛速度算法改多快取决于肉眼和预览帧率的默契真正进入参数调优阶段最常碰到的就是收敛速度相关参数。它决定了AWB在检测到色温变化后以多快的速度把增益调整到目标值。太快画面颜色会跟着统计值的抖动一起抖造成类似频闪的观感太慢画面从暖到冷的过渡会拖沓用户会觉得白平衡反应迟钝。高通平台通常会用类似阻尼系数或步长的参数来控制收敛速度。调整这个参数的核心原则是收敛速度必须和预览帧率、显示延迟匹配。30fps预览下如果目标增益变化在5到10帧内完成肉眼几乎感知不到过程但如果算法要求50帧才收敛用户在移动镜头时就会明显感觉到白平衡跟不上场景变化。对于夕阳场景的跳变问题我的思路是先区分环境色温真实变化和算法误判。如果色温确实在变化太阳在落山那收敛速度慢一点反而能营造平滑过渡感如果是误判导致的跳变收敛速度再快也只会放大问题必须从迟滞和统计端入手。所以收敛速度是调优的最后一步而不是第一步。先把误判解决掉再来匹配收敛速度的手感。3.2 色温区域迟滞给切换动作留出安全缓冲带迟滞这个参数在AWB调试里太重要了尤其是解决跳变问题。所谓迟滞就是算法在从一个色温区间切换到另一个色温区间前需要满足的额外条件。比如算法在3000K区域停留时只有统计结果明确指向2800K或更低的色温并持续一定帧数才会允许切换到更低的色温区间反向同样是带缓冲的不能一碰到边界就切。这个机制本质上就是给算法加上惯性让它在模糊判断时不至于反复横跳。很多跳变问题尤其是我前面提到的振荡型跳变就是迟滞设得太小或者没设好导致的。实际操作时迟滞的调整要结合色温区间的划分。高通平台的色温区间划分通常是一个二维映射一个是色温估计空间一个是通道增益空间。两者都要设置合理的迟滞带。常见错误是只调整了色温空间的迟滞但增益空间的迟滞没动导致算法判断色温没跳但增益却跳了画面还是闪。另外要注意迟滞也不是越大越好。迟滞太大会导致颜色在光照真实变化时不跟随比如从室内走到室外白平衡卡在室内的暖色调里迟迟不过来。这样的画面虽然稳定但色彩严重偏离。我在调试中见过project manager拿着这样的效果去给客户演示结果客户说颜色不对。3.3 最大增益兜底低照度下别让R/B通道过劳夕阳场景里另一个关键参数是通道增益的上限。之前说过日落时亮度持续降低sensor的模拟增益和数字增益都在爬升如果R通道或B通道的AWB增益再叠加上去很容易突破ISP允许的最大值。一旦增益被钳位白平衡就无法达到目标值画面会偏色而算法会继续朝这个方向使劲导致增益在边界处反复震荡。高通平台通常会有针对不同增益区间的最大AWB增益限制参数还可能区分正常照度和低照度两套限制策略。调这个参数的技巧是不要只设置绝对值上限还要考虑R、G、B三个通道上限之间的相对关系。举个例子低照度下如果B通道最大增益限制为2.0R通道限制为1.5而实际场景需要的B增益是2.5、R增益是1.2那B通道会被钳位画面偏暖且回不到目标值。这种情况必须微调限制比例而不是无脑把上限调大。上限调太大会带来另一个问题——低照度下噪声被大幅放大画面出现明显彩色噪点这种情况在天文摄影类的夜景case里尤其严重。所以我的调法是先把各个照度层级下三个通道的实际增益需求统计出来再基于统计结果设置上限留出10%~20%的余量然后再配合一档噪声抑制参数做平衡。3.4 一套参数调完先过这三个自测参数改完别急着提交先做三个快速自测都是我踩过坑以后沉淀下来的场景切换测试从室内暖光环境快速移到室外日光环境再走回来来回三次观察白平衡是否每次都稳定收敛有没有一次出现跳变或卡顿。缓慢变光测试找一个能缓慢调节亮度和色温的光源模拟夕阳场景从明亮暖光到昏暗冷光的渐进过程看白平衡是平滑跟随还是会出现突变。低照度静止测试在极低照度下保持手机静止拍摄静态物体观察30秒以上看有没有低频振荡的色温漂移。这个测试最容易暴露迟滞和最大增益配置的隐藏问题。这三个自测能覆盖大部分常见AWB回归场景。如果都过了再去做针对性的场景实拍验证。很多同学跳过了自测直接上车试拍结果花几个小时在路上还不如在实验室里10分钟把问题覆盖面摸一遍。4. 修好一个case不算完回归场景集和心理预期管理4.1 建立场景矩阵把夕阳拆成时间点×天气×光源AWB调试最怕的是什么是修好了一个case废掉了五个case。原因很简单你针对某个特定场景调整了参数但这个调整很可能会影响其他场景的表现。所以任何AWB调优都必须搭配一套回归场景集。针对夕阳场景我建议把夕阳这个模糊概念拆成一个场景矩阵至少包含以下维度时间维度太阳完全在水平线上、太阳刚接触水平线、太阳半落、太阳完全落山后的暮光阶段。每个时间段的光线色温变化速率完全不同。天气维度晴朗无云、薄云、厚云、雨后。云的遮挡会改变直射光和散射光的比例让色温曲线明显不同。环境维度空旷地平线、城市建筑轮廓、森林/山体遮挡、水面反射。不同环境的反射光和人工光源补光差异很大。人工光源维度日落时路灯/霓虹灯/车灯逐渐亮起与残余天空光形成混合光源这是最复杂的组合。我在实际项目中会把上述矩阵做成一张Excel表每个格子对应一个实拍场景调试完一个版本后在所有格子里过一遍记录主观评价和客观数据。这样做还有一个额外好处当客户提出某个场景偏色时你可以迅速定位到这个场景对应矩阵里的位置反向推断是哪个参数组合出了问题。4.2 混合光源、逆光与镜头暗角的耦合效应AWB跳变调完参数之后回归测试中大概率会遇到两类隐藏变量混合光源和镜头暗角。混合光源是指画面中存在两个或两个以上色温差异巨大的光源。夕阳场景最常见的就是黄昏天空高色温冷光和地面路灯低色温暖光同时入镜。AWB算法面对这种场景本质上是没有正确答案的——它只能选择一个全局折中的白平衡不可能同时让冷区和暖区都准确。用户感受如何取决于算法折中后画面整体气氛是否符合直觉。高通AWB在这种情况下往往会输出一个偏向画面主体区域的色温值前提是主体区域在统计权重里占优。如果你的ROI配置里包含了太亮的天空或者太暗的地面折中结果就会偏离主体。所以混合光源场景里AWB跳变很多时候是ROI权重配置问题而不是算法库问题。镜头暗角则是一个更隐蔽的变量。暗角Lens Shading如果校正不准确会让画面边缘的R/G、B/G比值与中心区域产生偏差。AWB统计如果覆盖到边缘区域这些偏差就会污染统计结果。高通平台虽然有LSC校正模块但校正参数往往是通用预设与具体模组的匹配不一定是100%。在夕阳这种低照度且色温分布不均匀的场景下暗角的影响会被放大很可能成为压死AWB的最后一根稻草。我在调试中遇到过一次很难复现的AWB跳变最后定位出来是某批次模组的镜头暗角一致性偏大导致AWB统计边缘区域时拿到了一组假信号。换回校正准确的模组同样的参数配置下问题完全消失。从那以后我调试AWB必看当批模组的LSC校正数据。4.3 模组一致性与产线校准的配合说到模组一致性这是AWB调试里最容易让人崩溃的环节。实验室里的reference样机调得好好的上了产线一批模组装出来用户手里五台手机四台偏色剩下那台还是薛定谔的偏色。原因在于AWB最终效果不仅取决于算法参数还很大程度上取决于sensor和镜头模组的个体差异。不同批次模组的色彩响应特性会有波动尤其是有色滤光片、微透镜、IR滤光片的一致性都会影响R/G/B通道的绝对响应。这些差异必须在产线端通过标定做一次归一化也就是通常说的AWB校准或者色彩校准。高通平台在这个环节通常会有对应的标定工具和校准流程。如果你在公司建议和产线同事确认一下这些数据的采集和写入是否正常。如果你是在做技术研究或个人项目至少要意识到手上一台样机调好的参数不代表整个模组批次都能用。批量验证时至少抽5台以上不同模组段的设备跑同一套场景观察色彩表现离散度。这里插一句我的个人经验很多AWB问题看似是算法问题实际上是标定数据质量或者标定流程执行不到位导致的。所以在调参之前先确认参考样机和批量样机的校准数据是有效的这个基本功省得你后期反复折腾。5. 我踩过的几个坑盘出来给各位参考文章最后分享几个实际项目里踩过、也花了不少时间才爬出来的坑。这些内容不一定写在任何调试文档里但碰上一次就知道价值。第一个坑过度依赖实验室标准灯箱。灯箱里的D65、A光源非常纯净AWB算法在这种环境下表现完美但一到户外就原形毕露。原因在于灯箱的光谱分布和真实太阳光谱差异巨大尤其缺少日落时段那种低角度直射光高色温散射光的极端组合。我的经验是实验室做初步筛选可以最终效果一定要以自然场景实拍为准。第二个坑把收敛速度参数调得过慢来掩盖跳变。这种方法表面上看画面不跳了实际上是在用迟钝掩盖误判。用户一移动镜头白平衡跟不上场景变化观感反而更差。正确做法还是回到跳变的根本原因上去解决。第三个坑忽略显示链路的色域映射。AWB调好了画面RAW数据正常但预览或出图时经过色彩校正、色域映射、饱和度增强等后处理颜色会被二次改写。有些时候你看到的跳变其实不是AWB跳而是CED色彩增强或饱和度调整模块在特定色相区域产生了阶跃。遇到这种情况建议关闭所有后处理模块输出最原始的sRGB/RAW图确认AWB输出本身是否正常再逐级排查显示链路。第四个坑也是我想重点强调的没有把AWB收敛结果稳定和AWB收敛结果正确分开验证。有些参数组合可以让AWB非常稳定地收敛但它收敛到的是一个错误的色温值画面稳定地偏蓝或者偏绿。这种情况在主观初看时可能被忽略但在后续画质评测或者客户对比测试时一定会暴露。所以每轮调参之后都要对标准色卡做客观色彩还原测试能用数学指标说话的就不要只凭眼睛感受。最后一个坑和流程有关改动参数前一定要做好备份和版本记录。AWB参数动辄几十上百个今天改了A明天改了B后天忘了A的影响结果调了一周发现是A和B相互作用导致的问题。我自己现在习惯每次调参前把当前参数文件完整导出、记录修改原因和预期效果哪怕只是改了一个数值。这样做短期看是增加了工作量长期看是救命的。AWB跳变这类问题本质上是光学系统传感器算法调试策略四者之间的平衡博弈。夕阳场景只是众多复杂光照条件中的一种但它提供了一个非常好的调试样本既有连续变化的环境光又有极端动态的增益范围还有混合光源的干扰。把这个场景彻底吃透你会对高通平台的AWB机制有比看十遍文档更深的理解。希望这篇东西能帮到正在被AWB跳变折磨的同行。如果有更好思路的欢迎多多交流调试这行永远是没有最好只有更适合某个场景。