WCS 转换创建算法

创建转换

 

顺序转换执行

 

创建优化转换

 

ICCProfileFromWCSProfile

 

黑人保存和黑色一代

 

检查域

创建转换

为了正确解释颜色转换的工作原理,通过 ICM 2.0 和 CTE 的内部结构解释完整的处理路径很有帮助。 ICM 2.0 CreateColorTransformW 函数创建一个颜色转换,应用程序可以使用该颜色转换来执行颜色管理。 此函数从 LOGCOLORSPACE 和意向输入创建颜色上下文。 意向映射到基线 ICC 域映射算法相关。 然后,该函数调用 ICM 2.0 函数 CreateMultiProfileTransform ,以便进行一致的颜色处理。 CreateColorTransform 函数通常将数据复制到内部优化的转换结构中。

ICM 2.0 CreateMultiProfileTransform 函数接受配置文件数组和意向数组或单个设备链接配置文件,并创建应用程序可用于执行颜色映射的颜色转换。 它处理这些输入配置文件和意向,以创建设备模型、颜色外观模型、色域边界说明和色域映射模型。 下面是完成此操作的方式:

  • 设备模型直接从 DM 配置文件初始化。 在对 CreateMultiProfileTransform 的调用中,每个配置文件都创建了一个设备模型。
  • 颜色外观模型直接从 CAM 配置文件初始化。 调用 CreateMultiProfileTransform 时,每个配置文件都有一个 CAM 配置文件。 但是,可以为多个配置文件指定相同的 CAM 配置文件。
  • 范围边界说明是从设备模型对象和 CAM 对象初始化的。 调用 CreateMultiProfileTransform 时,每个配置文件都有一个范围边界说明。
  • 从两个范围边界和一个意向初始化范围映射模型。 必须在通过调用 CreateMultiProfileTransform 创建的每对设备模型之间创建一个范围映射模型。 请注意,这意味着你使用的域映射模型比设备模型少一个。 由于意向数与设备模型数匹配,因此还有一个意向比所需多。 跳过列表中的第一个意向。 浏览设备模型和意向列表,创建色域映射模型。 选取第一个和第二个设备模型以及第二个意向,然后初始化第一个域映射模型。 选取第二个和第三个设备模型以及第三个意向,然后初始化第二个域映射模型。 以这种方式继续,直到已创建所有域映射模型。

正确处理配置文件并创建并初始化所有中间对象后,可以使用以下调用创建 CITE 转换。 pDestCAMpDestDM 是与 CreateMultiProfileTransform 调用中最后一个配置文件关联的配置文件。

HRESULT CreateCITEColorTransform(
 __inout     IDeviceModel          *pSourceDM,
 __inout     IColorAppearanceModel *pSourceCAM,
 __in        GamutMapArray         *pGamutMapArray,
 __inout     IColorAppearanceModel *pDestCAM,
 __inout     IDeviceModel          *pDestDM,
             EColorTransformMode    eTransformMode,
 __deref_out IColorTransform      **ppCTS
 );

对插件的支持

设置转换列表时涉及的一个问题是验证所需的插件是否可用。 以下模型开关提供此策略来控制此行为。 此转换列表的管理是内部优化转换结构中的一种方法,但每个模型方法都提供指向自身及其自己的参数值集的指针。

模式必须是以下模式之一。

  • TfmRobust:如果度量配置文件指定了首选插件,并且该插件不可用,则新的 CTE 系统将使用基线插件。 如果两个插件都不可用,转换将报告错误。
  • TfmStrict:如果 ColorContext 指定首选插件,该插件必须可用。 如果未找到首选插件,将使用基线插件。 如果两个插件都不可用,转换将报告错误。
  • TfmBaseline:AddMeasurementStep 中只能使用基线插件。 如果 ColorContext 指定首选插件,则将忽略该插件。 如果基线插件不可用,转换将报告错误。

转换执行

ICM 2.0 API TranslateColors 函数将颜色数组从源 颜色空间 转换为由颜色转换定义的目标颜色空间。 此函数在内部检查缓存的颜色数组,以实现常见转换颜色的即时匹配。 此转换支持每个通道 8 位字节数组和 32 位/通道浮点数组。 所有其他格式将在传递到新的 CTE 之前进行转换。

ICM 2.0 API TranslateBitmapBits 函数转换具有定义格式的位图的颜色,以以请求的格式生成另一个位图。 此函数在内部检查缓存的颜色数组,以实现常见转换颜色的即时匹配。 为了避免过多的代码路径、支持和测试复杂性,转换和内插引擎实际上只支持有限数量的位图格式。 此函数必须将非本机传入和传出位图格式转换为本机支持的格式进行处理。 此转换仅支持每个通道 8 位字节位图和每个通道 32 位浮点位图。 所有其他格式将在传递到新的 CTE 之前进行转换。

 

顺序转换执行

如果在调用 ICM 函数 CreateColorTransformWCreateMultiProfileTransform 时设置了 dwFlags 参数SEQUENTIAL_TRANSFORM位,则按顺序执行转换步骤。 这意味着代码会按照 CreateColorTransformCreateMultiProfileTransform 调用的指定,分别遍历每个设备模型、颜色外观模型和色域映射模型。 这可能有助于调试插件模块,但它比通过优化的转换执行要慢得多。 因此,不建议在生产软件中以顺序模式运行。 此外,在顺序模式和优化模式下获得的结果可能略有不同。 这是由于函数串联在一起时引入的变体。

