Android Camera Auto White Balance (AWB) 详解
Android Camera Auto White Balance (AWB) 详解1. AWB 概述1.1 什么是白平衡白平衡 (White Balance)是校正图像色彩的过程,使白色物体在不同色温光源下呈现为白色。白平衡问题: 同一张白纸在不同光源下的颜色: 白炽灯 (2700K): 偏黄/橙 日光灯 (4000K): 接近白色 日光 (5500K): 白色 阴天 (7500K): 偏蓝 蓝天 (10000K+): 明显偏蓝 人眼: 有色彩适应能力, 自动"校正"色温 → 总是看到白色 相机: 没有色彩适应 → 需要 AWB 算法校正1.2 色温与光谱色温 (Color Temperature): 色温单位: 开尔文 (K) ┌──────────────────────────────────────────────────┐ │ │ │ 1800K 2700K 4000K 5500K 7500K 10000K│ │ │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ ▼ │ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │ │蜡烛│ │白炽│ │荧光│ │日光│ │阴天│ │蓝天│ │ │ │ │ │ 灯 │ │ 灯 │ │ │ │ │ │ │ │ │ └────┘ └────┘ └────┘ └────┘ └────┘ └────┘ │ │ │ │ ◄──── 暖色 (偏黄红) ──── 冷色 (偏蓝) ────► │ │ │ └──────────────────────────────────────────────────┘ 光谱分布: 低色温 (暖光): 红/橙光成分多, 蓝光成分少 高色温 (冷光): 蓝/紫光成分多, 红光成分少1.3 AWB 的任务AWB 的核心任务: 输入: 带有色偏的原始图像 (R', G', B') 输出: 色彩准确的校正图像 (R, G, B) 校正方式: R = R' × r_gain G = G' × g_gain B = B' × b_gain 目标: 使白色区域 R = G = B 暖光 (偏黄): R' G' B' (红多蓝少) → 需要: r_gain g_gain b_gain (降红增蓝) 冷光 (偏蓝): B' G' R' (蓝多红少) → 需要: b_gain g_gain r_gain (降蓝增红)2. AWB 系统架构2.1 整体架构┌─────────────────────────────────────────────────────────────────┐ │ AWB 系统架构 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ ISP Stats 硬件 (IFE/VFE) │ │ │ │ │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │ AWB BG │ │ IHIST │ │ BHIST │ │ │ │ │ │ 区域 │ │ Y/R/G/B │ │ 亮度 │ │ │ │ │ │ R/G/B │ │ 直方图 │ │ 直方图 │ │ │ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ └───────┼──────────────┼──────────────┼──────────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ AWB 算法库 (用户空间) │ │ │ │ │ │ │ │ ┌──────────────┐ │ │ │ │ │ 1. 色度分析 │ ← AWB BG Stats R/G/B │ │ │ │ │ Chromaticity │ │ │ │ │ └──────┬───────┘ │ │ │ │ │ │ │ │ │ ▼ │ │ │ │ ┌──────────────┐ │ │ │ │ │ 2. 白点检测 │ ← 色度约束 + 亮度约束 │ │ │ │ │ White Point │ │ │ │ │ └──────┬───────┘ │ │ │ │ │ │ │ │ │ ▼ │ │ │ │ ┌──────────────┐ │ │ │ │ │ 3. 光源识别 │ ← 色温匹配 │ │ │ │ │ Illuminant │ │ │ │ │ └──────┬───────┘ │ │ │ │ │ │ │ │ │ ▼ │ │ │ │ ┌──────────────┐ │ │ │ │ │ 4. 增益计算 │ ← 白点 → R/G/B 增益 │ │ │ │ │ Gain Calc │ │ │ │ │ └──────┬───────┘ │ │ │ │ │ │ │ │ │ ▼ │ │ │ │ ┌──────────────┐ │ │ │ │ │ 5. 时域平滑 │ ← 帧间平滑, 避免色温跳变 │ │ │ │ │ Temporal │ │ │ │ │ └──────┬───────┘ │ │ │ └─────────┼───────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ 输出 │ │ │ │ ├─ r_gain → ISP 红色通道增益 │ │ │ │ ├─ g_gain → ISP 绿色通道增益 │ │ │ │ ├─ b_gain → ISP 蓝色通道增益 │ │ │ │ ├─ cct → 估计色温 (K) │ │ │ │ └─ awb_decision → 光源类型决策 │ │ │ └─────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘2.2 AWB 使用的 ISP StatsStats 模块资源 ID数据内容AWB 用途AWB BGCAM_ISP_IFE_OUT_RES_STATS_AWB_BG区域 R/G/B 平均值白点检测、色温估计IHISTCAM_ISP_IFE_OUT_RES_STATS_IHISTY/R/G/B 直方图色彩分布分析BHISTCAM_ISP_IFE_OUT_RES_STATS_BHISTBayer 直方图亮度辅助分析// AWB BG Stats 区域划分 (如 64×64 = 4096 区域)//// ┌──┬──┬──┬──┬──┬──┬──┬──┐// │R0│R1│R2│R3│R4│R5│R6│R7│ 每个区域 Ri 包含:// ├──┼──┼──┼──┼──┼──┼──┼──┤ - R_avg: 红色通道平均值// │R8│R9│..│ │ │ │ │..│ - G_avg: 绿色通道平均值// ├──┼──┼──┼──┼──┼──┼──┼──┤ - B_avg: 蓝色通道平均值// │..│ │ │ │ │ │ │..│ - Y_avg: 亮度平均值// ├──┼──┼──┼──┼──┼──┼──┼──┤ - pixel_count: 有效像素数// │..│ │ │ │ │ │ │R63│// └──┴──┴──┴──┴──┴──┴──┴──┘//// AWB BG Stats 在 Demosaic 之后、WB 增益之前采集// 这样拿到的是原始 R/G/B, 还未被 WB 增益修改3. AWB 核心算法3.1 AWB 算法总流程// AWB 算法主流程structawb_context{// Stats 输入structawb_stats_input{floatregion_r[MAX_REGIONS];// 区域 R 平均值floatregion_g[MAX_REGIONS];// 区域 G 平均值floatregion_b[MAX_REGIONS];// 区域 B 平均值floatregion_y[MAX_REGIONS];// 区域亮度uint32_tihist_r[256];// R 直方图uint32_tihist_g[256];// G 直方图uint32_tihist_b[256];// B 直方图}stats;// AWB 输出structawb_output{floatr_gain;// 红色增益floatg_gain;// 绿色增益floatb_gain;// 蓝色增益floatcct;// 估计色温 (K)enumawb_decisiondecision;// 光源类型决策floatconfidence;// 决策置信度enumawb_statestate;// AWB 状态}output;// 参考光源表structilluminant_ref{floatrg;// R/G 比率floatbg;// B/G 比率floatcct;// 色温charname[32];// 光源名称}illuminants[MAX_ILLUMINANTS];// 内部状态floatprev_r_gain,prev_g_gain,prev_b_gain;floatconvergence_speed;};voidawb_process(structawb_context*awb){// ===== Step 1: 色度分析 =====// 计算每个区域的 R/G, B/G 比率floatchromaticity[MAX_REGIONS][2];// [rg, bg]analyze_chromaticity(awb,chromaticity);// ===== Step 2: 白点检测 =====// 在色度空间中找到白色/灰色区域structwhite_pointwp;detect_white_point(awb,chromaticity,wp);// ===== Step 3: 光源识别 =====// 将白点匹配到已知光源enumawb_decisiondecision;floatcct;identify_illuminant(awb,wp,decision,cct);// ===== Step 4: 增益计算 =====// 根据白点计算 WB 增益calculate_wb_gains(awb,wp,decision);// ===== Step 5: 场景修正 =====// 特殊场景处理 (人脸、天空、绿色植物等)apply_scene_correction(awb,decision);// ===== Step 6: 时域平滑 =====// 帧间平滑, 避免色温跳变temporal_smoothing(awb);// ===== Step 7: 状态更新 =====awb-output.cct=cct;awb-output.decision=decision;}3.2 色度分析// 色度分析: 计算每个区域的 R/G, B/G 比率voidanalyze_chromaticity(structawb_context*awb,floatchromaticity[][2]){for(uint32_ti=0;iMAX_REGIONS;i++){floatr=awb-stats.region_r[i];floatg=awb-stats.region_g[i];floatb=awb-stats.region_b[i];// 避免除零if(g1.0)g=1.0;// R/G 和 B/G 比率chromaticity[i][0]=r/g;// R/Gchromaticity[i][1]=b/g;// B/G}}// 色度空间 (R/G, B/G 平面)://// B/G// ▲// │// 3.0│ · (蓝天, 10000K+)// │ ·// 2.5│ ·// │ ·// 2.0│ · (阴天, 7500K)// │ ·// 1.5│ · (日光, 5500K)// │ ·// 1.0│─ ─ ─ ─ ·─ ─ ─ ─ ─ → R/G ← D65 白点 (1.0, 1.0)// │ ·// 0.5│ · (白炽灯, 2700K)// │ ·// 0.0│ · (蜡烛, 1800K)// └─────────────────────────────// 0 0.5 1.0 1.5 2.0 2.5 3.0//// ◄── 暖色 (R/G 高, B/G 低) ──►