4. 光源估计基础:灰度世界、完美反射与物理模型

做白平衡,说白了就是猜光源。你猜对了光源颜色,就能把偏色拉回来。猜错了,画面就变得诡异。

我刚开始接触这个领域时,总觉得算法越复杂越好。后来被现实教育了——简单假设往往最鲁棒。今天聊的三个方法,就是最经典的“猜光源”套路。

4.1 灰度世界假设(Gray World)

这个假设很直白:一张色彩丰富的照片,所有像素的RGB平均值应该是灰色。也就是 R平均 ≈ G平均 ≈ B平均。

为什么会这样?因为自然场景里各种颜色混合后,理论上会趋向中性灰。如果照片偏黄,那R和G的平均值就会明显高于B。我们只需要把三个通道的平均值拉到同一水平,偏色就校正了。

核心公式:
增益 R = G平均 / R平均
增益 G = 1
增益 B = G平均 / B平均

嗯,这里要注意——这个假设有个致命前提:场景必须色彩丰富。如果画面里全是蓝天(比如海景),那B通道平均值天然就高,强行拉平反而会把天空变成灰色。

我在项目中遇到过这种情况:用户拍了一组室内产品图,背景是纯红色绒布。灰度世界算法直接把红色压没了,产品本身也偏青。后来我加了饱和度掩码,只对低饱和度区域做灰度世界估计,效果才正常。

适用场景

  • 自然风景:色彩丰富,假设成立
  • 街拍/日常:场景杂乱,颜色分布均匀
  • 不适合:纯色背景、单色物体占主导的画面

4.2 完美反射假设(White Patch)

这个假设换个角度想:画面里最亮的那个点,应该是纯白色。因为任何物体表面,如果它反射了所有波长的光,那它就是白的。

实际操作很简单:找到图像中RGB三个通道各自的最大值,或者找到亮度最高的像素点,然后把这个点映射成白色,其他像素按比例调整。

我的经验: 直接用全局最大值容易受噪点干扰。我习惯先做分位数截断——取亮度前1%的像素平均值,而不是单个最大值。这样抗噪能力强很多。

我曾经在一个项目中调试医疗内窥镜图像,画面里有强光斑(镜面反射)。完美反射算法直接把光斑当成了参考白,结果整个画面偏蓝。后来我加了镜面反射检测,排除掉高光区域,才拿到正确的参考白点。

灰度世界 vs 完美反射

对比维度 灰度世界 完美反射
核心假设 平均色为灰 最亮点为白
依赖条件 色彩丰富 存在白色参考
抗噪能力 较强(均值平滑) 较弱(受极值影响)
典型失败场景 单色场景 无白色物体

4.3 基于物理模型的假设

前面两个方法都是纯统计,不讲物理。而物理模型试图从光照-物体-相机的成像链路出发,反推光源。

最经典的是朗伯特模型:假设物体表面是理想漫反射面,那么图像颜色 = 光源光谱 × 物体反射率。我们想求的是光源,但物体反射率是未知的——这是一个病态问题。

怎么解?加约束。比如:

  • 有限维线性模型:假设光源和反射率都可以用少量基函数表示
  • 色域映射法:统计自然场景中“可能的光源-物体颜色”组合,建立查找表
  • 光照不变图像:通过对数变换和微分,分离光照和反射成分
避坑指南: 物理模型理论上最精确,但实际落地时参数调起来很痛苦。我曾经尝试用色域映射法做手机拍照的白平衡,结果不同传感器型号的色域差异巨大,标定工作量爆炸。最后我选择了混合策略——物理模型做粗估计,灰度世界做细调。

4.4 三种方法的核心逻辑对比

我把它们画成了一张图,方便你理解各自的位置:

三种光源估计方法的核心逻辑 灰度世界假设 假设:平均色 = 灰色 方法:RGB均值对齐 优点:简单、抗噪 缺点:单色场景失效 完美反射假设 假设:最亮点 = 白色 方法:极值映射 优点:物理直观 缺点:受噪点/高光影响 物理模型假设 假设:成像链路可逆 方法:基函数/色域映射 优点:理论精确 缺点:标定复杂 三者互补:简单场景用灰度世界,有白色参考用完美反射,高精度需求用物理模型

4.5 实际项目中的选择策略

你可能会问:那我到底用哪个?

我个人习惯按这个优先级判断:

  1. 先检测场景中是否有白色/灰色参考物——有就用完美反射
  2. 没有参考物,但色彩丰富——灰度世界,稳
  3. 场景单一,但有标定数据——上物理模型
  4. 啥都没有,还要高精度——三个方法投票融合
一个小技巧: 我经常把灰度世界和完美反射的结果做加权平均。权重根据图像方差动态调整——方差大(色彩丰富)就多信任灰度世界,方差小(颜色单一)就多信任完美反射。效果比单一方法好不少。