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 区间有峰值 → 文档模式
  • 如果人脸检测到 → 人像模式

下面这张图展示了场景识别与曝光目标选择的完整流程:

基于场景的曝光目标选择流程 原始图像帧 场景分析引擎 亮度统计 + 直方图分析 + 人脸检测 文档/扫码 人像/自拍 风景/街拍 夜景/暗光 目标亮度: 180~200 直方图: 单峰高亮 目标亮度: 130~150 直方图: 高斯分布 目标亮度: 110~130 直方图: 均匀/双峰 目标亮度: 70~90 直方图: 左偏分布 曝光收敛目标参数集 场景识别 → 参数映射 → 曝光收敛,形成闭环

实际部署时,我建议做两件事:

  1. 场景切换加 hysteresis(迟滞):防止场景在边界来回跳变导致曝光闪烁。比如从文档切到人像,亮度阈值设 ±10 的死区。
  2. 目标参数平滑过渡:场景切换时,目标亮度不要突变。我一般用一阶低通滤波做过渡,时间常数 0.5~1 秒。

一个小技巧:如果你做的是手机摄像头,可以结合陀螺仪数据辅助场景判断。手持稳定时大概率是拍照,抖动剧烈时可能是视频或运动场景,曝光目标可以适当放宽收敛速度要求。