记录一些学习 ACES 的发现和个人理解。整个 ACES 可以看作是一份开放,完整,效果还不错的颜色管理系统,能够加深和补全对色彩科学的理解,比如仅是 IDT/CSC 就有不少细节值得关注。
IDT:不怎么好的名字
ACES 1.x 时,从各种设备空间进入 ACES 流程(一般进入 ACES 2065-1 空间)的转换叫做 Input Device Transform(IDT)。我觉得这个名字起的不是太好,给人一种和 Output Device Transform(ODT)对应的感觉,但实际上 IDT 和 ODT 无论是发挥的作用、还是运算的流程都很不相同,与这个命名问题接近的例子还有 OETF 和 EOTF。
ACES 2.0 开始,给它整了一个新名字,叫 Color Space Conversion(CSC),更贴近它实际发挥的作用,与 Davinci 中无裁切的色彩空间变换(CST)接近,从一个相机相关(设备不独立)的场景参考值变换进一个设备独立的统一空间中,本质和 RGB 空间们互转是一样的。
CSC 的具体过程
由于本质是 RGB 空间互转,过程也是一样的,流程是以下路径:
非线性映射
带一撇的 RGB 表示是非线性的,这里用了 OETF 的概念是因为我觉得 Log 也算一种 OETF,而且输入阶段的 CSC 全部都是在场景参考中操作的,如果是显示参考的空间,则要把非线性换成 EOTF。
对于 ACES CSC 来说,上面一条 OETF 的逆指的是 Log Decoding,下面的 OETF 是线性,ACES 2065-1 是一个线性 RGB 空间。
RGB 互转 XYZ
一般认为 RGB 空间是设备相关的(定义好的 RGB 空间其实是设备无关的),两个 RGB 空间互转需要经过一个公共的空间,比如 XYZ。线性的 RGB 与 XYZ 互转由一个 3 乘 3 的矩阵完成,这个矩阵可以由 RGB 的基色色坐标和白点色坐标算得。
其中的数学过程可以参考这篇略显潦草的 早期博客。
色适应
RGB 空间都有各自的白点,比如常见的 D65,或者 ACES 用的接近 D60 的白点。
如果直接把两个 RGB 互转 XYZ 怼在一起,但两边的白点不一样,会导致输入 R=G=B 的中性颜色,输出 RGB 之间不相等,变成了一个非中性色,在颜色管理中叫做绝对比色。
更常见的 CSC 需要的是相对比色,保持中性色仍然是中性,需要在 XYZ 空间上做一次色适应变换(CAT)来转换白点。现在能找到各种各样的色适应,颜色管理中最常用的是线性 Bradford 和 CAT02。
色适应基于 von Kries 理论,原理在此不再赘述,流程如下图所示:
由三个矩阵连乘构成,中间的对角阵在 LMS 空间上完成白点的完全适应。此处不同色适应的区别是第一和三矩阵数值不同。
简化
根据一开始的 CSC 流程图,在 ACES 输入中,只需要应用 Log Decoding 转为线性,再用一个 3 乘 3 矩阵变换到 ACES 2065-1 RGB 即可。
这个矩阵是由五个矩阵乘起来得到的,完成了 RGB 转 XYZ,XYZ 转 LMS,LMS 色适应,LMS 转 XYZ 和 XYZ 转 RGB。
在 colour-science 中,这些变换都包装好了,直接调用高层函数就可以获得矩阵,以及 Log 转线性光。
import colour
colour.log_decoding(x, "ARRI LogC4")
colour.matrix_RGB_to_RGB("ARRI Wide Gamut 4", "ACES2065-1")
默认的色适应是 CAT02,也可以指定别的,得到的矩阵和 LogC4 白皮书里的 M ACES 高度一致。
责任全在白点
ACES 空间的白点色坐标是 x=0.32168, y=0.33767,与标准照明体 D60 有非常细微的区别,并不是网上常说的 D60。
这个白点与几乎所有常用 RGB 空间的白点都不相同,进出 ACES 一定依赖色适应变换,这至少会引来两个隐患。
用什么色适应?
在 ST 2065-1 中,推荐用 CAT02 色适应,但 ACES Core Github 仓库里的默认值却是 Bradford。
尽管区别可能非常小,但不应该在这里引入不必要的误差,毕竟 ACES 的目标之一就是统一不同的摄影机素材。严谨起见,需要确认厂商提供的 DCTL 里用的是何种色适应(以及是否准确),或者达芬奇中的节点上做了哪一种色适应,甚至用一个单独的色适应节点来准确的选择。
ACES 内部还有进一步的转换,比如 ODT 中大多数操作都是在 JMh 上进行的,RGB 与 JMh 的互转还要用到色适应,ODT 内部的色适应接近 CAT16,又不完全相同,于是从输入到输出完整的处理包含了多步基于不同算法的色适应,很不优美。
色适应导致的超色域
AP0 被设计成完整覆盖马蹄图,一些相机的 RGB 编码空间被设计成与 AP0 相切,比如 Arri Wide Gamut 4 和 D-Gamut2,避免转入 ACES 工作流时出现负值。

而色适应之后,会导致整个 RGB 空间出现一点偏移,原本设计成恰好相切的空间此时就会有一些边界超过 AP0,出现负值,虽然程度很轻微,但仍需注意,尤其是需要完全无损的逆变换时。这点在 LogC4 的白皮书中也有提及。

比如 AWG4 的蓝原色,用 CAT02 进入 ACES 2065-1 后的码值为 (0.10462, -0.00822, 1.00135)。
CST 的妙用
达芬奇里完成这样变换的节点叫 Color Space Transform(CST),上面这些基本的转换能够确保颜色的精确物理位置不变,但不同空间大小不一样,难免出现超过色域的现象,在数学上表现为负数或超过上限的数。CST 节点还可以额外应用色域压缩和色调映射来解决这些数,但可能会破坏原本精确不变的物理位置。
把 CST 节点的色域压缩和色调映射都关掉,并开启色适应,就等同于 ACES 的 IDT 或输入 CSC。
在达芬奇里,做输入 CSC 有各种办法,可以用 CST,用厂商提供的 DCTL,或者用 ACES 节点,在理论上都是正确和“一致”的。但要注意色适应方法的差异,超色域情况的处理这种细节问题,以及小心有厂商提供错误的 DCTL。
这里 是一个 CAT02 色适应、适用于 Vivo-Log Vivo Wide Gamut 的 CSC dctl,矩阵是预先算好的。
2026.09.22 更新:今天,Vivo 更新了一个不加密的 DCTL,用于实现 ACES IDT,其中使用的白点色适应接近于“XYZ 缩放”而非 CAT02 或 Bradford,请不要与上面提供的 DCTL 混用。