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