4. 目标亮度设定
目标亮度,说白了就是AE算法死磕的那个“理想亮度值”。
你想想看,相机对着同一个场景,白天和晚上想要的效果肯定不一样。如果AE死守一个固定值,那画面不是过曝就是欠曝。所以,Target Luma 的选取,是整个AE收敛的灵魂。
我个人习惯把目标亮度分成三层来看:基础层、场景层、人脸层。下面我们一层层拆开讲。
4.1 基础目标亮度:从“18%灰”说起
做ISP的都知道,传统摄影里有个“18%中性灰”的概念。相机测光系统默认把世界平均亮度映射到18%灰。但在手机ISP里,我们通常用Y值或者Luma code来表示。
在高通Spectra平台上,Target Luma 的默认值通常在 100~120(10bit数据,0-1023范围)。这个值对应的是画面平均亮度。
核心公式:
Target Luma = BaseLuma × SceneFactor × FaceFactor
其中 BaseLuma 是基础值,SceneFactor 是场景因子,FaceFactor 是人脸因子。
我在项目中遇到过一个问题:默认的110在室内看起来挺好,一到户外大太阳下,画面就偏暗。后来发现是没考虑场景的动态范围压缩。嗯,这里要注意,基础值不是万能的。
| 场景类型 | 推荐基础Target Luma (10bit) | 说明 |
|---|---|---|
| 室内正常光照 | 100-110 | 标准参考值 |
| 室外晴天 | 120-130 | 需要补偿高动态范围 |
| 夜景/低照度 | 80-95 | 防止噪点被过度提亮 |
| 背光场景 | 110-120 | 需要结合HDR策略 |
4.2 基于场景的动态目标调整
固定一个Target Luma肯定不行。高通Spectra平台提供了AEC算法中的场景检测模块,可以实时判断当前场景类型,然后动态调整目标亮度。
我一般会这样设计调整逻辑:
- 统计直方图分布:看亮度峰值的分布位置。如果峰值集中在低区,说明是暗场景。
- 计算场景动态范围:用最大亮度减去最小亮度。动态范围大的场景,Target Luma 要适当提高。
- 检测背光标志:如果中心区域亮度远低于边缘,说明是背光。这时候要降低Target Luma,避免背景过曝。
- 应用场景因子:根据上述判断,查表得到一个0.8~1.2的系数,乘到基础值上。
我的调试经验:
我曾经在调试一个户外运动相机时,发现场景切换时Target Luma跳变太大,导致画面闪烁。后来加了一个低通滤波器,让目标值平滑过渡。具体做法是:
Target_smooth = α × Target_new + (1-α) × Target_old
α取0.3左右,效果就很好了。
4.3 人脸优先曝光逻辑
这是AE调试里最核心也最头疼的部分。人脸优先,说白了就是:人脸要亮,背景可以牺牲。
高通Spectra平台的人脸检测FD模块会返回人脸区域的位置和大小。AE算法拿到这些信息后,会做两件事:
- 计算人脸区域的平均亮度:只统计人脸框内的Y值。
- 计算人脸权重:人脸越大、越靠近中心,权重越高。
最终的Target Luma 会被人脸因子修正:
// 伪代码示例:人脸优先曝光逻辑
if (face_detected) {
face_luma = get_face_avg_luma();
face_weight = calculate_face_weight(face_size, face_position);
// 目标人脸亮度:通常比全局目标高10-20%
target_face_luma = base_target_luma * 1.15;
// 计算需要调整的增益
luma_error = target_face_luma - face_luma;
gain_adjust = luma_error * face_weight * 0.5;
// 限制调整幅度,防止突变
gain_adjust = clamp(gain_adjust, -0.3, 0.3);
final_target_luma = base_target_luma + gain_adjust;
} else {
final_target_luma = base_target_luma;
}
避坑指南:
我曾经遇到过一个很坑的问题:人脸检测框包含了部分背景,导致人脸亮度统计不准。比如人脸旁边有盏灯,框进去后亮度虚高,AE反而把人脸压暗了。
解决办法是:对人脸框做内缩处理,只取人脸框中心60%-70%的区域做亮度统计。这样能有效排除背景干扰。
4.4 整体知识框架
下面这张图,是我自己总结的Target Luma选取策略的完整流程。你可以把它当作调试时的检查清单。
4.5 实战中的几个关键点
最后,我总结几个调试时容易踩的坑:
- 人脸亮度目标值不要设太高:我见过有人把目标人脸亮度设到150,结果人脸是亮了,背景一片惨白。人脸比背景高10%-15%就够了。
- 注意人脸检测的置信度:低置信度的人脸框不要用,否则AE会乱跳。我一般设置置信度阈值0.7以上才启用优先曝光。
- 平滑过渡是王道:不管是场景切换还是人脸进出,Target Luma的变化一定要平滑。突然的亮度跳变,用户一眼就能看出来。
- 多帧统计更稳定:不要用单帧的人脸亮度,用3-5帧的滑动平均。单帧噪声太大,容易导致AE来回震荡。
一句话总结:
Target Luma 的选取,本质是在“人脸要亮”和“背景不过曝”之间找平衡。没有万能公式,只有根据场景不断调参。