AWB调优实战:从目标色温到肤色保护
说到AWB(自动白平衡),很多工程师第一反应就是「找个灰卡校准一下」。但实际项目中,哪有那么多灰卡给你用?用户拍的是蓝天、是夕阳、是霓虹灯下的女朋友。AWB调不好,照片要么偏黄要么偏蓝,用户直接骂街。
我做了这么多年相机系统,AWB调优可以说是最磨人的环节之一。今天咱们就聊聊AWB实战中的几个核心点:目标色温设定、收敛速度、场景识别,还有那个让所有厂商头疼的肤色保护。
核心观点:AWB不是简单的数学计算,而是场景理解 + 用户意图猜测 + 硬件约束的平衡艺术。
一、目标色温设定:别迷信D65
很多工程师一上来就把目标色温定在D65(6500K)。为什么?因为标准光源嘛。但实际场景中,用户根本不在乎什么标准不标准。
我举个例子。你在咖啡馆里拍一张照片,暖黄色的灯光下,咖啡杯和蛋糕看起来特别有食欲。这时候如果AWB强行拉到D65,照片就变成惨白一片,用户会说「这拍的是什么鬼」。
我个人习惯的做法是:
- 室内暖光场景:目标色温定在4000K-5000K,保留暖色调氛围
- 户外阴天:目标色温定在5500K-6000K,避免偏蓝
- 日落/日出:目标色温定在3500K-4500K,保留金色光线
- 荧光灯场景:目标色温定在4500K-5000K,中和绿色偏色
小技巧:我在项目中遇到过一个问题——用户从室内走到室外,AWB突然从4000K跳到6500K,画面颜色瞬间「闪」了一下。后来我加了帧间平滑,每次色温变化不超过200K/帧,问题就解决了。
二、AWB收敛速度:快还是慢?
收敛速度是个双刃剑。太快了,画面闪烁;太慢了,用户都换场景了,颜色还没调过来。
你想想看,用户从室内走到室外,AWB需要重新估计色温。如果收敛速度是每帧50K,从4000K到6500K需要50帧,差不多1秒多。用户会觉得「这手机反应好慢」。
我建议的做法是分阶段调节:
| 阶段 | 色温变化量 | 帧数 | 说明 |
|---|---|---|---|
| 快速粗调 | ≥500K/帧 | 前5帧 | 快速接近目标色温 |
| 中速微调 | 100-200K/帧 | 5-15帧 | 精细调整,避免过冲 |
| 慢速锁定 | ≤50K/帧 | 15帧以后 | 稳定输出,防止抖动 |
嗯,这里要注意:如果场景变化不大(比如同一房间内移动),直接用慢速锁定模式就好。只有检测到场景切换时才触发快速粗调。
三、AWB场景识别:别只靠色温
很多AWB算法只靠色温统计直方图来判断场景。但实际场景中,色温相同的光源可能完全不同。
举个例子:一个白炽灯(2800K)和一个蜡烛(2000K),色温接近,但光谱完全不同。如果只靠色温判断,AWB会给出同样的增益,但拍出来的肤色一个偏红一个偏黄。
我在项目中遇到过这样的坑:
- 荧光灯场景:色温4500K,但绿色分量偏高,需要额外减绿
- LED灯场景:色温4000K,但蓝色分量有尖峰,需要特殊处理
- 混合光源:窗口进来的日光(5500K)+ 室内暖光(3000K),AWB会取平均值,结果两边都不讨好
避坑指南:我曾经在一个项目中,AWB把夕阳场景识别成了室内暖光,结果把金色天空调成了白色。后来我加入了「天空检测」模块——如果画面顶部有大量蓝色或金色像素,优先按户外场景处理。
场景识别的核心思路是:
- 统计特征:色温直方图、饱和度分布、亮度分布
- 语义特征:人脸检测、天空检测、植物检测
- 时序特征:帧间变化量、场景切换检测
- 传感器辅助:环境光传感器、陀螺仪(判断是否在移动)
四、AWB与肤色保护:最难的一关
肤色保护是AWB调优中最头疼的问题。为什么?因为肤色本身就有很大的色温范围——白种人、黄种人、黑种人的肤色在色度图上的位置完全不同。
我见过最典型的场景:一个黄种人站在蓝色背景前,AWB为了把蓝色背景调白,把人的脸也调成了青色。用户看到照片直接崩溃。
我的做法是:
- 人脸区域优先:检测到人脸后,人脸区域的色温权重提高3-5倍
- 肤色色相约束:肤色的色相角在15°-45°之间(YUV空间),如果AWB调整后肤色色相超出这个范围,强制回退
- 多区域统计:把人脸区域和背景区域分开统计,分别计算色温
实战经验:我做过一个测试——让不同肤色的人站在不同颜色的背景前拍照。结果发现,如果背景是红色或橙色,AWB最容易翻车。因为红色背景和肤色的色度接近,AWB会把背景的红色误认为是肤色偏红,然后过度补偿。
解决方案其实不复杂:
// 伪代码:肤色保护逻辑
if (检测到人脸) {
// 计算人脸区域色温
faceCCT = computeCCT(faceROI);
// 计算背景区域色温
bgCCT = computeCCT(bgROI);
// 如果两者差异过大,优先保证人脸
if (abs(faceCCT - bgCCT) > 1000K) {
finalGain = faceGain * 0.7 + bgGain * 0.3;
} else {
finalGain = (faceGain + bgGain) / 2;
}
}
当然,这只是简化版本。实际项目中还要考虑人脸置信度、人脸大小、多人场景等等。
五、综合调优建议
说了这么多,最后给几个实战建议:
- 先做场景识别,再做色温估计:场景识别能帮你缩小色温搜索范围,减少误判
- 收敛速度要自适应:场景变化大时快,场景稳定时慢
- 肤色保护不能一刀切:不同肤色的人种,色温容忍度不同
- 多测试极端场景:日落、霓虹灯、混合光源、逆光人脸
我的习惯:每次调完AWB参数,我都会拿着手机去公司楼下拍一圈——室内、室外、阴天、晴天、黄昏、晚上。拍完回来在电脑上看直方图,看色温曲线。有时候肉眼觉得没问题,但数据会告诉你哪里还有问题。
AWB调优没有银弹。每个场景都有它的特殊性,每个传感器都有它的脾气。但只要你理解了色温、收敛、场景、肤色这四个维度的关系,大部分问题都能找到解决方案。
公众号:蓝海资料掘金营,微信deep3321