【颜色科学】RGB和XYZ颜色空间的转换

1 相关内容

色彩空间(color space)具体的定义可以参照这里[1],简单的说就是定量描述一个颜色子集的方法。现在在我们的显示设备中,常用的色域有sRGBAdobe RGBdisplay P3等,以及比较超前的Rec.2020

为了保证同一张图片在不同输入、输出、显示设备上都呈现出最好的颜色,色彩管理会对图片进行色彩管理以适配当前设备环境下的颜色效果。例如一张P3色域下拍摄的照片在一台未经过色彩管理的sRGB显示器中显示,亦或者是打印机打印,都会很容易的发现颜色的失真。而相关的标准由INTERNATIONAL COLOR CONSORTIUM(国际色彩协会)[2]制定,电子设备和图片色域通常用颜色描述文件来描述,在电脑中一般以.icc的格式存在。

上述提到的颜色空间可以统称为RGB颜色空间,都是以redgreenblue三个颜色分量来描述一个具体的颜色。而要在这些颜色空间之间转化,则需要一个中间颜色空间参与,XYZ颜色空间,当然,还有一个更加正式的名字, CIE 1931 XYZ color space[3],以下都简称XYZ颜色空间。

相关的概念较多,整个说起来东西很多,这里就不展开说了。本文主要记录一下RGB颜色空间与XYZ颜色空间的转换公式与方法。

R G B → X Y Z \bold{RGB}\rightarrow \bold{XYZ} RGBXYZ

  • 从某个RGB空间下转化到线性RGB空间
  • 从线性RGB通过 M M M矩阵转化到XYZ空间

R G B 1 → R G B 2 \bold{RGB1}\rightarrow \bold{RGB2} RGB1RGB2

  • R G B 1 → X Y Z RGB1 \rightarrow XYZ RGB1XYZ
  • X Y Z → R G B 2 XYZ \rightarrow RGB2 XYZRGB2

那么其实核心问题就是RGB与XYZ的转化,而这个转化问题的核心就在于 M M M矩阵的获取。

一些常用的RGB空间与XYZ空间的转化矩阵基本可以在网络上找到,而目前博客中给出的转换算法在没有特别说明的情况下基本都是指sRGBXYZ之间的转化。所以当一张图片的描述文件是诸如Adobe RGBDisplay 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文件的构成:

P3 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

  • 10
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值