第三章 AE场景适配:背光/高动态/夜景场景的AE策略与权重矩阵调整

各位好,我是负责高通平台相机3A算法调优的工程师。今天咱们聊聊AE(自动曝光)的场景适配,特别是背光、高动态和夜景这三个老大难场景。

说实话,AE调优看着简单——不就是调曝光嘛。但实际做起来,你会发现每个场景都有自己的脾气。我刚开始做高通平台时,就被背光场景狠狠坑过一次。那次客户反馈人脸全黑,背景过曝,我查了半天才发现是权重矩阵没配好。

好,咱们直接进入正题。

3.1 背光场景的AE策略

背光场景的核心矛盾是什么?主体暗、背景亮。相机默认的全局测光会把背景当作主要参考,结果主体就黑成一团。

核心思路:让AE优先保证主体(通常是脸部)的亮度,哪怕背景稍微过曝也在所不惜。

3.1.1 背光检测机制

高通平台的背光检测主要靠两样东西:

  • 亮度直方图分析:如果直方图呈现明显的双峰分布(一个暗峰对应主体,一个亮峰对应背景),基本可以判定是背光。
  • 人脸检测结果:如果人脸区域的平均亮度远低于整体画面平均亮度,触发背光模式。

我个人习惯在AE算法里加一个背光置信度参数,取值范围0~1。当置信度超过0.6时,开始介入权重调整。

3.1.2 权重矩阵调整

权重矩阵说白了就是告诉AE芯片:哪些区域更重要,多给点曝光权重。

高通平台的AE权重矩阵通常是15x15或17x17的网格。默认情况下,所有网格权重相等。背光场景下,我们需要把权重向人脸区域集中。

// 高通平台AE权重矩阵调整示例(伪代码)
// 假设矩阵尺寸为 15x15

void adjust_backlight_weight(uint8_t *weight_matrix, 
                              face_rect_t *face, 
                              int matrix_size) {
    int center_x = matrix_size / 2;
    int center_y = matrix_size / 2;
    
    // 1. 先重置所有权重为1.0
    for (int i = 0; i < matrix_size * matrix_size; i++) {
        weight_matrix[i] = 1;
    }
    
    // 2. 根据人脸位置计算权重分布
    // 人脸区域权重提升到3~5倍
    int face_grid_x = face->x * matrix_size / sensor_width;
    int face_grid_y = face->y * matrix_size / sensor_height;
    int face_grid_w = face->width * matrix_size / sensor_width;
    int face_grid_h = face->height * matrix_size / sensor_height;
    
    for (int y = face_grid_y; y < face_grid_y + face_grid_h; y++) {
        for (int x = face_grid_x; x < face_grid_x + face_grid_w; x++) {
            weight_matrix[y * matrix_size + x] = 5;  // 5倍权重
        }
    }
    
    // 3. 背景区域适当降低权重(0.5倍)
    // 避免背景过曝太严重
    for (int i = 0; i < matrix_size * matrix_size; i++) {
        if (weight_matrix[i] == 1) {
            weight_matrix[i] = 0.5;
        }
    }
}

我的经验:权重不要调得太极端。我曾经把人脸权重设到10倍,结果人脸是亮了,但背景完全过曝,整个画面看起来很不自然。一般3~5倍就够用了。

3.2 高动态场景的AE策略

高动态场景(HDR)和背光有点像,但更复杂。画面里既有极亮区域(比如窗户、天空),又有极暗区域(比如阴影里的物体)。

说白了,单次曝光根本搞不定。这时候就需要多帧合成或者局部曝光调整。

3.2.1 高动态检测

高动态场景的检测指标:

  • 动态范围比:画面最亮区域和最暗区域的亮度比值超过1000:1
  • 直方图跨度:直方图从0一直延伸到255,中间没有明显断层

3.2.2 多帧HDR的AE策略

高通平台支持两种HDR模式:

HDR模式 原理 适用场景 AE策略
ZSL HDR 连续拍摄多帧,每帧不同曝光 运动较少的场景 AE锁定在中间帧,短帧和长帧围绕中间帧偏移
非ZSL HDR 先拍一帧长曝光,再拍一帧短曝光 静态场景 AE分别计算长帧和短帧的目标亮度

我记得有一次做ZSL HDR调优,发现合成后的画面有鬼影。查了半天,原来是AE在短帧和长帧之间切换时,曝光时间变化太大,导致运动物体位置不一致。后来我加了一个曝光时间平滑过渡机制,问题就解决了。

3.2.3 权重矩阵在HDR中的应用

高动态场景的权重矩阵调整和背光不太一样。背光是集中权重,HDR是分散权重。

为什么?因为HDR需要同时保留亮部和暗部的细节。如果权重太集中,暗部细节可能被忽略。

// HDR场景权重矩阵调整策略
// 目标:让亮部和暗部都有足够的权重

