3、AE算法实战:亮度统计直方图、目标亮度设定与权重区域划分

AE(自动曝光)调得好不好,说白了就是看两件事:画面亮不亮和哪里该亮。我做了这么多年ISP,见过太多“整体亮度OK但人脸死黑”或者“天空过曝一片白”的案例。今天咱们就把AE最核心的三个东西讲透:亮度统计直方图、目标亮度怎么定、权重区域怎么划。

3.1 亮度统计直方图——AE的眼睛

直方图这东西,你打开任何一款相机App都能看到。但在安防监控里,它的意义完全不同。监控画面往往有大面积的背景(墙壁、天空、路面),这些区域如果参与统计,会把AE带偏。

核心概念:亮度直方图统计的是画面中每个像素的亮度值分布。横轴0~255(8bit),纵轴是像素数量。AE算法通过分析这个分布来决定“画面是暗了还是亮了”。

我个人习惯把直方图分成三个区:

  • 暗区(0~85):阴影、低照度区域。如果这里像素太多,画面会偏暗。
  • 中灰区(86~170):主体区域。人脸、车牌、目标物体通常落在这里。
  • 亮区(171~255):高光、天空、灯源。这里像素太多容易过曝。

我在项目中遇到过一个问题:某款IPC在夜间模式下,画面整体偏暗,但直方图显示暗区像素占比高达70%。按理说应该提亮,但一提亮,路灯区域就过曝了。后来怎么解决的?——把路灯区域从统计中排除。这就是权重区域划分的雏形。

3.2 目标亮度设定——你到底想要多亮?

目标亮度(Target Brightness)是AE的“指挥棒”。它告诉算法:画面平均亮度达到多少才算“正常”。

这个值不是拍脑袋定的。我见过很多工程师直接设128(8bit中值),结果画面要么灰蒙蒙,要么亮得刺眼。为什么?因为监控场景的“正常亮度”和消费相机不一样。

场景类型 推荐目标亮度(8bit) 说明
室内明亮场景 140~160 光线充足,目标亮度可以高一些
室内暗光场景 100~120 避免噪声被过度放大
室外白天 120~140 兼顾天空和地面细节
室外夜间(有路灯) 80~100 保留暗部细节,防止高光溢出
人脸/车牌特写 130~150 优先保证目标区域亮度

我的经验:目标亮度不要固定死。我习惯根据场景动态调整——比如检测到人脸时,把目标亮度往人脸区域偏移。说白了,就是让AE“看人下菜碟”。

3.3 权重区域划分——让AE知道哪里更重要

整幅画面平均亮度达标,不代表画面“好看”。举个例子:一个监控画面,左边是白墙,右边是暗角的人脸。如果全图平均亮度达标,人脸可能还是黑的。这时候就需要权重区域。

权重区域说白了就是:给画面不同位置分配不同的“投票权”。

3.3.1 常见的权重模式

  • 中央权重:画面中心区域权重高。适合监控固定区域(如门口、收银台)。
  • 下区域权重:画面下半部分权重高。适合监控道路、停车场(地面细节更重要)。
  • 人脸检测权重:检测到人脸的区域自动提高权重。这是目前安防的主流做法。
  • 自定义多边形权重:用户手动圈定重点区域。适合特殊场景(如ATM机、金库)。

注意:权重区域不是越多越好。我曾经在一个项目里把画面分成9x9的网格,每个格子单独设权重,结果AE来回震荡,画面忽明忽暗。后来改成5x5网格+人脸检测,效果反而稳定了。

3.3.2 权重与直方图的结合

权重区域怎么和直方图配合?我举个例子:

// 伪代码:带权重的亮度统计
float weighted_brightness = 0;
float total_weight = 0;

for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        float weight = get_weight(x, y);  // 从权重表获取
        weighted_brightness += pixel_brightness(x, y) * weight;
        total_weight += weight;
    }
}

float avg_brightness = weighted_brightness / total_weight;
// 用 avg_brightness 与目标亮度比较,调整曝光参数

这段代码看起来简单,但实际工程里坑很多。比如权重表怎么生成?我习惯用高斯分布+人脸检测框叠加:人脸区域权重设为3,中心区域权重设为2,边缘区域权重设为1。这样既保证人脸优先,又不会完全忽略背景。

3.4 实战案例:一个典型的AE调优流程

咱们用一个实际场景走一遍流程。假设你手头有一款IPC,安装在小区出入口,白天晚上都要用。

  1. 采集原始直方图:先关掉所有AE干预,采集10帧画面的直方图数据。你会发现白天直方图集中在亮区,晚上集中在暗区。
  2. 设定目标亮度:白天设130,晚上设90。中间用光照传感器或亮度统计做平滑过渡。
  3. 划分权重区域:画面中央区域(车辆通行区)权重设为2,两侧(绿化带、围墙)权重设为1。如果检测到人脸,人脸区域权重临时提升到4。
  4. 调整曝光参数:根据加权平均亮度与目标亮度的差值,调整曝光时间、增益、光圈(如果有)。
  5. 验证效果:看画面是否稳定,有没有闪烁、过曝、欠曝。我一般会录一段24小时的视频,逐帧分析。

避坑指南:我曾经在权重区域切换时没做平滑处理,结果画面出现“亮度跳变”——人脸一进入画面,整个画面突然变暗,人脸离开后又恢复。后来加了时间滤波,权重变化速率限制在每帧5%以内,问题解决。

3.5 知识结构图:AE算法核心逻辑

下面这张图把AE的整个闭环画出来了。你对照着看,思路会更清晰。

AE算法核心逻辑流程图 AE算法核心逻辑流程图 输入图像 亮度统计(带权重) 计算加权平均亮度 与目标亮度比较 调整曝光参数 反馈闭环 权重区域来源 • 中央权重 • 人脸检测框 • 自定义多边形 目标亮度设定 • 场景自适应 • 光照传感器辅助

嗯,这张图把AE的闭环讲清楚了。你注意看那个反馈箭头——AE不是一次搞定的,它是每帧都在调整。权重区域和目标亮度就是整个闭环的“方向盘”和“油门”。

3.6 调优检查清单

最后,我整理了一份调优检查清单。你下次调AE的时候,对着这个列表过一遍,能省不少事。

检查项 常见问题 我的建议
直方图是否包含无效区域? 天空、墙壁等大面积背景拉偏统计 用权重区域排除或降低这些区域的权重
目标亮度是否随场景变化? 固定值导致白天过曝或夜间过暗 根据光照传感器或直方图特征动态调整
权重区域切换是否平滑? 人脸进入/离开时亮度跳变 加时间滤波,权重变化速率限幅
曝光参数调整是否稳定? 曝光时间/增益来回震荡 加死区(Dead Zone)和滞回控制
低照度下是否噪声过大? 增益过高导致画面噪点明显 限制最大增益,优先增加曝光时间

一个小技巧:调AE的时候,别光看画面。把直方图实时显示出来,盯着直方图形状的变化调参数。我习惯在调试工具里同时显示“加权直方图”和“原始直方图”,对比着看,问题一目了然。