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三个通道各自的最大值,或者找到亮度最高的像素点,然后把这个点映射成白色,其他像素按比例调整。
我曾经在一个项目中调试医疗内窥镜图像,画面里有强光斑(镜面反射)。完美反射算法直接把光斑当成了参考白,结果整个画面偏蓝。后来我加了镜面反射检测,排除掉高光区域,才拿到正确的参考白点。
灰度世界 vs 完美反射
| 对比维度 | 灰度世界 | 完美反射 |
|---|---|---|
| 核心假设 | 平均色为灰 | 最亮点为白 |
| 依赖条件 | 色彩丰富 | 存在白色参考 |
| 抗噪能力 | 较强(均值平滑) | 较弱(受极值影响) |
| 典型失败场景 | 单色场景 | 无白色物体 |
4.3 基于物理模型的假设
前面两个方法都是纯统计,不讲物理。而物理模型试图从光照-物体-相机的成像链路出发,反推光源。
最经典的是朗伯特模型:假设物体表面是理想漫反射面,那么图像颜色 = 光源光谱 × 物体反射率。我们想求的是光源,但物体反射率是未知的——这是一个病态问题。
怎么解?加约束。比如:
- 有限维线性模型:假设光源和反射率都可以用少量基函数表示
- 色域映射法:统计自然场景中“可能的光源-物体颜色”组合,建立查找表
- 光照不变图像:通过对数变换和微分,分离光照和反射成分
4.4 三种方法的核心逻辑对比
我把它们画成了一张图,方便你理解各自的位置:
4.5 实际项目中的选择策略
你可能会问:那我到底用哪个?
我个人习惯按这个优先级判断:
- 先检测场景中是否有白色/灰色参考物——有就用完美反射
- 没有参考物,但色彩丰富——灰度世界,稳
- 场景单一,但有标定数据——上物理模型
- 啥都没有,还要高精度——三个方法投票融合