4. AWB 工程调优案例:不同光源下 AWB 偏色问题分析

自动白平衡(AWB)是 ISP 中最具挑战性的模块之一。真实场景中光源色温从 2000K(烛光)到 10000K(阴天)变化,AWB 算法需要在复杂混合光源下准确还原中性色。本章通过实际工程案例,分析典型偏色问题,并给出基于统计窗口与权重调整的调优方法。

工程前提: 本章所有调优基于 500 万像素 RGB-IR 传感器,ISP 采用 3×3 色温估计矩阵 + 灰度世界与完美反射混合模型。调优目标:在 D65(6500K)、A(2856K)、TL84(4000K)三种标准光源下,色差 ΔE 均小于 3。

4.1 典型偏色问题与根因分析

在工程测试中,我们发现了三类典型偏色问题,其根因均与统计窗口和权重分配相关:

偏色现象 测试光源 根因定位 影响指标
整体偏黄绿 A 光源(2856K) 统计窗口包含大面积暖色背景,R/G 增益被过度抑制 ΔE > 5,肤色失真
局部偏蓝紫 TL84(4000K) 中心权重过高,边缘冷色区域未参与统计 边缘色块 ΔE > 4
闪烁偏色 D65(6500K) 窗口内高亮反光区域权重未抑制,帧间增益抖动 ΔE 波动 > 2
关键发现: 三种偏色问题的共同根源是 统计窗口的空间分布 与 像素级权重映射 未针对光源特性做差异化配置。统一窗口策略在混合光源场景下必然失效。

4.2 统计窗口设计原理与 SVG 架构

AWB 统计窗口将图像划分为 M×N 网格,每个网格计算 R/G、B/G 均值。下图展示了经典 5×5 统计窗口与权重分配架构:

AWB 统计窗口与权重分配架构 5×5 统计网格 中心高权重区 低权重 低权重 低权重 权重映射流程 原始统计值 (R/G, B/G) 亮度权重计算 色温置信度权重 空间位置权重 加权统计输出 说明:权重映射分三级——亮度权重抑制过曝/欠曝区域;色温置信度权重降低非中性色干扰;空间位置权重 可针对光源特性调整中心/边缘占比。最终加权统计值用于色温估计矩阵计算。

4.3 权重调整策略与参数配置

针对不同光源特性,我们设计了三种权重模板。核心思路是:暖光源下降低中心权重、增加边缘采样;冷光源下保持中心高权重、抑制边缘低信噪比区域;标准光源下采用均匀分布。

光源类型 色温范围 中心权重系数 边缘权重系数 亮度阈值 (10bit) 色温置信度门限
A(白炽灯) 2800-3000K 0.6 1.2 [40, 900] 0.35
TL84(荧光灯) 3800-4200K 1.0 0.8 [60, 850] 0.45
D65(日光) 6200-6800K 1.0 1.0 [80, 950] 0.50
避坑提示: 权重系数调整后必须验证帧间稳定性。中心权重从 1.0 降到 0.6 时,A 光源下的 R/G 增益波动从 ±0.015 增大到 ±0.032,需要配合时间域低通滤波(α=0.85)抑制闪烁。

4.4 调优前后效果对比

在 24 色卡测试中,调优前后的色差数据如下。调优后所有光源下的 ΔE 均满足 < 3 的工程目标:

光源 调优前 ΔE (avg) 调优前 ΔE (max) 调优后 ΔE (avg) 调优后 ΔE (max) 改善幅度
A 4.82 6.31 1.95 2.84 59.5%
TL84 3.76 5.12 2.13 2.91 43.4%
D65 2.45 3.88 1.67 2.45 31.8%

4.5 工程实现代码片段

以下代码展示了权重模板的生成与统计值加权计算。注意权重数组需在 ISP 初始化时预计算,避免运行时开销:

// awb_weight_template.c - AWB 权重模板生成与统计加权
#include "isp_awb.h"

#define AWB_GRID_W 5
#define AWB_GRID_H 5

typedef struct {
    uint8_t weight[AWB_GRID_H][AWB_GRID_W];
    uint16_t lum_low;
    uint16_t lum_high;
    float cct_confidence_th;
} awb_weight_template_t;

// 生成 A 光源权重模板:边缘权重 1.2,中心 0.6
void awb_gen_weight_A(awb_weight_template_t *t) {
    const uint8_t base[AWB_GRID_H][AWB_GRID_W] = {
        {12, 12, 10, 12, 12},
        {12, 10,  8, 10, 12},
        {10,  8,  6,  8, 10},
        {12, 10,  8, 10, 12},
        {12, 12, 10, 12, 12}
    };
    memcpy(t->weight, base, sizeof(base));
    t->lum_low  = 40;
    t->lum_high = 900;
    t->cct_confidence_th = 0.35f;
}

// 加权统计计算
void awb_weighted_stats(awb_stats_t *raw, awb_weight_template_t *t,
                        awb_weighted_stats_t *out) {
    float sum_rg = 0.0f, sum_bg = 0.0f;
    float total_weight = 0.0f;

    for (int y = 0; y < AWB_GRID_H; y++) {
        for (int x = 0; x < AWB_GRID_W; x++) {
            // 亮度权重:超出阈值则置零
            uint16_t lum = raw->lum[y][x];
            float lum_w = (lum >= t->lum_low && lum <= t->lum_high) ? 1.0f : 0.0f;

            // 色温置信度权重
            float cct_conf = raw->cct_confidence[y][x];
            float cct_w = (cct_conf >= t->cct_confidence_th) ? cct_conf : 0.0f;

            // 空间位置权重
            float spatial_w = t->weight[y][x] / 10.0f;

            float w = lum_w * cct_w * spatial_w;
            sum_rg += raw->rg[y][x] * w;
            sum_bg += raw->bg[y][x] * w;
            total_weight += w;
        }
    }

    if (total_weight > 0.001f) {
        out->rg_avg = sum_rg / total_weight;
        out->bg_avg = sum_bg / total_weight;
    } else {
        out->rg_avg = 1.0f;  // fallback
        out->bg_avg = 1.0f;
    }
    out->total_weight = total_weight;
}

4.6 调优验证流程

权重调整完成后,按以下流程进行验证,确保修改未引入副作用:

  1. 静态色卡测试: 在 D65/A/TL84 光源下拍摄 24 色卡,计算每个色块的 ΔE,确认所有色块 ΔE < 3。
  2. 动态场景测试: 录制 30 秒视频,光源从 D65 渐变到 A,观察白平衡切换是否平滑,帧间增益抖动是否 < 0.01。
  3. 极端场景测试: 单色背景(纯红/纯蓝/纯绿)下,验证 AWB 是否收敛到合理增益范围,防止误判。
  4. 功耗与性能测试: 权重模板预计算后,统计模块额外开销应 < 0.2ms(@30fps)。
调优总结: 统计窗口与权重调整是 AWB 工程调优中最灵活、最有效的手段。通过为不同光源设计差异化权重模板,可以在不增加硬件成本的前提下,将全光源色差降低 30%-60%。核心原则是:让统计窗口的采样分布与光源的空间能量分布相匹配。