void adjust_hdr_weight(uint8_t *weight_matrix, 
                        int matrix_size,
                        uint8_t *luma_map) {
    // luma_map 是每个网格的平均亮度值
    
    for (int i = 0; i < matrix_size * matrix_size; i++) {
        uint8_t luma = luma_map[i];
        
        if (luma < 30) {
            // 暗部区域:权重提升到2倍
            weight_matrix[i] = 2;
        } else if (luma > 200) {
            // 亮部区域:权重提升到1.5倍
            weight_matrix[i] = 1.5;
        } else {
            // 中间区域:保持默认
            weight_matrix[i] = 1;
        }
    }
}

注意:HDR场景下,权重矩阵的调整要和多帧合成算法配合。如果权重矩阵让暗部权重过高,合成算法可能会过度提亮暗部,导致噪声放大。我建议权重调整幅度控制在2倍以内。

3.3 夜景场景的AE策略

夜景场景的挑战和前面两个完全不同。背光和HDR是动态范围问题,夜景是信噪比问题。

说白了,光线不够,信号弱,噪声大。AE的目标变成了:在保证画面不糊的前提下,尽量延长曝光时间。

3.3.1 夜景检测

高通平台的夜景检测主要看:

  • 环境照度:低于50 lux触发夜景模式
  • 信噪比估计:如果SNR低于20dB,说明噪声已经很明显了

3.3.2 夜景AE策略

夜景AE的核心是曝光时间与ISO的平衡。延长曝光时间可以降低ISO,减少噪声,但手抖会导致模糊。提高ISO可以缩短曝光时间,但噪声会变大。

我个人的经验是:

  1. 优先延长曝光时间,直到达到安全快门速度(一般是1/焦距秒)
  2. 如果还不够亮,再提高ISO
  3. ISO上限控制在1600以内,超过这个值噪声就太明显了

关键参数:夜景场景下,AE的目标亮度可以比正常场景低一些。正常场景目标亮度是18%灰(约128亮度值),夜景可以降到10%灰(约80亮度值)。这样画面看起来更真实,不会出现“夜景拍成白天”的假象。

3.3.3 夜景权重矩阵

夜景的权重矩阵调整思路是:抑制高亮区域,保护暗部细节。

为什么?因为夜景画面里通常有路灯、车灯等高亮光源。如果权重矩阵给这些区域太高权重,AE会降低整体曝光,导致暗部更暗。

// 夜景场景权重矩阵调整
// 抑制高亮区域,保护暗部

void adjust_night_weight(uint8_t *weight_matrix, 
                          int matrix_size,
                          uint8_t *luma_map) {
    for (int i = 0; i < matrix_size * matrix_size; i++) {
        uint8_t luma = luma_map[i];
        
        if (luma > 200) {
            // 高亮区域(路灯、车灯):权重降到0.3
            weight_matrix[i] = 0.3;
        } else if (luma < 50) {
            // 暗部区域:权重提升到1.5
            weight_matrix[i] = 1.5;
        } else {
            weight_matrix[i] = 1;
        }
    }
}

3.4 三种场景的对比总结

场景 核心问题 AE策略 权重矩阵调整方向 关键参数
背光 主体暗、背景亮 优先保证主体亮度 集中权重到人脸区域(3~5倍) 背光置信度阈值0.6
高动态 亮部和暗部细节都要保留 多帧HDR,不同曝光 分散权重,亮部和暗部各1.5~2倍 动态范围比>1000:1
夜景 信噪比低,噪声大 延长曝光时间,控制ISO 抑制高亮区域(0.3倍),保护暗部(1.5倍) 目标亮度降至80,ISO上限1600

3.5 场景自适应切换流程

在实际产品中,AE需要根据场景自动切换策略。下面是我常用的切换逻辑:

AE场景自适应切换流程 场景检测开始 检测环境照度 & 直方图 & 人脸 背光场景 人脸暗 + 背景亮 高动态场景 动态范围 > 1000:1 夜景场景 照度 < 50 lux 背光AE策略 人脸权重5倍 + 背景0.5倍 HDR AE策略 多帧曝光 + 亮暗部分散权重 夜景AE策略 延长曝光 + ISO上限1600 应用权重矩阵 & 输出AE参数 说明:场景检测每帧执行,检测到场景变化时立即切换策略,避免画面闪烁

避坑指南:我曾经在场景切换时没有做平滑过渡,结果画面在背光和正常模式之间来回跳,用户反馈说“相机在抽风”。后来我加了滞回比较器——进入背光模式需要置信度超过0.6,退出背光模式需要置信度低于0.4。这样就不会频繁切换了。

3.6 实战调优建议

最后,给大家几个实战中的小建议:

  • 不要迷信默认参数:高通平台的默认AE参数是通用配置,针对你的具体传感器和镜头,一定要重新调。
  • 多拍log:每次调优都要保存AE的log,包括目标亮度、实际亮度、曝光时间、ISO、权重矩阵等。这样出了问题才能回溯。
  • 关注用户体验:AE调优不只是技术活,还要考虑用户感受。比如夜景模式,用户按下快门后等2秒出片,体验就很差。我一般会把夜景模式的曝光时间控制在1秒以内。