1695 字
8 分钟
AWB 如何保持稳定?置信度、混合光与时域控制

单帧光源估计只是 AWB 的观测值,不应直接成为最终增益。视频里候选像素会随取景、噪声、人物遮挡和曝光变化不断波动;如果每帧都完全采用新结果,白色墙面也会出现可见的红蓝闪烁。

稳定 AWB 的核心不是一味“滤得更慢”,而是先判断当前估计是否可信、场景是否变化,再选择更新、限速、锁定或重新搜索。

置信度来自一致性,而非单个均值#

可用的置信度信号包括:

  • 有效候选是否达到足够数量和面积;
  • 不同空间块、不同估计器是否给出相近结果;
  • 色度候选是否形成清晰且紧密的峰;
  • 结果是否落在相机标定过的常见光源范围;
  • 语义先验与统计估计是否相互支持;
  • 新结果与历史轨迹是否存在无法解释的突变。

置信度不是“算法正确率”的绝对概率,而是当前结果能否安全驱动输出的工程量。低置信度时冻结结果,往往比输出一个看似精确的色温数字更可靠。

若多个估计器给出候选增益 g^t(m)\hat{\mathbf g}^{(m)}_t 与非负可信度 cmc_m,一个可解释的融合起点是:

g^t=mcmg^t(m)mcm+ε,Ct=clip ⁣(mcmM,0,1)\hat{\mathbf g}_t= \frac{\sum_m c_m\hat{\mathbf g}^{(m)}_t}{\sum_m c_m+\varepsilon}, \qquad C_t=\operatorname{clip}\!\left(\frac{\sum_m c_m}{M},0,1\right)

工程上还应让估计器分歧降低 CtC_t;否则两个方向相反、各自“自信”的结果可能被平均成一个看似合理却没有场景依据的答案。

时间滤波为什么需要场景状态#

最简单的指数平滑为:

gt=gt1+α(g^tgt1)g_t=g_{t-1}+\alpha(\hat g_t-g_{t-1})

其中 g^t\hat g_t 是当前帧估计,gtg_t 是输出增益。较小的 α\alpha 更稳定,却会让用户从室内转向窗外时长时间偏色;较大的 α\alpha 响应快,却更容易追逐噪声。

视频 AWB 为什么不能每帧跳变

测量会抖动,场景也会突然换光。时间滤波让增益平滑,却会增加适应新光源的时间。

帧序列 →
平滑系数0.22
首帧增益1.80
末帧增益1.12

α 大时响应快但容易闪烁;α 小时稳定却拖尾。实际状态机还会检测场景切换、置信度和锁定条件。

因此真实系统会让 α\alpha 随状态变化:稳定场景使用小步长,检测到可信的场景切换后加速,估计不可靠时将步长降为零。还可设置色温与 Tint 死区,避免不可见的小误差不断触发更新。

一种直接的置信度调制是

