单帧光源估计只是 AWB 的观测值,不应直接成为最终增益。视频里候选像素会随取景、噪声、人物遮挡和曝光变化不断波动;如果每帧都完全采用新结果,白色墙面也会出现可见的红蓝闪烁。
稳定 AWB 的核心不是一味“滤得更慢”,而是先判断当前估计是否可信、场景是否变化,再选择更新、限速、锁定或重新搜索。
置信度来自一致性,而非单个均值
可用的置信度信号包括:
- 有效候选是否达到足够数量和面积;
- 不同空间块、不同估计器是否给出相近结果;
- 色度候选是否形成清晰且紧密的峰;
- 结果是否落在相机标定过的常见光源范围;
- 语义先验与统计估计是否相互支持;
- 新结果与历史轨迹是否存在无法解释的突变。
置信度不是“算法正确率”的绝对概率,而是当前结果能否安全驱动输出的工程量。低置信度时冻结结果,往往比输出一个看似精确的色温数字更可靠。
若多个估计器给出候选增益 与非负可信度 ,一个可解释的融合起点是:
工程上还应让估计器分歧降低 ;否则两个方向相反、各自“自信”的结果可能被平均成一个看似合理却没有场景依据的答案。
时间滤波为什么需要场景状态
最简单的指数平滑为:
其中 是当前帧估计, 是输出增益。较小的 更稳定,却会让用户从室内转向窗外时长时间偏色;较大的 响应快,却更容易追逐噪声。
视频 AWB 为什么不能每帧跳变
测量会抖动,场景也会突然换光。时间滤波让增益平滑,却会增加适应新光源的时间。
α 大时响应快但容易闪烁;α 小时稳定却拖尾。实际状态机还会检测场景切换、置信度和锁定条件。
因此真实系统会让 随状态变化:稳定场景使用小步长,检测到可信的场景切换后加速,估计不可靠时将步长降为零。还可设置色温与 Tint 死区,避免不可见的小误差不断触发更新。
一种直接的置信度调制是
其中 形成迟滞:进入快速跟随需要越过较大门限,退出后则要回到较小门限以内,避免状态在边界来回切换。两个门限之间沿用上一状态,补全了分段式未显式写出的迟滞区间。
搜索、收敛、锁定与重启
一个实用状态机通常包含:
- 搜索:启动或场景切换后快速收集候选;
- 收敛:向高置信度目标限速移动;
- 锁定:结果稳定后抑制小幅扰动;
- 保持:统计暂时失效时沿用上一结果;
- 重启:画面内容或照明发生持续、大幅变化时重新搜索。
场景变化检测不能只看 AWB 估计本身,否则一次错误观测就可能触发快速跳色。亮度直方图、空间色度分布、AE 状态、镜头运动和主体变化都可以作为辅助信号。
混合光没有唯一的全局答案
窗边人物可能同时受到蓝色天光与暖色室内灯照明。一组全局 RGB 增益不可能让两个区域都完全中性:校正室内区域会让窗边偏蓝,校正窗外又会让室内偏黄。
用对角模型表示,两种光源响应 、 若要被同一矩阵 同时校正,必须满足
除非两种响应具有相同的通道比例,也就是 ,否则通常不存在这样的全局 。所以混合光下的全局输出只能是主体优先或观感折中,而不是数学上同时“校准正确”。
系统首先要检测这种情况。若不同空间块形成两个稳定色度簇,可降低全局估计置信度,并根据产品目标选择策略:
- 优先保护人脸或主要主体;
- 在两种光源之间选择观感自然的折中;
- 保留部分暖光氛围,避免把场景“洗白”;
- 在支持局部颜色处理的管线中使用平滑的空间增益图。
局部 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 > enter4 collapsed lines
alpha = (alpha_fast if fast else alpha_slow) * confidence step = np.clip(alpha * delta, -max_step, max_step) return previous + step, fast代码中的距离直接在增益空间计算,适合与页面实验的 轨迹对应;量产实现常在 mired、Tint 或对数增益空间限速,并把 AE 变化、镜头运动与持续场景切换证据纳入状态机。固定阈值也必须按帧率和相机标定调整。输出端仍应同时记录目标值和实际值,才能区分“估计器抖动”和“控制器跟随过快”。
评价稳定性不能只看色差
静态色卡可评价中性误差和肤色偏差,视频还需要额外指标:
- 收敛时间、过冲和稳态抖动;
- 场景切换后的响应延迟;
- 主体进出画面时的颜色呼吸;
- 混合光下主体优先策略是否连续;
- 低置信度冻结是否过久;
- AE 或摄像机运动发生时是否误触发重启。
稳定并不等于永远不变。好的 AWB 会在证据充分时快速响应,在信息模糊时克制更新,并在不存在唯一正确答案的混合光场景中维持一致、可解释的产品选择。