色彩理论基础:CIE 1931色度图、RGB与XYZ色彩空间转换、色域映射概念
做白平衡调优,如果不理解色彩理论,就像修车不看发动机。你调出来的参数可能看起来对了,但换个场景就崩了。
我个人习惯,每次接手一个新平台的ISP调试,第一件事不是跑标定,而是先把色彩空间转换矩阵捋一遍。为什么?因为后面所有的AWB决策、色彩还原、肤色保护,全建立在这个基础上。
CIE 1931色度图:人眼看到的颜色到底长什么样?
1931年,CIE搞了一次大规模主观实验。他们让受试者去匹配各种单色光,最后画出了三条颜色匹配函数曲线——这就是CIE 1931 RGB标准色度系统的基础。
但RGB有负值,用起来很别扭。于是他们做了个数学变换,把负值全部干掉,得到了XYZ色彩空间。然后从XYZ里提取出x和y两个坐标,画出了那张经典的“马蹄图”。
核心理解:CIE 1931色度图不是“真实照片”,它是人眼对颜色感知的数学映射。马蹄形边界代表单色光(光谱轨迹),内部区域代表所有可能的混合色。中心区域是白色点,不同色温的白点位置不同。
我在项目中遇到过一件事:用两个不同厂家的屏幕看同一张图,颜色差异很大。一查,两个屏幕的色域覆盖范围不同,白点坐标也不同。这就是色度图最直接的工程意义——它能帮你量化“颜色差异”。
RGB与XYZ色彩空间转换:数学桥梁
相机传感器输出的是RGB值,但RGB是设备相关的。同一个RGB值,在不同显示器上颜色不同。XYZ是设备无关的,它是“颜色坐标”。
所以,所有色彩管理的第一步,就是把RGB转成XYZ。
转换公式长这样:
| X | | 0.4124564 0.3575761 0.1804375 | | R |
| Y | = | 0.2126729 0.7151522 0.0721750 | | G |
| Z | | 0.0193339 0.1191920 0.9503041 | | B |
这是sRGB到XYZ的标准转换矩阵。注意,这个矩阵假设RGB已经是线性值了。如果你拿到的RGB是Gamma编码后的,必须先做逆Gamma校正。
我曾经踩过的坑:有一次做AWB标定,怎么调都偏色。查了两天,发现是RGB数据没做线性化,直接把sRGB的非线性值扔进了转换矩阵。结果白平衡算出来的增益全是错的。记住:矩阵转换的前提是线性RGB。
反过来,XYZ转RGB也一样:
| R | | 3.2404542 -1.5371385 -0.4985314 | | X |
| G | = | -0.9692660 1.8760108 0.0415560 | | Y |
| B | | 0.0556434 -0.2040259 1.0572252 | | Z |
你想想看,这套矩阵其实就是把颜色从一个坐标系搬到另一个坐标系。但搬的时候要注意——XYZ空间是无限大的,而RGB空间是有边界的。这就引出了下一个问题。
色域映射概念:当颜色超出边界时怎么办?
色域,说白了就是一个色彩空间能表示的所有颜色的范围。sRGB的色域小,Adobe RGB大一些,DCI-P3更大,Rec.2020更大。
当你把一张宽色域的图放到窄色域设备上显示时,有些颜色就“溢出”了。这时候必须做色域映射——把超出边界的颜色“拉”回来。
映射策略主要有几种:
| 映射方式 | 做法 | 适用场景 |
|---|---|---|
| 感知映射 | 整体压缩色域,保持相对关系 | 照片、视频,视觉自然 |
| 相对色度映射 | 只映射超出部分,内部颜色不变 | Logo、图标,要求颜色准确 |
| 色度映射 | 保持白点不变,硬裁剪溢出 | 打样、印刷校对 |
| 饱和度映射 | 优先保持饱和度,牺牲亮度 | 商业展示、高饱和内容 |
嗯,这里要注意:色域映射没有“正确”的方案。我在做手机摄像头调试时,不同场景会选不同策略。拍风景用感知映射,拍商品用相对色度映射。你得根据最终用途来定。
个人经验:做AWB调优时,色域映射的影响经常被忽略。你辛辛苦苦把白平衡调准了,结果色域映射一过,颜色又偏了。所以我的建议是:把色域映射纳入AWB pipeline一起调,不要分开做。
本章知识结构图
下面这张图把三个核心概念的关系串起来了:
这张图想表达的核心逻辑是:CIE 1931定义了颜色的“宇宙”,RGB和XYZ是两种不同的“坐标系”,色域映射则是当你要把颜色从一个坐标系搬到另一个坐标系时,处理“越界”问题的工程手段。
做AWB调优,你每天都在跟这三样东西打交道。理解它们的关系,比背一百个公式都管用。