创建优化转换

优化转换是一个多维查找表。 表可由多维内插引擎(如四面体内插)处理,该引擎将输入颜色应用于转换。 以下部分介绍如何创建优化的查找表。 后面的部分介绍如何在优化的查找表中内插。

稀疏查找表

传统打印机具有 CMYK 墨迹。 若要扩展范围,一种方法是向系统添加新墨迹。 通常添加的墨迹是 CMYK 墨迹难以重现的颜色。 常见选项包括橙色、绿色、红色、蓝色等。为了提高“明显分辨率”,可以使用不同色调的墨迹,例如浅青色、浅洋红色等。 实际上,打印机设备具有四个以上的通道。

尽管打印机是输出设备,但它们也会执行从设备空间到另一个颜色空间的颜色转换。 对于 CMYK 打印机,这是从 CMYK 到 XYZ 的转换,或者是打印机的“前向模型”。 通过将前向模型与其他转换相结合,可以在另一台设备上模拟 CMYK 打印。 例如,将打印机 CMYK 转换为监视器 RGB 将使校对机制成为可能,该校对机制可模拟监视器上该 CMYK 打印机的打印。 同样,这同样适用于 hi-fi 打印机。 CMYKOG 到 RGB 的转换允许在监视器上对 CMYKOG 打印机进行校对。

实现此类颜色转换的传统方法是使用统一 LUT。 例如,在 CMYKOG 打印机的 ICC 配置文件中,ICC 规范要求使用 A2B1 标记,该标记在前向模型的 CMYKOG 设备空间中存储表示统一采样的统一 LUT,该空间从 CMYKOG 到 ICC 配置文件连接空间 (CIELAB 或 CIEXYZ) 。 ICC 设备链接配置文件允许从 CMYKOG 设备空间直接转换为任何颜色空间,包括设备空间,这也是在 CMYKOG 空间中统一采样的 LUT 形式。 由于产生巨大的 LUT, (位深度为 8) 的 256 个级别永远不会进行采样,除非单色设备 (1 通道) 。 而是使用具有较低位深度的采样;一些典型的选择是 9 (位深度 3) 、17 (位深度 4) 、33 (位深度 5) 。 如果每个通道中的级别数小于 256,则 LUT 与内插算法结合使用,如果一个级别介于两个采样级别之间,则生成结果。

虽然统一 LUT 在概念上很容易实现,并且对统一 LUT 进行内插通常很有效,但 LUT 大小会随着输入维度呈指数级增长。 事实上,如果 d 是统一 LUT 中使用的步骤数, n 是源颜色空间中的通道数,则 LUT 中的节点数为 显示 LUT 中节点数的变量。 显然,节点数很快需要内存中的大量存储,以至于即使是顶级计算系统也难以处理需求。 对于具有 6 个或 8 个通道的设备,设备配置文件的 ICC 实现需要在 LUT 中使用几个步骤,有时在 A2B1 表中甚至只需执行 5 个步骤,才能将配置文件保持在兆字节内,而不是千兆字节。 显然,使用较少的步骤会增加内插误差,因为现在样本更少。 由于 LUT 必须是统一的,因此即使在空间的那些区域中,整个颜色空间的准确度也会降低,因为设备值的微小变化可能会导致明显的颜色差异。

在具有四种以上着色剂的设备中,整个设备空间的某些子空间比其他子空间更重要。 例如,在 CMYKOG 空间中,青色和绿色墨迹很少一起使用,因为它们的色调在很大程度上相互重叠。 同样,黄色和橙色墨迹在很大程度上相互重叠。 步骤数量的统一减少可以视为整个颜色空间的质量整体下降,这是你为不可能的墨迹组合而承受的,但对于可能或重要的组合来说,这是可以承受的。

虽然统一采样的 LUT 对于内插简单且高效,但随着维度的增加,它带来了巨大的内存要求。 实际上,虽然设备可能有六个或八个通道,但它们很少同时使用。 在大多数情况下,输入颜色到颜色转换只有少数“活动”着色剂,因此驻留在低维颜色空间中。 这也意味着,内插可以更有效地在较低维空间中完成,因为当维度较低时,内插速度更快。

因此,方法是将整个设备空间分层到不同维度的子空间中。 由于较低尺寸 (将三种或四种着色剂) 组合在一起的着色剂更为重要,因此通过分层空间,还可以应用不同的采样率:即,不同数量的步骤,到碎片;提高较低维度的采样率,减少较高维度的采样率。

若要修复表示法, n 是要采样的颜色转换的源颜色空间中的通道数。 还可以将 n 引用为输入维度,“ 显示 n 大于或等于 5. ”,除非另行指定。

基本构建基块是具有各种输入 维度 和大小的 LUT,而不是具有输入维度 n 的统一 LUT。 更确切地说,LUT 是强加于单元立方体的矩形晶格:也就是说,所有设备坐标都规范化为范围 [0, 1]) 。 如果 是 lut 的输入维度 (请注意,不一定等于 n,尽管 显示 V 小于或等于 n 是 必需) ,则它由 ν 一维采样网格组成:

Samp i显示一维采样网格。

其中,所有 xj都必须 位于 [0, 1]范围内, 显示上标 d (i) 。第 i 个通道采样的步骤数(必须至少为 1), 显示 X (下标的 spuperscript) d (i) 。 必须为 1。 另一方面, 显示上标 X (下标 1) 。 不需要为 0。

仅定义以下两种 LUT 特殊情况。

