文章目录
1 相关内容
色彩空间(color space)具体的定义可以参照这里[1],简单的说就是定量描述一个颜色子集的方法。现在在我们的显示设备中,常用的色域有sRGB、Adobe RGB、display P3等,以及比较超前的Rec.2020。
为了保证同一张图片在不同输入、输出、显示设备上都呈现出最好的颜色,色彩管理会对图片进行色彩管理以适配当前设备环境下的颜色效果。例如一张P3色域下拍摄的照片在一台未经过色彩管理的sRGB显示器中显示,亦或者是打印机打印,都会很容易的发现颜色的失真。而相关的标准由INTERNATIONAL COLOR CONSORTIUM(国际色彩协会)[2]制定,电子设备和图片色域通常用颜色描述文件来描述,在电脑中一般以.icc
的格式存在。
上述提到的颜色空间可以统称为RGB颜色空间,都是以red
、green
、blue
三个颜色分量来描述一个具体的颜色。而要在这些颜色空间之间转化,则需要一个中间颜色空间参与,XYZ颜色空间,当然,还有一个更加正式的名字, CIE 1931 XYZ color space[3],以下都简称XYZ颜色空间。
相关的概念较多,整个说起来东西很多,这里就不展开说了。本文主要记录一下RGB颜色空间与XYZ颜色空间的转换公式与方法。
R G B → X Y Z \bold{RGB}\rightarrow \bold{XYZ} RGB→XYZ
- 从某个RGB空间下转化到线性RGB空间
- 从线性RGB通过 M M M矩阵转化到XYZ空间
R G B 1 → R G B 2 \bold{RGB1}\rightarrow \bold{RGB2} RGB1→RGB2
- R G B 1 → X Y Z RGB1 \rightarrow XYZ RGB1→XYZ
- X Y Z → R G B 2 XYZ \rightarrow RGB2 XYZ→RGB2
那么其实核心问题就是RGB与XYZ的转化,而这个转化问题的核心就在于 M M M矩阵的获取。
一些常用的RGB空间与XYZ空间的转化矩阵基本可以在网络上找到,而目前博客中给出的转换算法在没有特别说明的情况下基本都是指sRGB
与XYZ
之间的转化。所以当一张图片的描述文件是诸如Adobe RGB
、Display P3
时,都使用一样的转化方式势必会产生误差。
本文第二部分将说一下如何自己计算对应的转化矩阵 M M M,计算过程参考[4]。
如果已经获取了 M M M矩阵并想直接进行计算的,可以跳过第二部分,直接看第三部分。
2 计算 M M M矩阵
只要得到以下信息,就可以把一个颜色从它所在的RGB空间转化到XYZ颜色空间。
- 三原色色品坐标
- 参考白点
那么如何获取这里提到的色品坐标和参考白点,我在这简单说一下两种方法。
- 直接在一些网站上获取,比如这里。当然还有一些颜色相关的书籍资料百科等
- 通过
.icc
文件中计算得到
颜色描述文件
因为在上述提到的网站里并没有给出P3的基准,虽然也可以在维基上找到,这里还是简单提一下从ICC文件获取数据计算转换矩阵的方法。
在MAC OS下,系统ICC可以直接从设置
→ \rightarrow →显示器
→ \rightarrow →颜色
或者App
→ \rightarrow →色彩同步实用工具
中直接查看。
在Windows下,可以使用ICC官网上的小软件。
这里简单看一下ICC文件的构成:
简单说明一下上述矩形框里的内容依次下来,分别为:
- 该颜色空间的参考白点(Display P3为D65光源,当然大部分显示设备下使用的参考白点都是D65光源,与日光接近)
- 照明条件下(D50)三基色在XYZ颜色空间下的值
- gamma曲线
- 颜色适应矩阵(chromatic adaptation matrix),用于不同光源之间进行色适应算法
- 整个ICC的标签头,记录了相关信息,其中PCS(Profile Connect Space)就是基于D50配置的连接空间,下面的PCS光源也就是D50的光源
根据前一部分说的,我们这里直接能用的就是参考白点的数据,即D65的白点。
而三原色色品坐标要简单的处理一下,从D50色适应到D65,方法也很简单,就是用上述chad
标签里给的色适应矩阵转换一下即可。
源空间的 X S , Y S , Z S X_S,Y_S,Z_S XS,YS,ZS经过色适应矩阵 M A M_A MA转换到目标空间的 X D , Y D , Z D X_D,Y_D,Z_D XD,YD,ZD,公式表达如下:
[ X D Y D Z D ] = [ M A ] [ X S Y S Z S ] \begin{bmatrix}X_D\\Y_D\\Z_D\end{bmatrix} = [M_A]\begin{bmatrix}X_S\\Y_S\\Z_S\end{bmatrix} ⎣⎡XDYDZD⎦⎤=[MA]⎣⎡XSY