自动曝光(AE)基础:曝光三角、亮度直方图与目标亮度设定

自动曝光,说白了就是让摄像头自己决定「吃多少光」。

我刚开始做摄像头驱动时,总觉得AE不就是调调曝光时间嘛。直到有一次在户外强光下,画面直接过曝成一片白板,我才意识到——曝光这事儿,远没那么简单。

曝光三角:光圈、快门、ISO

这三个参数共同决定了传感器最终接收到多少光。你想想看,它们就像水龙头:

  • 光圈(Aperture):水管粗细。越大进光越多,但景深变浅。
  • 快门(Shutter Speed):开水时间。越长进光越多,但运动物体会模糊。
  • ISO:水压泵。增益越高信号越强,但噪声也跟着放大。

我在项目中遇到过最典型的坑:为了压低ISO,把快门拉到1/30s以下。结果画面倒是亮了,但手一抖全是拖影。嗯,这里要注意——曝光三角不是独立调节的,它们必须协同工作。

参数 增大效果 减小效果 典型范围(手机摄像头)
光圈 进光↑,景深↓ 进光↓,景深↑ f/1.4 ~ f/16
快门 进光↑,运动模糊↑ 进光↓,运动模糊↓ 1/8000s ~ 30s
ISO 亮度↑,噪声↑ 亮度↓,噪声↓ 100 ~ 6400
我的习惯:在嵌入式平台上,优先调快门,其次调ISO,最后才动光圈。因为光圈通常是物理结构,调节速度最慢。

亮度直方图:AE的眼睛

直方图是什么?说白了就是一张「像素亮度分布统计图」。横轴0~255代表亮度,纵轴代表像素数量。

我调试AE算法时,第一件事就是拉出直方图。为什么?因为它能告诉你:

  • 过曝:像素堆在255右侧,一片死白
  • 欠曝:像素堆在0左侧,一片死黑
  • 对比度低:像素集中在中间,画面发灰

举个例子。有一次在室内灯光下,画面看起来还行,但直方图显示像素全挤在80~120之间。这意味着什么?动态范围根本没被利用。后来我把目标亮度往上提了一档,画面立刻通透多了。

核心原则:好的曝光不是让直方图「居中」,而是让直方图「铺开」且不溢出两端。

目标亮度设定:AE的灵魂

目标亮度(Target Luminance)是AE算法的核心参考值。算法会不断调整曝光三角,让画面平均亮度逼近这个目标。

那目标亮度设多少合适?我见过有人直接写死128(8bit中值)。但实际场景千变万化,128真的够吗?

场景 推荐目标亮度 原因
户外强光 160~200 保留高光细节,避免过曝
室内正常 100~140 平衡亮部和暗部
夜景/暗光 60~100 优先保证可见度,容忍噪声
文档扫描 180~220 文字背景要亮白
我曾经踩过的坑:在安防摄像头项目中,把目标亮度设成了固定值120。结果白天画面正常,晚上画面却偏暗。后来改成根据环境照度动态调整目标亮度,问题才解决。

AE的完整工作流程

下面这张图展示了AE从采集到调整的闭环逻辑:

自动曝光(AE)闭环工作流程 传感器采集原始帧 统计亮度直方图 计算当前平均亮度 对比目标亮度差值 调整快门/ISO/光圈 反馈到下一帧 关键:直方图统计 是AE算法的输入基础 关键:目标亮度 决定了AE的收敛方向

工程落地中的AE调参要点

纸上谈兵容易,真正落地时你会发现一堆细节。我总结几个实战经验:

  1. 收敛速度要可控:AE不能跳变太快,否则画面会闪烁。我一般限制每帧最大调整步长。
  2. 防抖策略:在暗光下,快门变慢会导致画面抖动。我习惯设定一个「安全快门阈值」,低于这个值就优先提ISO。
  3. 场景切换检测:从室内走到室外,亮度突变。这时候AE需要快速响应。我通常用帧间亮度差来触发快速收敛模式。
  4. 权重区域:人脸区域应该比背景更重要。我做过一个方案——给画面中心区域更高的权重,效果立竿见影。
一句话总结:AE不是让画面「亮」,而是让画面「合适」。直方图是眼睛,目标亮度是标尺,曝光三角是手脚。