封闭式 LUT:这是一个 LUT,其附加要求是,对于每个 Samp*i*,显示上标 X (下标 1) 等于 0。,并显示上标 d (i) 大于或等于 2。 统一封闭 LUT 是一个封闭 LUT,对于每个通道,其具有相同 的显示上标 d (i) 。并且节点在 0 和 1 之间统一间隔。

打开 LUT:这是一个 LUT,其附加要求是,对于每个 Samp iSHows a 上标 X (下标 1) 大于 0。 显示上标 d (i) 等于 1 是可以的。

目标是将单位多维数据集 [0, 1] n 分层为封闭的 LUT 和开放 LUT 的集合,以便整个集合将覆盖单元多维数据集。 从概念上讲,按维度组织这些“LUT 层”更简单,以便在顶层:

显示按其维度组织 L U T 层的顶级。

其中 显示 sigma 下标 k. 是“k 维层集合”。请注意,层维度从 3 开始,而不是 0;即,点,因为可以处理三色组合的内插,而无需过多的内存需求。

LUT 层的说明

在此实现中:

  1. 显示 sigma 下标 3。 由具有三个输入的封闭 LUT 组成,一个来自从 n 种着色剂中选择的三种着色剂的每个可能组合。

  2. 显示 sigma 下标 4。 由 CMYK 组合 (或前四种着色剂) 的一个闭合 LUT 组成,以及 超过 4) 减 1 的显示 ( n。所有其他四色剂组合的开放 LUT。 通过找出 CMYK 组合,你承认它是一个重要的组合。

  3. 对于显示 k 等于 5, ..., n.显示 sigma 下标 k.显示 (n 比 k) 。打开 LUT,一个用于从 n 种着色剂总数中选择 k 着色剂的每个可能组合。

它仍需指定 LUT 的大小。 开放和封闭 LUT 之间的主要区别在于开放 LUT 不重叠,封闭 LUT 可能会在边界面上重叠。 开放 LUT 中的一维采样不包含 0,实质上意味着开放 LUT 缺少边界面的一半,因此名称为“open”。如果两个 LUT 不重叠,则可以在每个通道中使用不同数量的步骤或节点位置。 如果两个 LUT 重叠,则也是如此。 在这种情况下,如果步骤数或节点位置不同,位于两个 LUT 交集中的点将接收不同的内插值,具体取决于内插中使用的 LUT。 此问题的一种简单解决方案是,每当两个 LUT 重叠时,使用相同数量的相同步骤的统一采样。 换句话说:

此实现) (所有三色 LUT 和 CMYK LUT 的所有封闭 LUT 都必须是统一的,并且步骤数相同(表示 为 d)。

以下两种算法可用于确定关闭 LUT 的 d 步数和打开 LUT 的步骤数。

算法 #1

此算法不需要外部输入。

所有关闭的 LUT 都将是统一的,步骤数为 d

每个输入通道中,维度 k 的所有打开 LUT 都具有相同的步骤数 显示 d (k) 。并且节点的间距相等;也就是说,对于每个 显示 i 等于 1, 2, ..., k.

Samp i显示 samp i 算法。

最后,在下表 1 中指定 dd (k ) 。 “证明”、“正常”和“最佳”这三种模式是 ICM 2.0 质量设置。 在此实现中,证明模式具有最小的内存占用量,最佳模式具有最大的内存占用量。

若要实现此算法,必须调用以下算法 #2。 用户可以使用表作为指南指定自己的采样位置。

算法 #2

此算法需要采用“重要”采样位置列表形式的外部输入,但它更具适应性,并可能节省内存空间。

所需的输入是用户提供的设备值数组。 这些设备值指示设备颜色空间的哪个区域很重要;也就是说,应对哪个区域进行更多采样。

所有封闭的 LUT 将统一,步骤数为 d ,如算法 #1 中所述。 表 1 中提供了 d 的值。

() 统一封闭 LUT

校对模式 正常模式 最佳模式
D 9 17 33

 

(b) Open LUT

输入维度 校对模式 正常模式 最佳模式
4 5 7 9
5 2 3 3
6 2 3 3
7 2 2 2
8 个或更多 2 2 2

 

表 1: 算法中使用的 LUT 大小

每个打开的 LUT 在每个输入通道中可以具有不同数量的步骤,并且采样位置不必相等。 对于给定的开放 LUT 层,有一个关联的着色剂组合,例如 ,显示 C 下标 1, ...,C 下标 k. ,其中 显示 C 下标 i. s 是介于 1 和 n 之间的非重复整数。 它们是对应于此层中的“活动”着色剂的通道索引。

步骤 1:筛选掉此层中不包含的设备值的输入数组。 设备值 显示 X 下标 1、X 下标 2、...、X 下标 n。 包含在层中,仅当且仅当 显示通道的一组值时, 所有其他通道均为 0。 如果筛选集包含 N 个条目,请让

显示筛选集包含 N 个条目时要使用的公式。

对于每个 显示 i 等于 1, 2, ..., k. ,循环访问以下步骤 2-5:

步骤 2:如果 显示 d 下标暂定 (k) 等于 1. ,则 Samp i 只有 1 分,该点必须为 1.0。 转到下一个 i. 否则,请继续执行步骤 3。

步骤 3:在 显示 C 下标 i. 通道中按升序对筛选样本进行排序。

步骤 4:使用节点定义“暂定”采样网格

显示用于定义“暂定”采样网格的节点。

其中 显示 j 等于 1, 2, ..., d 下标暂定 (k) .

步骤 5:规范化暂定网格,以确保它符合严格的单调性,并且以 1.0 结尾。 由于数组已排序,因此暂定网格中的节点已是单调非声明。 但是,相邻节点可能相同。 如有必要,可以通过删除相同的节点来解决此问题。 最后,在此过程之后,如果终结点小于 1.0,请将其替换为 1.0。

请注意,步骤 5 是 LUT 层在每个通道中可能具有不同步骤数的原因。 规范化后,频道中的步骤数可能小于显示 d 下标暂定 (k) 。

内插

可以通过打开 LUT 层和封闭的 LUT 层来构造单元多维数据集的分层。 若要使用此“稀疏 LUT 结构”执行内插,请执行以下步骤。 假设给定的输入设备值显示 (X 下标 1、X 下标 2、...、X 下标 n) 。

步骤 1:确定“活动”通道数。 这是非零通道数。 这将确定要搜索包含层的层维度 k 。 更确切地说,如果活动通道数 小于或等于 3,则层维度为 3。否则,层维度与活动通道数相同。

步骤 2:在 显示 sigma 下标 k. 中,搜索包含的层。 如果对应于该层的所有通道都具有非零值,并且所有其他通道均为零,则设备值包含在开放层中。 如果层未表示的每个通道都为零,则设备值包含在封闭层中。 如果未找到包含层,则表示存在错误条件。 取消并报告失败。 如果找到包含的层,请继续执行下一步。

步骤 3:如果包含的层已关闭,则可以通过任何已知的内插算法在层内插。 在此实现中,算法的选择是四面体内插。 如果包含的层是开放的,并且设备值严格位于层内,即

显示 X 下标 i 大于或等于... 第 i 个通道中的第一个节点

其中 i 是层的通道索引,则标准内插算法(如四面插值)起作用。

如果显示 X 下标 i 小于...某些 i 通道中的第一个节点,则设备值属于层与下维子空间之间的“间隙”。 此 MOI 本身不涉及内插算法,因此可以使用任何内插算法在此“间隙”内插,尽管首选算法是以下跨定义内插。

图 1 的两个部分演示了内插模块的体系结构。

显示内插模块体系结构第一部分的示意图。

显示内插模块体系结构第二部分的示意图。

图 1: Intepolation 模块体系结构

如前所述,此算法能够在包含重要着色剂组合的设备空间区域中实现相当密集的采样,同时最大程度地减少所需的 LUT 总大小。 下表显示了使用 Algorithm #1 和 normal mode) 以及相应的统一 LUT 实现 (稀疏 LUT 实现所需的节点数的比较。

输入通道数 稀疏 LUT 统一 LUT
5 142498 1419857
6 217582 24137567
7 347444 410338673
8 559618 6975757441

 

单元多维数据集中的内插

对于矩形网格,一个基本步骤是在封闭单元格内插。 对于输入点,可以轻松确定封闭单元格。 在矩形网格中,每个顶点 (角点) 指定封闭单元格的输出值。 它们也是 (BC) 内插器必须满足的唯一边界条件:内插必须通过所有这些点。 请注意,这些边界条件位于“离散”点上,在本例中为单元格的 2n 角点,其中 n 是颜色空间的维度。

在继续操作之前,将边界条件的概念形式化非常有用。 对于封闭单元格边界的任何子集 S (单位多维数据集的 n 维) ,S 上的边界条件是函数 BC 的规范:S → Rm,其中 m 是输出维度。 换句话说,需要一个可表示 Interp: [0,1]n→ Rm 的内插符才能满足 S 中所有 x 的 Interp (x) = BC (x) 。

在单位多维数据集上内插的标准方案中,S 是一组离散点,这些点是多维数据集的 2n 个顶点。

现在可以通用化边界条件,以解决前面所述的问题,并在单元多维数据集中提供新的内插算法。 边界条件可以强加于多维数据集的整个边界面,而不是只允许离散边界点。 确切的假设如下:

() 点 vn = (1,1,...,1) 是特殊的,只允许离散边界条件。 换句话说,不能对 n 个边界面 xi=1 (i=1,...,n) 施加连续边界条件。

(b) 对于其余的 n 个边界面 xi=0 (i=1,...,n) ,边界条件可以强加于整个面,如果两个面相交,则两个面上的边界条件应在交集上达成一致。

(c) 任何不包含在具有边界条件的面中的顶点都将具有单独的 (离散) 边界条件。

在讨论有限和跨无限数据的内插时,可以将离散边界条件称为有限数据,将连续边界条件称为跨定义数据。

首先,查看标准四面体内插 (,如在Sakamoto的专利) 中使用的,这有助于为问题的这一特定表述设置表示法。 众所周知,单位多维数据集 [0,1]n 可以细分为 n! 四边形,由 n 个符号上的一组排列参数化。 更具体地说,每个这样的四面体都由不平等定义

显示四面体不相等的公式。

其中,σ:{1,2,..,n}→{1,2,...,n} 是“符号”1,2,...,n 的排列,即,它是 n 个符号集的双ject 映射。 例如,如果 n = 3 且 σ = (3, 2,1) ,即σ (1) =3,σ (2) =2,σ (3) =1,则相应的四面体由 z≥y≥x 定义,其中通用表示法 x、y、z 用于 x1、x2、x3。 请注意,这些四面体不会彼此脱节。 为了进行内插,位于两个不同四面体的共同面上的点将具有相同的内插值,而不管内插中使用了哪个四面体。 不过,在有限点上内插的标准方案中,对于给定的输入点 (x1、...、xn) ,首先确定它位于哪个四面体中,或者等效地确定相应的排列σ,然后将四面体内插定义为

显示定义四面体内插的公式。

其中 显示标准基向量的公式。 对于 i=1、 ...、 n 和 e1, ..., en 是标准基向量。 在继续泛化之前,请注意 v0、v1、...、vn 是四面体的顶点, 而“显示大中心坐标 ”是“偏心坐标”。

对于边界面上的 BC 的一般情况,可以使用偏心投影的概念。 与以前一样,对于给定的输入点 (x1、...、xn) ,首先确定它位于哪个四面体中,或者等效地确定相应的排列σ。 然后执行一系列以巴为中心的投影,如下所示。 第一个投影 显示 BProj 下标 1 (x) 。 将点发送到平面 显示 X 下标增量 (1) 等于 0。 除非 显示 X 等于 V 下标 n。 在这种情况下,它不会更改。 映射 BProj 的精确定义如下:

显示地图 BProj 的精确定义的公式。

显示 P 下标 k 的公式, k = 1, 2, ..., n。

显示 X 等于 V 下标 n. 的情况下,可以停止,因为 BC 在 vn 中由假设 () 定义。 在 显示 X 不等于 V 下标 n. 的情况下,很明显 ,显示 BProj 下标 1 (X) . 具有σ (1) ) 组件。 换句话说,它位于边界面之一上。 要么它位于定义 BC 的脸上,在这种情况下你可以停止,要么执行另一个大中心投影显示 BProj 下标 2 (X') 。其中显示 X 等于 BProj 下标 1 (X) 。 如果显示 X''= Bproj 下标 1 (X') .在定义 BC 的脸上,则可以停止;否则,请执行另一个投影 显示 BProj 下标 3 (X'') 。 由于每个投影都会消灭一个组件,因此有效维度会减小,因此你知道该过程最终必须停止。 在最坏的情况下,你执行 n 个投影到维度 0,即对多维数据集的顶点,根据假设 (c) ,你知道 BC 将定义在上。

