相机白平衡:色温概念、白平衡模式与手动调节
各位同学,今天我们来聊聊白平衡。嗯,这名字听起来有点玄乎,但说白了,就是让相机知道“什么是白色”。
我刚开始做摄像头开发时,觉得白平衡不就是个滤镜嘛,后来被项目里的偏色问题狠狠教育了一顿。你想想看,同一个场景,日光下拍出来暖洋洋的,荧光灯下拍出来却发绿,这要是给用户看,不骂娘才怪。
所以,白平衡是成像质量里非常基础、也非常关键的一环。今天我就把色温、自动白平衡、常见模式以及手动调节这些事,掰开了讲清楚。
1. 色温:光的“脾气”
色温,不是指温度高低,而是指光的颜色倾向。单位是开尔文(K)。
数值越低,光越偏红黄,比如烛光(约1800K),看着就暖。数值越高,光越偏蓝,比如阴天的天空(约7000K),看着就冷。
我在项目中遇到过最头疼的一次:室内混合光源——一边是暖色台灯,一边是窗外冷色天光。相机直接懵了,拍出来人脸一半黄一半蓝。这就是色温不统一带来的麻烦。
下面这张表,是常见光源的色温范围,建议你收藏一下:
| 光源类型 | 色温范围(K) | 颜色倾向 |
|---|---|---|
| 烛光 | 1500 - 2000 | 红橙 |
| 白炽灯 | 2500 - 3000 | 暖黄 |
| 荧光灯 | 4000 - 5000 | 冷白/微绿 |
| 正午日光 | 5000 - 5500 | 中性白 |
| 阴天/阴影 | 6000 - 7500 | 偏蓝 |
记住,色温是客观存在的物理量。相机要做的,就是根据这个数值,把画面里的“白色”校正回真正的白色。
2. 白平衡模式:自动 vs 预设
Android 相机提供了几种白平衡模式,说白了就是给相机一个“色温参考值”。
- AWB(自动白平衡):相机自己猜色温。大部分场景下够用,但遇到复杂光源就容易翻车。我习惯在户外光线均匀时用 AWB,省心。
- 日光(Daylight):固定色温约 5200K。适合晴天户外,颜色最正。
- 荧光灯(Fluorescent):固定色温约 4200K。专门对付办公室那种发绿的灯管。
- 白炽灯(Incandescent):固定色温约 3000K。暖色灯光下用这个,能去掉那种黄黄的色调。
- 阴天(Cloudy):固定色温约 6000K。阴天拍出来偏蓝,用这个模式可以加暖回来。
你可能会问:“为什么不用 AWB 一劳永逸?” 嗯,AWB 毕竟是算法猜的。我在做扫码功能时发现,AWB 在纯色背景(比如一张白纸)下会来回漂移,导致画面忽冷忽热。这时候就必须锁定一个预设模式。
核心原则:光源越单一,AWB 越准;光源越复杂,手动指定模式越稳。
3. 手动白平衡调节:自己说了算
预设模式不够用怎么办?那就自己动手调。Android 提供了手动色温调节接口,说白了就是直接告诉相机:“我要色温 4500K,你给我按这个来。”
代码示例(Camera2 API):
// 获取摄像头特性
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
Range<Integer> tempRange = characteristics.get(CameraCharacteristics.COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES);
// 创建捕获请求
CaptureRequest.Builder requestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
// 手动设置色温值(单位:开尔文)
requestBuilder.set(CaptureRequest.COLOR_CORRECTION_MODE, CaptureRequest.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX);
requestBuilder.set(CaptureRequest.COLOR_CORRECTION_GAINS, new float[]{1.0f, 1.0f, 1.0f, 1.0f}); // RGGB 增益
// 如果你只想调色温,可以用更直接的方式(部分设备支持)
// requestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_OFF);
// requestBuilder.set(CaptureRequest.COLOR_CORRECTION_GAINS, computeGainsForColorTemperature(4500f));
注意,手动调节时,需要先把 CONTROL_AWB_MODE 设为 OFF,否则你设的色温会被自动模式覆盖掉。我曾经在这里栽过跟头——调了半天色温没反应,最后发现 AWB 还开着。
我的小技巧:手动调节时,先让用户对着白纸拍一张,然后取画面中央区域的 RGB 值,反算出需要的色温增益。这样比凭感觉调要准得多。
4. 知识体系:一张图看懂白平衡
下面这张 SVG 图,把色温、模式、手动调节的关系串起来了。你一看就明白。
注意:不是所有 Android 设备都支持手动色温调节。低端机可能只提供预设模式,没有 COLOR_CORRECTION_GAINS 接口。开发前一定要检查 CameraCharacteristics 里的能力列表。
5. 避坑指南
最后,分享几个我踩过的坑:
- 曾经我在荧光灯下用 AWB 拍文档,结果白纸变成了淡绿色。后来换成荧光灯预设模式,问题解决。所以,固定光源场景,别偷懒用 AWB。
- 曾经我手动调色温时,忘了关 AWB 模式,调了半天没效果。记住:手动调节前,先
CONTROL_AWB_MODE_OFF。 - 曾经我在混合光源下用固定色温值,结果人脸正常了,背景却偏色。这时候只能做区域白平衡,或者让用户自己选一个折中值。没有完美的方案。
嗯,白平衡这块,说白了就是让相机理解光。你理解了色温,就理解了白平衡的一半。剩下的,就是多试、多调、多踩坑。
希望今天的内容对你有帮助。下次遇到偏色问题,别慌,先看看是什么光。