相机白平衡:色温概念、白平衡模式与手动调节

各位同学,今天我们来聊聊白平衡。嗯,这名字听起来有点玄乎,但说白了,就是让相机知道“什么是白色”。

我刚开始做摄像头开发时,觉得白平衡不就是个滤镜嘛,后来被项目里的偏色问题狠狠教育了一顿。你想想看,同一个场景,日光下拍出来暖洋洋的,荧光灯下拍出来却发绿,这要是给用户看,不骂娘才怪。

所以,白平衡是成像质量里非常基础、也非常关键的一环。今天我就把色温、自动白平衡、常见模式以及手动调节这些事,掰开了讲清楚。

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 图,把色温、模式、手动调节的关系串起来了。你一看就明白。

白平衡知识体系 白平衡 色温概念(1500K-7500K) 白平衡模式(AWB/预设) 手动白平衡调节 低色温(暖) 高色温(冷) AWB 自动模式 日光/荧光灯等预设 锁定色温值 设置 COLOR_CORRECTION_GAINS 关闭 AWB 模式 三者关系:色温是基础,模式是快捷方式,手动调节是终极手段

注意:不是所有 Android 设备都支持手动色温调节。低端机可能只提供预设模式,没有 COLOR_CORRECTION_GAINS 接口。开发前一定要检查 CameraCharacteristics 里的能力列表。

5. 避坑指南

最后,分享几个我踩过的坑:

  • 曾经我在荧光灯下用 AWB 拍文档,结果白纸变成了淡绿色。后来换成荧光灯预设模式,问题解决。所以,固定光源场景,别偷懒用 AWB。
  • 曾经我手动调色温时,忘了关 AWB 模式,调了半天没效果。记住:手动调节前,先 CONTROL_AWB_MODE_OFF
  • 曾经我在混合光源下用固定色温值,结果人脸正常了,背景却偏色。这时候只能做区域白平衡,或者让用户自己选一个折中值。没有完美的方案。

嗯,白平衡这块,说白了就是让相机理解光。你理解了色温,就理解了白平衡的一半。剩下的,就是多试、多调、多踩坑。

希望今天的内容对你有帮助。下次遇到偏色问题,别慌,先看看是什么光。


公众号:蓝海资料掘金营,微信deep3321