假设已执行 K 投影,

显示假设已执行 K 投影时要使用的公式。

x (0) = x,输入点,BC 在 x (k) 处定义。 然后通过定义一系列输出向量展开投影:

显示一系列输出向量的公式。

其中 ,显示 Y 上标 (K) 的公式 ,最终获得答案

显示 Interp (x) 等于 y 上标 (0) 。

举例说明

显示内插与单位多维数据集的工作示例的关系图。

图 2: 工作示例

请考虑图 2 中描述的情况,其中 n = 3,m = 1,并且你具有以下 BC:

在顶点上 () 四个离散 BC

(0、0、1) :β001

(0、1、1) :β011

(1、0、1) :β101

(1、1、1) :β111

(b) 人脸上的连续 BC x3=0:F (x1、x2)

计算 #1:输入点 x = (0.8、0.5、0.2) 。 封闭四面体与排列 <1、2、3> 相关联。

第一个投影: 显示第一个投影的公式。

这已经位于人脸 x3=0 上,因此你可以停止。 然后向后替换

显示第一个投影的答案。 这就是答案。

计算 #2:输入点 x = (0.2, 0.5, 0.8) 。 封闭四面体与排列 <3、2、1> 相关联。

第一个投影: 显示计算 2 的第一个投影的公式。