αt={0,Ct<TfreezeαslowCt,Δt<henterαfastCt,Δt>hexit,Δt=g^tgt1,\alpha_t= \begin{cases} 0,&C_t<T_{\mathrm{freeze}}\\ \alpha_{\mathrm{slow}}C_t,&\lVert\Delta_t\rVert<h_{\mathrm{enter}}\\ \alpha_{\mathrm{fast}}C_t,&\lVert\Delta_t\rVert>h_{\mathrm{exit}} \end{cases}, \qquad \Delta_t=\hat{\mathbf g}_t-\mathbf g_{t-1},

其中 hexit>henterh_{\mathrm{exit}}>h_{\mathrm{enter}} 形成迟滞:进入快速跟随需要越过较大门限,退出后则要回到较小门限以内,避免状态在边界来回切换。两个门限之间沿用上一状态,补全了分段式未显式写出的迟滞区间。

搜索、收敛、锁定与重启#

一个实用状态机通常包含:

  1. 搜索:启动或场景切换后快速收集候选;
  2. 收敛:向高置信度目标限速移动;
  3. 锁定:结果稳定后抑制小幅扰动;
  4. 保持:统计暂时失效时沿用上一结果;
  5. 重启:画面内容或照明发生持续、大幅变化时重新搜索。

场景变化检测不能只看 AWB 估计本身,否则一次错误观测就可能触发快速跳色。亮度直方图、空间色度分布、AE 状态、镜头运动和主体变化都可以作为辅助信号。

混合光没有唯一的全局答案#

窗边人物可能同时受到蓝色天光与暖色室内灯照明。一组全局 RGB 增益不可能让两个区域都完全中性:校正室内区域会让窗边偏蓝,校正窗外又会让室内偏黄。

用对角模型表示,两种光源响应 1\boldsymbol\ell_12\boldsymbol\ell_2 若要被同一矩阵 D\mathbf D 同时校正,必须满足

D1=k11,D2=k21.\mathbf D\boldsymbol\ell_1=k_1\mathbf 1, \qquad \mathbf D\boldsymbol\ell_2=k_2\mathbf 1.

除非两种响应具有相同的通道比例,也就是 12\boldsymbol\ell_1\propto\boldsymbol\ell_2,否则通常不存在这样的全局 D\mathbf D。所以混合光下的全局输出只能是主体优先或观感折中,而不是数学上同时“校准正确”。

系统首先要检测这种情况。若不同空间块形成两个稳定色度簇,可降低全局估计置信度,并根据产品目标选择策略:

  • 优先保护人脸或主要主体;
  • 在两种光源之间选择观感自然的折中;
  • 保留部分暖光氛围,避免把场景“洗白”;
  • 在支持局部颜色处理的管线中使用平滑的空间增益图。

局部 AWB 必须谨慎。分区边界、主体移动和错误分割会产生颜色接缝或随帧漂移;空间增益还会与 LSC、CCM 和局部 Tone Mapping 相互作用。

视频中的联动约束#

AE 改变曝光时间和增益时,暗部噪声与饱和像素比例也会变化,AWB 不应把这种统计变化立即解释成光源变化。AF 搜索可能改变构图细节,录像切镜和数字变焦也会突然替换候选区域。

下面的独立 NumPy 控制器把置信度冻结、一阶滤波、迟滞和单帧限速放在一起。fast 是持续状态,而不是由一次越界立刻反复开关。

import numpy as np
def update_awb(previous, estimate, confidence, fast=False,
freeze=0.25, enter=0.18, exit=0.06,
alpha_slow=0.06, alpha_fast=0.45, max_step=0.08):
"""更新 (gR, gB),并返回输出及迟滞后的 fast 状态。"""
previous = np.asarray(previous, dtype=np.float64)
estimate = np.asarray(estimate, dtype=np.float64)
confidence = float(np.clip(confidence, 0.0, 1.0))
delta = estimate - previous
distance = float(np.linalg.norm(delta))
if confidence < freeze:
return previous.copy(), fast
if fast:
fast = distance >= exit
else:
fast = distance > enter
4 collapsed lines
alpha = (alpha_fast if fast else alpha_slow) * confidence
step = np.clip(alpha * delta, -max_step, max_step)
return previous + step, fast

代码中的距离直接在增益空间计算,适合与页面实验的 gR/gBg_R/g_B 轨迹对应;量产实现常在 mired、Tint 或对数增益空间限速,并把 AE 变化、镜头运动与持续场景切换证据纳入状态机。固定阈值也必须按帧率和相机标定调整。输出端仍应同时记录目标值和实际值,才能区分“估计器抖动”和“控制器跟随过快”。

评价稳定性不能只看色差#

静态色卡可评价中性误差和肤色偏差,视频还需要额外指标:

  • 收敛时间、过冲和稳态抖动;
  • 场景切换后的响应延迟;
  • 主体进出画面时的颜色呼吸;
  • 混合光下主体优先策略是否连续;
  • 低置信度冻结是否过久;
  • AE 或摄像机运动发生时是否误触发重启。

稳定并不等于永远不变。好的 AWB 会在证据充分时快速响应,在信息模糊时克制更新,并在不存在唯一正确答案的混合光场景中维持一致、可解释的产品选择。

AWB 如何保持稳定?置信度、混合光与时域控制
https://cloudsir.top/posts/how-awb-stays-stable/
作者
CloudSir
发布于
2026-08-25
许可协议
CC BY-NC-SA 4.0
相机怎样决定明暗?AE 自动曝光系统总览
AWB 如何估计光源?从灰世界到可信像素筛选