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算法中的场景检测模块,可以实时判断当前场景类型,然后动态调整目标亮度。

我一般会这样设计调整逻辑:

  1. 统计直方图分布:看亮度峰值的分布位置。如果峰值集中在低区,说明是暗场景。
  2. 计算场景动态范围:用最大亮度减去最小亮度。动态范围大的场景,Target Luma 要适当提高。
  3. 检测背光标志:如果中心区域亮度远低于边缘,说明是背光。这时候要降低Target Luma,避免背景过曝。
  4. 应用场景因子:根据上述判断,查表得到一个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选取策略的完整流程。你可以把它当作调试时的检查清单。

目标亮度选取策略流程图 Target Luma 选取策略流程图 输入原始图像 场景检测模块 直方图 / 动态范围 / 背光判断 是否检测到人脸? 是 人脸优先曝光 计算人脸权重 + 内缩统计 否 全局场景因子调整 查表获取SceneFactor 计算最终Target Luma Base × SceneFactor × FaceFactor 输出Target Luma 注意:人脸分支和全局分支最终汇合,但人脸权重会覆盖全局场景因子

4.5 实战中的几个关键点

最后,我总结几个调试时容易踩的坑:

  • 人脸亮度目标值不要设太高:我见过有人把目标人脸亮度设到150,结果人脸是亮了,背景一片惨白。人脸比背景高10%-15%就够了。
  • 注意人脸检测的置信度:低置信度的人脸框不要用,否则AE会乱跳。我一般设置置信度阈值0.7以上才启用优先曝光。
  • 平滑过渡是王道:不管是场景切换还是人脸进出,Target Luma的变化一定要平滑。突然的亮度跳变,用户一眼就能看出来。
  • 多帧统计更稳定:不要用单帧的人脸亮度,用3-5帧的滑动平均。单帧噪声太大,容易导致AE来回震荡。

一句话总结:

Target Luma 的选取,本质是在“人脸要亮”和“背景不过曝”之间找平衡。没有万能公式,只有根据场景不断调参。