第二个投影: 显示计算 2 的第二个投影的公式。

第三个投影: 显示计算 2 的第三个投影的公式 ,该投影位于面 x3=0 上。 然后向后替换

显示后向替换的前两个公式。

显示向后替换的第三个公式 。这是最终答案。

应用程序

() 顺序四面体内插

显示顺序四面体内插的示意图。

图 3: 顺序四面体内插

请参阅图 3。 若要在施加了不兼容网格的两个平面之间内插,请考虑包含图中所示的给定点 P 的单元格。 单元格的“顶”顶点直接来自顶部平面中的网格。 底面中的顶点与底部平面中的网格不兼容,因此整个人脸被视为具有 BC,其值通过内插在底部平面的网格上获取。 然后,此设置显然满足 () 、 (b) 和上述 (c) 的假设,并且可以应用内插算法。

还很明显,该算法已将内插问题的维度减小 1,因为结果是上网格顶点处的值的线性组合,而下平面的内插的维度小于 1。 如果下层平面中存在类似的夹心平面配置,则可以在该平面中应用该过程,进一步将维度减小 1。 此过程可以一直持续到第 0 维度。 这种投影和内插的级联可称为“顺序四面插值”。

(b) 差距内插

显示间隙内插的示意图。

图 4: 间隙内插

这是对严格位于正象限内的立方体施加的网格。 多维数据集本身有一个网格,每个坐标平面都有不一定兼容的网格。 立方体和坐标平面之间的“间隙”具有“L 形”的横截,不适合标准技术。 但是,使用此处介绍的技术,可以轻松引入覆盖此差距的单元格。 图 4 描述了其中一个。 坐标平面上的网格支持内插,为单元格的所有底面提供必要的 BC,其余一个顶点的 BC 由立方体的下角提供。

有关实现的最后说明

