2、曝光目标设定:目标亮度、目标直方图分布、基于场景的曝光目标选择
曝光收敛,说白了就是让相机找到那个「刚刚好」的亮度。但什么才算「刚刚好」?
这个问题,我当年刚入行时也困惑过。后来踩了不少坑才明白——曝光目标不是拍脑袋定的,它有一套严谨的数学定义和场景适配逻辑。这一节,我们就来拆解这三个核心要素。
2.1 目标亮度(Target Luminance)
目标亮度,就是算法希望图像最终达到的平均亮度水平。通常用一个 0~255 的标量表示(8bit 图像),或者用归一化到 0~1 的浮点数。
核心公式:
Target Luminance = (∑ I(x,y) ) / (W × H)
其中 I(x,y) 是像素亮度值,W、H 是图像宽高。算法通过调整曝光参数,让实际平均亮度逼近这个目标值。
我个人习惯把目标亮度分成三档:
| 场景类型 | 目标亮度(8bit) | 说明 |
|---|---|---|
| 室内/暗光 | 100~120 | 保留暗部细节,避免过曝 |
| 室外/正常 | 120~150 | 人眼舒适区,细节丰富 |
| 强光/高动态 | 80~100 | 压低高光,防止高光溢出 |
嗯,这里要注意:目标亮度不是越高越好。我曾经在一个高动态场景里把目标设到 180,结果高光区域全白了,暗部细节也没救回来。后来才明白,目标亮度要跟场景的动态范围匹配。
2.2 目标直方图分布
光设一个平均亮度是不够的。你想想看,一张图平均亮度 120,可能是均匀分布,也可能是半边黑半边白。所以我们需要更精细的约束——目标直方图分布。
直方图分布定义了每个亮度区间应该有多少像素。常见的分布形态有三种:
- 均匀分布:每个亮度区间像素数大致相等。适合风景、文档等需要全亮度范围保留的场景。
- 高斯分布:中间亮度的像素多,两端少。适合人像、产品拍摄,主体亮度集中。
- 双峰分布:两个峰值,分别对应暗部和亮部。适合逆光、HDR 场景。
我的经验:实际项目中,我很少用纯均匀分布。因为传感器噪声在暗部和亮部表现不同,强行均匀反而会让暗部噪点爆炸。我一般用带权重的类高斯分布,中间区域权重高,两端权重低。
直方图匹配的代价函数通常长这样:
Cost_hist = ∑ |H_actual(i) - H_target(i)|
其中 H_actual 是当前帧的直方图,H_target 是目标直方图,i 是亮度 bin 索引。算法会最小化这个差值。
避坑指南:我曾经在夜景场景里用均匀分布做目标,结果算法拼命提亮暗部,导致噪点满天飞。后来我把目标直方图改成左偏分布(暗部 bin 权重低),问题才解决。记住:直方图目标要尊重传感器的物理特性。
2.3 基于场景的曝光目标选择
不同场景对曝光的要求天差地别。你不能用拍文档的参数去拍夕阳,对吧?
我习惯把场景分成四大类,每类配一套曝光目标参数:
| 场景类别 | 目标亮度 | 直方图形态 | 典型应用 |
|---|---|---|---|
| 文档/扫码 | 180~200 | 单峰,集中在高亮区 | 文字清晰,背景白净 |
| 人像/自拍 | 130~150 | 高斯,肤色区域权重高 | 肤色自然,背景不过曝 |
| 风景/街拍 | 110~130 | 均匀或双峰 | 天空和地面细节都保留 |
| 夜景/暗光 | 70~90 | 左偏,暗部权重低 | 抑制噪点,保留主体 |
场景识别怎么做?我一般用轻量级 CNN 或者基于统计特征的规则引擎。比如:
- 如果平均亮度 < 60 且方差小 → 夜景模式
- 如果直方图在 200~255 区间有峰值 → 文档模式
- 如果人脸检测到 → 人像模式
下面这张图展示了场景识别与曝光目标选择的完整流程:
实际部署时,我建议做两件事:
- 场景切换加 hysteresis(迟滞):防止场景在边界来回跳变导致曝光闪烁。比如从文档切到人像,亮度阈值设 ±10 的死区。
- 目标参数平滑过渡:场景切换时,目标亮度不要突变。我一般用一阶低通滤波做过渡,时间常数 0.5~1 秒。
一个小技巧:如果你做的是手机摄像头,可以结合陀螺仪数据辅助场景判断。手持稳定时大概率是拍照,抖动剧烈时可能是视频或运动场景,曝光目标可以适当放宽收敛速度要求。