3. AE控制策略:步进调整、PID控制、基于场景的AE策略
曝光控制,说白了就是给传感器找那个「刚刚好」的进光量。太暗了细节全丢,太亮了高光一片死白。我做了这么多年ISP,见过太多团队在AE上翻车——不是来回震荡,就是场景切换时闪瞎眼。
今天咱们就把AE的三种主流控制策略掰开揉碎。从最基础的步进调整,到工业界最爱的PID,再到我实战中积累的场景化策略。嗯,这部分内容,够你少踩三年坑。
3.1 步进调整:最朴素的曝光控制
步进调整,也叫阶梯式调整。思路很简单:每次调一小步,直到目标亮度达标。
伪代码大概长这样:
// 步进调整伪代码
int target_luma = 120; // 目标亮度
int current_luma = get_current_luma();
int step = 8; // 步长
if (abs(current_luma - target_luma) < threshold) {
// 稳定了,不动
return;
}
if (current_luma < target_luma) {
// 太暗,增加曝光
exposure += step;
} else {
// 太亮,减少曝光
exposure -= step;
}
优点很明显:实现简单,计算量小。但问题也突出——步长选大了容易震荡,选小了收敛慢。我见过一个项目,步长设了4,结果从室内走到室外,花了将近3秒才稳定。用户都开始骂街了。
3.2 PID控制:工业级AE的标配
PID控制,比例-积分-微分。这玩意儿在工业控制领域用了快百年了,放到AE里一样好使。
核心公式:
error = target_luma - current_luma
P = Kp * error
I = Ki * ∫error dt
D = Kd * d(error)/dt
output = P + I + D
简单解释一下:
- P(比例):当前误差有多大,就调多少。反应快,但容易过头。
- I(积分):累计误差。专门对付稳态误差——就是那种「差一点点到目标」的情况。
- D(微分):误差变化趋势。提前刹车,防止超调。
我在项目中遇到过最典型的场景:手机从暗光环境快速移到亮光环境。只用P的话,曝光会冲过头,然后来回震荡好几帧。加上D之后,一次到位,稳得很。
PID参数调优口诀(我自己总结的):
| 现象 | 调大Kp | 调大Ki | 调大Kd |
|---|---|---|---|
| 响应太慢 | ✓ | ||
| 稳态误差大 | ✓ | ||
| 超调严重 | ✓ | ||
| 震荡不停 | 减小 | 减小 | ✓ |
3.3 基于场景的AE策略
说实话,纯PID也不是万能的。不同场景下,AE的目标和行为应该不一样。这就是我接下来要讲的——场景化AE策略。
3.3.1 低光场景
低光下,核心矛盾是「亮度和噪声」的取舍。你强行提亮,噪声就炸了。
我的策略:
- 目标亮度降低:从正常的120降到80-90。别追求亮,追求「看得清」就行。
- 优先提增益:先拉模拟增益,再拉数字增益。模拟增益的噪声特性好一些。
- 限制最大曝光时间:手持设备别超过1/30s,不然糊片。
3.3.2 逆光场景
逆光,人脸黑背景亮。这时候全局测光就是灾难——背景正常了,人脸死黑。
我的做法:
- 切换到人脸ROI测光:检测到人脸后,以人脸区域为测光目标。
- 开启局部HDR:如果硬件支持,直接上HDR合成。
- 动态范围压缩:用tone mapping把高光压下来,暗部提上去。
你想想看,逆光场景下如果还用全局AE,人脸区域可能只有20-30的亮度值。这时候你强行提全局曝光,背景就过曝了。正确的做法是——以人脸为目标,背景过曝就过曝,后期用tone mapping拉回来。
3.3.3 高动态场景
高动态,就是场景里既有极亮又有极暗。比如窗户边的室内场景。
策略:
- 检测动态范围:统计直方图,看最亮和最暗的差距。
- 判断是否触发HDR:如果动态范围超过传感器能力(比如超过72dB),启动多帧合成。
- AE目标调整:HDR模式下,AE目标不再是单一亮度,而是「暗帧提亮、亮帧压暗」的折中。
3.4 三种策略的对比与选择
| 策略 | 收敛速度 | 稳定性 | 实现复杂度 | 适用场景 |
|---|---|---|---|---|
| 步进调整 | 慢 | 中 | 低 | 安防、低帧率设备 |
| PID控制 | 快 | 高 | 中 | 手机、相机等主流设备 |
| 场景化策略 | 最快 | 最高 | 高 | 旗舰手机、专业相机 |
我个人习惯是:基础用PID,然后根据场景切换参数集。低光一套参数,逆光一套参数,普通场景一套参数。这样既保证了响应速度,又兼顾了场景适应性。
最后说一句:AE控制没有银弹。步进调整简单但慢,PID快但需要调参,场景化策略效果好但实现复杂。我的建议是——从PID起步,逐步加入场景判断逻辑。别一上来就想搞个大而全的系统,容易把自己绕进去。