在实际应用程序中,算法的基本设置的“单位多维数据集”是从较大的格中提取的,顶点处的值可能需要昂贵的计算。 另一方面,很明显,四面体内插只需要四面体顶点处的值,四面体是单元立方体所有顶点的子集。 因此,实现所谓的“延迟评估”更高效。在上述算法的软件实现中,通常有一个子例程,该子例程将单位多维数据集及其顶点处的值作为输入。 延迟计算意味着,无需在顶点传递值,而是传递评估顶点值所需的信息,而无需实际执行计算。 在子例程中,在确定封闭四面体后,将仅对属于封闭四面体的顶点执行对这些值的实际计算。

用于高动态范围虚拟 RGB 源设备的查找表

如果使用建模为虚拟 RGB 设备的源设备构造转换,则源着色剂值可能为负值或大于 unity (1.0) 。 发生这种情况时,源设备称为具有高动态范围 (HDR) 。 对此情况进行了特别考虑。

对于 HDR 转换,可以从设备的色域边界确定每个着色剂通道的最小值和最大值。 通过使用这些值,将应用每个着色剂通道的简单缩放,以便将等于最小着色剂的着色剂值转换为 0.0,等于最大着色剂的着色剂值将转换为 1.0,值之间的线性缩放在 0.0 和 1.0 之间线性映射。

ICCProfileFromWCSProfile

由于此功能main目的是支持 Windows 的 Vista 前版本,因此必须生成 ICC 规范 ICC.1:1998-09 中定义的版本 2.2 ICC 配置文件。 在某些情况下, (请参阅下表“基线设备到 ICC 配置文件类映射”) ,可以从 WCS 配置文件创建基于矩阵或 TRC 的 ICC 配置文件。 在其他情况下,ICC 配置文件由 LUT 组成。 以下过程介绍如何创建 AToB 和 BToA LUT。 当然,ICC 配置文件也有其他字段。 某些数据可以从 WCS 配置文件派生。 对于其他数据,必须开发智能默认值。 版权将分配给 Microsoft:因为是用于创建 LUT 的 Microsoft 技术。

此设计应适用于所有类型的设备模型,包括插件。只要插件具有关联的基线设备模型,就可以确定基础设备类型。

创建 ICC 配置文件的难点在于创建 AToB 和 BToA 查找表。 这些表在设备空间(例如 RGB 或 CMYK)和配置文件连接空间 (PCS) (CIELAB 的变体)之间进行映射。 这与从设备空间映射到设备空间的 CITE 转换中使用的颜色管理过程基本相同。 但是,必须具备以下信息才能进行转换。

  1. 参考 PCS 的查看条件。

  2. 参考 PCS 范围。

  3. 在 PCS 值和比色法之间转换的设备模型。

WCS 配置文件及其关联的 CAM 作为参数提供。 有两种基线设备模型在比色法和 PCS 编码之间进行转换。 需要两个的原因如下所述。

  1. 可以从 ICC 配置文件格式规范中获取 PCS 的参考查看条件。 ICC 配置文件格式规范中提供的信息足以计算初始化 CMS 使用的 CAM 所需的所有数据。 为了保持一致性和灵活性,此信息存储在 WCS 颜色配置文件中。

  2. 还可以使用 WCS 配置文件来存储定义 PCS 参考范围的示例。 (CMS) 的 CITE 颜色管理系统有两种创建色域边界的方法。 一种是对完整的设备空间进行采样,并使用设备模型创建度量值。 第二种方法是使用配置文件中的测量样本来创建引用范围边界。 由于 ICC PCS 的范围太大,无法创建有用的参考范围,因此第一种方法是不合适的。 但第二种方法是基于配置文件的灵活方法。 若要重新定义参考 PCS 范围,可以更改 PCS 设备配置文件中的度量数据。

  3. ICC PCS 是理想设备的建模。 通过将 PCS 模型创建为真实设备,可以利用智能 CMM 中使用的颜色管理过程。 创建从色法到 PCS 编码的设备模型非常简单。 只需在真实色度值和 PCS 编码值之间映射。 由于设备模型的 CMS 接口仅支持 XYZ 值,可能还需要在 XYZ 和 LAB 之间映射。 这是一个众所周知的转换。 此模型在 7.9 和 7.10 部分中的文档 2.2.02“基线设备模型”中介绍。

如果设备的域大于 PCS 的域,则可能需要执行一些范围映射。 基线 GMM 可用于此目的。 请注意,正确创建的 ICC 配置文件具有相对色度、感知和饱和度意向的查找表,尽管这些可能都指向同一 LUT 内部。

显示创建 A T O B L U T 的示意图。

图 5: 创建 AToB LUT

此过程如图 5 所示。 首先,从 DM 配置文件中的数据初始化设备模型。 然后,按如下所示构造设备范围边界。 通过设备模型对来自设备模型的数据进行采样,以获取比色数据。 色度数据通过 CAM 运行,以创建外观数据。 外观数据用于创建设备范围边界。

接下来,使用参考 PCS 测量配置文件中的数据为 PCS 创建一个域边界。

使用刚刚创建的两个范围边界来初始化 GMM。 然后,使用设备模型、GMM 和 PCS 设备模型创建转换。 通过转换运行设备空间采样以创建 AToB LUT。

显示使用 P C S 空间采样创建 AT 的示意图。

图 6: 创建 BToA LUT

图 6 说明了 BToA LUT 的创建。 这几乎与创建 AToB LUT 相同,交换了源和目标的角色。 此外,必须对完整的 PCS 域进行采样才能创建 LUT。

