自动曝光(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调参要点
纸上谈兵容易,真正落地时你会发现一堆细节。我总结几个实战经验:
- 收敛速度要可控:AE不能跳变太快,否则画面会闪烁。我一般限制每帧最大调整步长。
- 防抖策略:在暗光下,快门变慢会导致画面抖动。我习惯设定一个「安全快门阈值」,低于这个值就优先提ISO。
- 场景切换检测:从室内走到室外,亮度突变。这时候AE需要快速响应。我通常用帧间亮度差来触发快速收敛模式。
- 权重区域:人脸区域应该比背景更重要。我做过一个方案——给画面中心区域更高的权重,效果立竿见影。
一句话总结:AE不是让画面「亮」,而是让画面「合适」。直方图是眼睛,目标亮度是标尺,曝光三角是手脚。