020、自动曝光AE:测光策略、曝光时间与增益分配、人脸AE的实战调优 020、自动曝光AE测光策略、曝光时间与增益分配、人脸AE的实战调优一、从一次“鬼影”调试说起去年夏天某款旗舰机的前摄在逆光场景下人脸区域反复出现“闪烁-过曝-变暗-再闪烁”的循环。用户反馈说“自拍像在呼吸”研发团队折腾了两周最后发现是AE的测光权重和曝光时间分配策略在作祟——人脸区域亮度变化时AE算法在“保人脸细节”和“保背景不过曝”之间反复横跳增益和曝光时间互相拉扯最终导致画面亮度震荡。这种问题在调试日志里很常见AE的收敛速度、测光区域权重、曝光时间与增益的分配比例任何一个环节没调好都会让画面“抽风”。今天这篇笔记就围绕这三个核心痛点展开。二、测光策略别把“平均测光”当万能钥匙2.1 测光模式的本质是“权重地图”很多工程师刚接触AE时以为测光就是算整帧的平均亮度。实际上测光策略的核心是如何给画面不同区域分配权重。常见的几种模式全局平均测光每个像素权重相等。适合光照均匀的场景比如阴天、室内均匀照明。但遇到逆光或强光源人脸会直接黑掉。中心权重测光画面中央区域权重高边缘低。适合主体在中央的构图比如证件照。但用户把脸挪到边缘算法就抓瞎。点测光只取画面中央1%-5%的区域。适合专业摄影但手机用户随手一拍点测光经常测到背景上。矩阵/多区测光把画面分成几十个区块每个区块独立计算亮度再根据场景类型如风景、人像、夜景动态调整权重。这是目前手机的主流方案。实战踩坑记录某次调试安防摄像头场景是仓库门口白天阳光直射晚上有路灯。用全局平均测光白天门口人脸过曝晚上人脸欠曝。后来改成矩阵测光并给画面下半部分行人区域额外加了30%的权重问题解决。关键点测光权重必须与场景的ROI感兴趣区域绑定。2.2 动态权重让算法学会“看场景”高级的测光策略不是固定模式而是根据场景自动切换权重分布。比如检测到人脸时人脸区域权重提升到60%以上背景权重降低。检测到夜景时避免高光区域如路灯、广告牌过度影响平均亮度。检测到运动物体时适当降低边缘区域的权重防止物体移动导致亮度突变。代码实现时的一个坑权重调整不能太激进。如果人脸权重突然从20%跳到80%AE的亮度目标值会剧烈变化导致画面闪烁。正确的做法是平滑过渡比如用IIR滤波器每次调整幅度不超过5%。// 这里踩过坑直接赋值会导致亮度跳变// 别这样写face_weight 0.8;// 应该这样face_weightface_weight*0.90.8*0.1;// 平滑过渡三、曝光时间与增益分配平衡噪声与运动模糊3.1 曝光三角形在数字时代的变形传统摄影讲“光圈、快门、ISO”三角但在手机Camera里光圈通常是固定的除非可变光圈所以AE主要调节曝光时间和增益模拟增益数字增益。分配原则很简单优先增加曝光时间因为曝光时间增加不引入噪声但会带来运动模糊。当曝光时间达到上限如1/30s时再增加增益增益会放大噪声但能避免手抖模糊。这个逻辑在静态场景下没问题但遇到动态场景就麻烦了。比如拍奔跑的小孩曝光时间太长会糊增益太高会噪。所以需要场景自适应检测到运动时限制最大曝光时间比如1/120s用增益补足亮度。检测到静止时允许曝光时间延长到1/15s甚至1/8s配合OIS降低增益噪声。3.2 增益分配模拟增益 vs 数字增益Sensor的增益分为模拟增益Analog Gain和数字增益Digital Gain。模拟增益在像素读出前放大信号噪声较低数字增益在ADC之后放大会同时放大噪声。所以优先使用模拟增益模拟增益用满后再用数字增益。实战经验某款Sensor的模拟增益范围是1x-16x数字增益范围是1x-8x。调试时发现当模拟增益超过8x后噪声已经很明显再增加数字增益画面就完全不可用。后来把模拟增益上限限制在6x剩余亮度用数字增益补但配合降噪算法效果反而更好。不要盲目追求“纯模拟增益”要结合Sensor的噪声曲线来定。// 这里踩过坑模拟增益上限设太高噪声爆炸// 别这样写analog_gain min(target_gain, 16.0);// 应该这样if(target_gain6.0){analog_gain6.0;digital_gaintarget_gain/6.0;}else{analog_gaintarget_gain;digital_gain1.0;}3.3 曝光时间与增益的“跷跷板”策略当场景亮度变化时AE需要同时调整曝光时间和增益。一个常见的错误是亮度变暗时先增加增益再增加曝光时间。这会导致噪声先变大然后才变暗。正确的顺序是亮度变暗先增加曝光时间直到上限再增加增益。亮度变亮先降低增益直到下限再降低曝光时间。这样能保证噪声始终处于最低水平。但要注意切换点当曝光时间达到上限时增益开始增加此时画面帧率会下降因为曝光时间变长需要配合帧率控制策略。四、人脸AE的实战调优从“能检测到”到“拍得美”4.1 人脸AE不是简单的“人脸区域测光”很多人以为人脸AE就是把人脸区域的亮度调到目标值。但实际场景中人脸亮度受背景影响很大逆光人脸暗背景亮。如果只保人脸背景会过曝成一片白。侧光人脸一半亮一半暗。如果取平均亮度亮部过曝暗部欠曝。多人脸主脸和副脸亮度不同该以谁为准实战方案人脸AE的核心是动态目标亮度。不是固定把人脸调到18%灰而是根据背景亮度、人脸位置、人脸大小、甚至肤色来调整目标值。逆光场景人脸目标亮度可以提高到22%-25%灰牺牲一点背景细节。侧光场景对人脸进行分区亮部区域权重降低暗部区域权重提高避免局部过曝。多人脸取最近、最大、或者有微笑的人脸作为主脸其他脸作为参考。4.2 人脸AE的收敛速度别让用户看到“闪烁”人脸AE最怕的是收敛过快或收敛过慢。收敛过快用户稍微转头画面亮度就剧烈变化收敛过慢用户从暗处走到亮处人脸一直黑着。调试经验人脸AE的收敛速度应该比普通AE慢30%-50%。因为人脸区域亮度变化通常比较平滑除非用户突然转头面对强光慢速收敛能避免闪烁。但也要设置一个急刹车机制如果人脸亮度变化超过20%立即快速收敛防止长时间欠曝或过曝。// 这里踩过坑人脸AE收敛太快用户转头时画面闪烁// 别这样写face_target_luma current_face_luma;// 应该这样if(abs(current_face_luma-last_face_luma)20){// 急刹车快速收敛face_target_lumacurrent_face_luma*0.7last_face_luma*0.3;}else{// 平滑收敛face_target_lumacurrent_face_luma*0.2last_face_luma*0.8;}4.3 人脸AE与HDR的配合现在很多手机支持HDR高动态范围人脸AE需要和HDR策略联动。比如逆光场景下HDR会合成多帧人脸AE的目标亮度可以设得更高因为HDR能保留背景细节。但要注意HDR开启时人脸AE的收敛速度要更慢因为HDR合成本身会引入延迟AE再快速变化会导致画面闪烁。一个实际案例某款手机在HDR模式下人脸AE的目标亮度从18%灰提高到22%灰同时收敛速度降低到原来的60%。结果逆光自拍时人脸亮度明显提升背景也没有过曝用户反馈“终于能看清脸了”。五、个人经验性建议测光权重不要写死给每个场景预留权重配置接口调试时通过log分析场景特征动态调整。我习惯在AE模块里加一个“权重调试模式”可以在运行时通过adb命令修改权重分布快速验证效果。曝光时间与增益的分配要结合Sensor的噪声曲线不同Sensor的模拟增益噪声特性差异很大有的Sensor在4x增益时噪声已经爆炸有的能撑到8x。建议在实验室测出Sensor的“噪声-增益”曲线作为分配策略的依据。人脸AE的“平滑”比“准确”更重要用户对亮度变化的敏感度远高于对绝对亮度的敏感度。宁可人脸稍微暗一点也不要让画面闪烁。我见过太多工程师追求“人脸亮度精确到18%灰”结果画面像呼吸灯一样忽明忽暗。别忘了帧率曝光时间增加会降低帧率帧率降低会导致画面卡顿。在AE策略里要设置一个“帧率底线”比如最低15fps低于这个帧率就强制增加增益哪怕噪声大一点。用户对卡顿的容忍度远低于对噪声的容忍度。最后一条也是最关键的AE调试没有银弹。每个Sensor、每个镜头、每个场景都有自己的脾气。多跑实际场景多收集用户反馈比在实验室里调参数有用得多。我见过最牛的AE调试是在地铁站、商场、公园里蹲点三天收集了上千张样张才把测光权重调好。