请注意,由于 WCS) 中的 CAM (CIECAM02 参与该过程,因此媒体白点与 PCS 白点之间的色度适应 (ICC 强制要求为 D50) 由 CAM 透明地实现。

HDR 虚拟 RGB 设备

为 HDR 虚拟 RGB 设备生成配置文件时,必须特别注意;即着色剂值可能小于 0.0 或大于 1.0 的设备。 在生成 ATOB LUT 时,将生成一组更大的 1D 输入 LUT。 着色剂值将缩放并偏移到范围 0。 1 使用 WCS 配置文件中的最小和最大着色剂值。

由于 HDR 设备的着色剂空间不太可能完全填充,因此标记的 3-D LUT 中也提供特殊支持。 为了处理填充稀疏区域中的颜色,将重新编码着色剂,以便实现超过 0.0 和 1.0 的推断。 使用的范围是 -1 。 +4.

由于对 3-D LUT 应用了重新缩放,因此生成了一组 1D 输出 LUT 以将结果映射回范围 0。 1.

多个 PCS

国际刑院发现,一个 PCS 不够灵活,无法满足 CMS 的所有预期用途。 在配置文件规范版本 4 中,ICC 阐明了实际上有两种 PCS 编码。 一个用于比色意向;另一个 用于感知意向。 (未为饱和意向指定 PCS。ICC 使这部分不明确。) 比色 PCS 指定了最小和最大亮度,但色度和色调值的范围大约为± 127。 此 PCS 看起来像一个矩形棱镜。 如前所述,感知 PCS 体积类似于喷墨打印机的色域。

这两个 ICC PCS 也有两种不同的数字编码。 在感知 PCS 中,值为零表示零的浅度。 在比色 PCS 中,值为 0 表示 PCS 的最小亮度,即大于零。 可以通过为每个 PCS 编码使用不同的设备型号来解决此问题。

域映射

若要在 ICC 配置文件中创建 AToB LUT,请从设备色域映射到相应的 PCS 空间。 若要创建 BToA LUT,请从 PCS 空间映射到设备色域。 AToB LUT 的映射与基于度量的 CMS 中使用的映射非常相似。 对于感知 PCS,使用剪裁或压缩任何色域外颜色,将设备合理的色域映射到感知 PCS 范围边界。 对于色度意向,你可能必须剪裁浅度,但色度和色调值都适合色度 PCS 色域。

BToA LUT 的映射略有不同。 色度意向仍然很容易;你只需将 PCS 值剪辑到设备域。 但 ICC 要求所有可能的 PCS 值映射到某些设备值,而不仅仅是感知 PCS 的参考范围中的值。 因此,必须确保 GMM 可以处理引用范围之外的源颜色。 这可以通过将这些颜色剪裁到设备范围边界来处理。

基线设备到 ICC 配置文件类映射

基线设备类型 ICC 配置文件类 备注
RGB 捕获设备 输入设备 (“scnr”) PCS 为 CIELAB。 AToB0Tag 是具有相对色度意向的设备到 PCS。
CRT、LCD 监视器 显示设备 (“mntr”) PCS 为 CIEXYZ。 有关模型转换,请参阅以下内容。
RGB 投影仪 颜色空间 (“spac”) PCS 为 CIELAB。
RGB 和 CMYK 打印机 输出设备 (“prtr”) PCS 为 CIELAB。
RGB 虚拟设备 (非 HDR 大小写) 显示设备 (“mntr”) PCS 为 CIEXYZ。
RGB 虚拟设备 (HDR 大小写) 颜色空间 (“spac”) PCS 为 CIELAB。

 

监视器配置文件的转换不涉及生成 LUT,而是包括构建矩阵或 TRC 模型。 ICC 中使用的模型与 WCS CRT 或 LCD 建模中使用的模型略有不同,缺少“黑色更正”术语。 具体而言:

WCS 模型: 显示 W C S 模型。

ICC 模型: 显示 I C C 模型。

从 WCS 模型到 ICC 模型的转换如下。

定义新曲线:

显示用于定义新曲线的矩阵。

这些不是音调再现曲线,因为它们不映射 1 到 1。 规范化将实现这一点。 ICC 模型的最终定义如下:

显示 I C 模型的最终定义。

显示 I C C 模型的最终矩阵。

对于非 HDR RGB 虚拟设备,还会生成用于提高空间效率的显示 ICC 配置文件。 在这种情况下,可以直接从 WCS 配置文件的基元获取三imulus 矩阵 M ICC ,而无需进行上述模型转换。 最后一点,但重要的是,请注意,此三刺激矩阵必须根据 D50 进行色度调整,以符合 PCS 的 ICC 规范。 换句话说,要在 ICC 配置文件中编码的矩阵的每一行上的条目必须分别求和为 96.42、100 和 82.49。 在当前的实现中,色度适配由 CAT02 完成,这也是 CAM02 中使用的色度适配变换。

黑色保存和黑色代系

黑色保留的实现与支持黑色通道的设备中的黑色通道的生成相关联。 为实现此目的,将收集有关每个源颜色的信息,以便支持黑色通道的设备模型可以确定如何最好地设置输出上的黑色通道。 虽然黑色保留与在一个黑通道设备之间转换的颜色转换相关,但黑色生成是针对涉及黑通道目标设备的所有转换实现的。

黑色通道信息记录在名为 BlackInformation 的数据结构中。 BlackInformation 结构包含一个布尔值,指示颜色是否仅包含黑色着色剂,以及一个指示称为黑色权重的“黑色”程度的数值。 对于支持黑色通道的源设备,黑色权重是源颜色中黑色着色剂的百分比。 对于不包含黑色通道的源设备,使用其他着色剂和外观值计算黑色权重。 计算名为“颜色纯度”的值时,取最大着色剂值与最小着色剂值之差除以最大着色剂值之差。 一个名为“相对亮度”的值的计算方式是,取颜色的亮度与目标设备的最小亮度之差,再除以目标设备的最小亮度和最大亮度之差。 如果源设备是监视器或投影仪) (附加设备,则黑色重量确定为 1.0 减去颜色纯度乘以相对亮度。 例如,如果源设备是 RGB 监视器,则计算每种颜色的最大值和最小值 R、G 和 B,黑色权重由公式确定:

BW = (1.0 – (最大 (R,G,B) – 最小 (R,G,B) ) / 最大 (R, G, B) ) * 相对亮度

如果源设备支持减色(例如 CMY 打印机),则各个着色剂必须是“补色剂” (从 1.0 减去) ,然后才能在前面的公式中使用。 因此,对于 CMY 打印机,R = 1.0 – C,G = 1.0 – M,B = 1.0 – Y。

颜色转换处理的每个颜色的黑色信息在颜色转换过程中确定。 仅当指定了黑色保留时,才确定仅限黑色的信息。 如果目标设备型号支持黑色着色剂,则始终确定黑色重量。 黑色信息通过 ColorimetricToDeviceColorsWithBlack 方法传递到目标设备模型,该方法使用生成的 LUT。

请注意,由于颜色转换优化,上述过程仅在创建优化转换 LUT 期间发生,而不是在执行 TranslateColors 方法期间。

优化具有三个以上源通道的转换

优化转换的大小由几个因素决定:源设备中的颜色通道数、每个源颜色通道的表中的步骤数以及输出设备中的颜色通道数。 用于确定转换表大小的公式为:

Size = 每个通道 源的步数\ 设备 (Number\ channels\ in\ source\ device) x 输出设备中的通道数

如你所看到的,表的大小会根据源设备中的通道数呈指数级增长。 许多源设备支持三种颜色通道,例如红色、绿色和蓝色。 但是,如果源设备支持四个通道(如 CMYK),则表的大小和构造表所需的时间将按步骤数的一倍增长。 在基于度量的 CMS 中,转换是“动态”构造的,这一次很可能是不可接受的。

为了减少构建颜色转换表所需的时间,可以利用两个事实。 首先,虽然源设备可能支持三个以上的颜色通道,但与设备无关的中间颜色空间 (CIECAM02 Ja C b C ) 只有三个颜色通道。 其次,处理中最耗时的部分不是设备建模 (从设备颜色坐标转换为三角值) ,而是色域映射。 使用这些事实,可以构造一个初步的颜色转换表,该表通过色域映射步骤转换设备无关颜色空间中的颜色,最后通过输出设备颜色模型进行转换。 此表的构造为第三维度。 然后,我们通过将源颜色组合转换为与设备无关的中间空间来构造维度四最终颜色转换表,然后使用初步颜色转换表完成对输出设备颜色空间的转换。 因此,从计算 (查找表中的步骤数) \通道 范围映射计算的数量减少到中间表 ₃范围映射计算中的步骤数。 即使必须在 (查找表中执行步骤数) 设备建模和三维表查找 的通道数 \,但这仍比原始计算快得多。

如果不需要信息在源设备模型与颜色转换的任何其他组件之间传递,前面的过程将正常工作。 但是,如果输出设备和源设备都支持黑色着色剂,并且源黑色着色剂用于确定输出黑色着色剂,则该过程将无法正确传达源黑色信息。 另一种方法是构建一个初步颜色转换表,该表仅通过色域映射步骤转换与设备无关的颜色空间中的颜色。 然后,使用以下步骤构造维度四最终颜色转换表:a) 将源颜色组合转换为与设备无关的中间空间,b) 通过在初步颜色表中内插而不是应用实际色域映射过程来执行色域映射步骤,c) 使用色域映射步骤和任何源黑通道信息使用输出设备模型计算输出设备着色剂。 在源和输出设备模型之间传输信息时,即使没有黑通道,也可以使用此过程;例如,如果这两个模块是使用插件体系结构实现的,该体系结构允许模块之间的数据交换。

上述两个过程可用于有效地缩短构建四维颜色转换表所需的时间。

CheckGamut

ICM 调用 CreateTransform 和 CreateMultiProfileTransform 采用标志值字,其中之一是ENABLE_GAMUT_CHECKING。 设置此标志后,CITE 必须以不同的方式创建转换。 初始步骤相同:必须初始化源和目标 CAM,然后必须初始化源和目标范围边界描述符。 无论指定意向如何,都必须使用 CheckGamut GMM。 应使用源和目标设备模型以及范围边界描述符初始化 CheckGamut GMM。 但是,转换随后应创建一个截断的转换,该转换包括源设备模型、源 CAM、任何干预的 GMM 和 CheckGamut GMM。 这可确保 CheckGamut CMM 输出的增量 J、增量 C 和 delta h 值成为最终结果值。

当转换中只有两个设备配置文件时,CheckGamut 的含义是明确的。 如果存在两个以上的设备配置文件和两个以上的 GMM,则 CheckGamut 会报告已通过第一个设备模型转换的颜色以及除最后一个 GMM 之外的所有颜色是否都属于目标设备的色域。

基本颜色管理概念

Windows 颜色系统架构和算法