创建转换
为了正确解释颜色转换的工作原理,通过 ICM 2.0 和 CTE 内部解释完整的处理路径会很有帮助。 ICM 2.0 CreateColorTransformW 函数创建一个颜色转换,应用程序可以使用该转换来执行颜色管理。 此函数从 LOGCOLORSPACE和意向输入创建颜色上下文。 意向映射到基线 ICC 域映射算法关联。 然后,该函数 CreateMultiProfileTransform 调用 ICM 2.0 函数,以便进行一致的颜色处理。 CreateColorTransform 函数通常将数据复制到内部优化转换结构中。
ICM 2.0 CreateMultiProfileTransform 函数接受配置文件数组和意向数组或单个设备链接配置文件,并创建应用程序可用于执行颜色映射的颜色转换。 它处理这些输入配置文件和意向,以创建设备模型、颜色外观模型、域边界说明和域映射模型。 下面介绍了如何完成此作:
- 设备模型直接从 DM 配置文件初始化。 调用 CreateMultiProfileTransform时,为每个配置文件创建了一个设备模型。
- 颜色外观模型直接从 CAM 配置文件初始化。 调用 CreateMultiProfileTransform时,每个配置文件都有一个 CAM 配置文件。 但是,可以为多个配置文件指定相同的 CAM 配置文件。
- 游戏边界说明是从设备模型对象和 CAM 对象初始化的。 调用 CreateMultiProfileTransform中的每个配置文件都有一个域边界说明。
- 从两个域边界和意向初始化域映射模型。 必须在从调用 CreateMultiProfileTransform创建的每个设备模型对之间创建一个域映射模型。 请注意,这意味着使用比设备模型少一个域地图模型。 由于意向数与设备型号数匹配,因此还存在一个以上的意向。 跳过列表中的第一个意向。 演练设备模型和意向列表,创建域映射模型。 选取第一个和第二个设备模型和第二个意向,然后初始化第一个域映射模型。 选取第二和第三个设备模型和第三个意向,然后初始化第二个域映射模型。 以这种方式继续,直到创建了所有域映射模型。
正确处理配置文件并初始化所有中间对象时,可以使用以下调用创建 CITE 转换。 pDestCAM 和 pDestDM 是与调用 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 函数 CreateColorTransformW 或 CreateMultiProfileTransform 时,dwFlags 参数具有SEQUENTIAL_TRANSFORM位集,则按顺序执行转换步骤。 这意味着代码逐个执行每个设备模型、颜色外观模型和域映射模型,由 CreateColorTransform 或 CreateMultiProfileTransform 调用指定。 这可能有助于调试插件模块,但它比通过优化转换执行的速度要慢得多。 因此,不建议在生产软件中使用顺序模式运行。 此外,在顺序模式和优化模式下获得的结果可能略有差异。 这是因为当函数串联在一起时引入的变体。
创建优化转换
优化转换是一个多维查找表。 表可由多维内插引擎(如四维内插)进行处理,该引擎将输入颜色应用于转换。 以下部分介绍了如何创建优化的查阅表。 之后的部分介绍如何在优化的查阅表中内插。
稀疏查找表
常规打印机具有 CMYK 墨迹。 若要扩展域,一种方法是向系统添加新墨迹。 通常添加的墨迹是 CMYK 墨迹难以重现的颜色。 常见选择是橙色、绿色、红色、蓝色等。为了增加“明显分辨率”,可以使用具有不同色调的墨迹,例如浅青色、浅洋红等。 实际上,打印机设备具有四个以上的通道。
虽然打印机是输出设备,但它们也会执行从设备空间到其他颜色空间的颜色转换。 对于 CMYK 打印机,这将是从 CMYK 转换为 XYZ 或打印机的“正向模型”。 通过将转发模型与其他转换相结合,可以在另一台设备上模拟 CMYK 打印。 例如,打印机 CMYK 到监视器 RGB 可以实现模拟该 CMYK 打印机在监视器上的打印的校对机制。 同样,这同样适用于 hi-fi 打印机。 CMYKOG 到 RGB 转换允许在监视器上校对 CMYKOG 打印机。
实现此类颜色转换的传统方法是使用统一 LUT。 例如,在 CMYKOG 打印机的 ICC 配置文件中,ICC 规范强制使用 A2B1 标记,该标记存储一个统一 LUT,该标记表示前向模型的 CMYKOG 设备空间中的统一采样,该空间从 CMYKOG 到 ICC 配置文件连接空间(CIELAB 或 CIEXYZ)。 ICC 设备链接配置文件可实现从 CMYKOG 设备空间到任何颜色空间(包括设备空间)的直接转换,并且采用在 CMYKOG 空间中统一采样的 LUT 形式。 由于产生巨大的 LUT,采样从未使用 256 个级别(位深度 8),但单色设备(1 通道)除外。 而是使用低位深度采样;一些典型的选择是 9 (位深度 3), 17 (位深度 4), 33 (位深度 5)。 由于每个通道中级别数小于 256,则 LUT 与内插算法结合使用,以在两个采样级别之间时生成结果。
虽然统一 LUT 在概念上易于实现,但统一 LUT 上的内插通常高效,但 LUT 大小随输入维度呈指数级增加。 事实上,如果 d 是统一 LUT 中使用的步骤数,n 是源颜色空间中的通道数,则 LUT 中的节点数 。 显然,节点数在内存中需要如此多的存储,即使是顶级计算系统也难以处理需求。 对于具有 6 或 8 个通道的设备,设备配置文件的 ICC 实现需要使用 LUT 中的几个步骤,有时甚至可减少到 A2B1 表中的五个步骤,以将配置文件保持在兆字节内,而不是 GB。 显然,使用较少的步骤会增加内插错误,因为现在样本较少。 由于 LUT 必须一致,因此,即使在空间的那些区域中,整个颜色空间的准确性也会下降,因为设备值发生小变化,从而产生明显的颜色差异。
在具有四个以上的着色器的设备中,整个设备空间的某些子空间比其他子空间更重要。 例如,在 CMYKOG 空间中,青绿色和绿色墨迹很少一起使用,因为它们的色调主要相互重叠。 同样,黄色和橙色墨迹基本上相互重叠。 步骤数量的统一减少可视为整个颜色空间质量整体下降,这是你可以为不可能的墨迹组合买得起的,但不能用于可能或重要的组合。
虽然统一采样的 LUT 对于内插而言简单高效,但随着维度的增加,它施加了巨大的内存要求。 实际上,虽然设备可能有六个或八个通道,但它们很少同时使用。 在大多数情况下,颜色转换的输入颜色只有少数“活动”着色器,因此驻留在较低维的颜色空间中。 这也意味着可以在较低的维度空间中更有效地进行内插,因为当维度较低时内插速度更快。
因此,该方法是将整个设备空间分层为各种维度的子空间。 由于较低尺寸(组合三四种着色器)更重要,通过分层空间,还可以应用不同的采样率:也就是说,不同数量的步骤,到片段:提高较低维度的采样率,降低维度的采样率。
若要修复表示法,n 是要采样的颜色转换的源颜色空间中的通道数。 还可以将 n 引用为输入维度,,除非另有指定。
基本构建基块是各种输入 维度的 LUT, 和大小,而不是具有输入维度的统一 LUT n。 为了更精确,LUT 是对单元立方体施加的矩形格子;也就是说,所有设备坐标都规范化为 [0, 1]范围。 如果 lut 的输入维度(请注意,不必等于 n,尽管 是必需的),则它由 ν 一维采样网格组成:
Samp i:
其中,所有 xj 必须位于 [0, 1] 范围内, 是 i 通道采样的步骤数,必须至少为 1,
必须为 1。 另一方面,
不需要为 0。
仅定义以下两种 LUT 特殊情况。
关闭 LUT:这是一个 LUT,要求每个 Samp*i*,,
。 统一封闭 LUT 是具有相同
,节点的间距统一介于 0 和 1 之间。
Open LUT:这是一个 LUT,要求每个 Samp i,。
。
目标是将单元多维数据集 [0, 1] n 分层到封闭的 LUT 和打开 LUT 的集合中,以便整个集合将覆盖单元多维数据集。 按维度组织这些“LUT 层”在概念上更简单,因此在顶层:
其中 是“k -dimensional 层集合”。请注意,层层维度从 3 开始,而不是从 0 开始;也就是说,点,因为可以处理三色组合的内插,而无需过多的内存需求。
LUT 层的说明
在此实现中:
包含三个输入的封闭 LUT,一个来自从 n 着色器中选择的三种着色器的每个可能组合。
由 CMYK(或前四种着色器)的一个封闭 LUT 组成,以及
打开所有其他四色组合的 LUT。 通过唱出 CMYK 组合,你承认这是一个重要的组合。
对于
,
由
打开 LUT,一个用于从 n 着色器总数中选择 k 着色器的每个可能组合。
它仍要指定 LUT 的大小。 打开和关闭 LUT 之间的主要区别在于,打开的 LUT 不重叠,封闭式 LUT 可能会在边界面上重叠。 事实上,开放式 LUT 中的一维采样不包含 0,实质上意味着打开的 LUT 缺少边界面的一半,因此名称为“open”。如果两个 LUT 不重叠,则可以在每个通道中使用不同数量的步骤或节点位置。 如果两个 LUT 重叠,则情况并非如此。 在这种情况下,如果步骤数或节点位置不同,则位于两个 LUT 交集的点将接收不同的内插值,具体取决于内插中使用的 LUT。 此问题的一个简单的解决方法是每当两个 LUT 重叠时,使用具有相同数量的步骤的统一采样。 换句话说:
所有封闭的 LUT(此实现中的所有三色 LUT 和 CMYK LUT)都必须是统一的,并且具有相同的步骤数,这些步骤表示 d。
以下两种算法可用于确定已关闭 LUT d 的步骤数以及打开的 LUT 的步骤数。
算法 #1
此算法不需要外部输入。
所有关闭的 LUT 将统一,d 步骤数。
维度 k 的所有打开 LUT 将具有相同数量的步骤,,并且节点空间相等;也就是说,对于每个
。
Samp i:
最后,在下表 1 中指定 d 和 d (k)。 三种模式:“证明”、“正常”和“最佳”是 ICM 2.0 质量设置。 在此实现中,证明模式的内存占用量最小,最佳模式的内存占用量最大。
若要实现此算法,必须调用以下算法 #2。 用户可以使用表作为指南来指定自己的采样位置。
算法 #2
此算法需要以“重要”采样位置列表的形式提供外部输入,但它更具自适应性,并且可能会节省内存空间。
所需的输入是用户提供的设备值数组。 这些设备值指示设备颜色空间的区域很重要;也就是说,应对哪个区域进行更多采样。
所有关闭的 LUT 都将统一,d 步骤数,如算法 #1 中所述。 表 1 中提供了 d 的值。
(a) 统一封闭 LUT
校对模式 | 正常模式 | 最佳模式 | |
---|---|---|---|
d | 9 | 十七 | 33 |
(b) 开放 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 层,有一个关联的着色器组合,例如,,其中
是介于 1 和 n之间的非重复整数。 它们是与此层中的“活动”着色器相对应的通道索引。
步骤 1:筛选掉此层中不包含的设备值的输入数组。 设备值 包含在层中,前提是
,所有其他通道均为 0。 如果筛选集 N 条目,请让
对于每个 ,请循环访问以下步骤 2-5:
步骤 2:如果 ,Samp i 只有 1 分,必须为 1.0。 转到下一 i。 否则,请继续执行步骤 3。
步骤 3:在 通道中按升序对筛选样本进行排序。
步骤 4:使用节点定义“暂定”采样网格
其中 。
步骤 5:规范暂定网格,确保它符合严格的单调性,并且以 1.0 结尾。 由于数组已排序,因此暂定网格中的节点已是单调非声明。 但是,相邻节点可能相同。 可以根据需要删除相同的节点来解决此问题。 最后,在此过程之后,如果终点小于 1.0,则将其替换为 1.0。
请注意,步骤 5 是 LUT 层在每个通道中可能具有不同数量的步骤的原因。 正则化后,通道中的步骤数可能小于 。
插值
可以通过打开 LUT 层和封闭的 LUT 层来构造单元多维数据集的分层。 若要使用此“稀疏 LUT 结构”执行内插,请执行以下步骤。 假设给定输入设备值 。
步骤 1:确定“活动”通道的数量。 这是非零通道的数目。 这将确定要搜索包含层的层 k 的层维度。 更确切地说,如果活动通道数 ,否则,层层维度与活动通道数相同。
步骤 2:在 中,搜索包含的层。 如果与该层对应的所有通道都具有非零值,并且所有其他通道均为零,则设备值包含在打开的层中。 如果层不表示的每个通道都为零,则设备值包含在封闭层中。 如果未找到包含层,则会出现错误条件。 取消并报告失败。 如果找到包含的层,请转到下一步。
步骤 3:如果已关闭包含层,则任何已知的内插算法都可以在层中内插。 在此实现中,算法的选择是四次内插。 如果包含的层是打开的,并且设备值严格位于层中,即
第一个节点在 i 通道中的第一个节点
其中,i 是层的通道索引,然后是标准内插算法(如四边插)的工作原理。
如果 i 第一个 i通道中的第一个节点,则设备值将落入层和下维子空间之间的“间隙”。 此 MOI 并不涉及内插算法本身,因此任何内插算法都可用于在此“间隙”内插,尽管首选算法是以下跨定义内插算法。
图 1 的两个部分演示了内插模块的体系结构。
图 1: 内插模块体系结构
如前所述,此算法能够在设备空间区域中实现相当密集的采样,这些区域包含着色剂的重要组合,同时最大限度地减少所需的 LUT 总大小。 下表显示了稀疏 LUT 实现(使用算法 #1 和正常模式)和相应的统一 LUT 实现所需的节点数的比较。
输入通道数 | 稀疏 LUT | 统一 LUT |
---|---|---|
5 | 142498 | 1419857 |
6 | 217582 | 24137567 |
7 | 347444 | 410338673 |
8 | 559618 | 6975757441 |
单元多维数据集内的内插
矩形网格的基本步骤是内插在封闭单元格中。 对于输入点,可以轻松确定封闭单元格。 在矩形网格中,指定封闭单元格的每个顶点(角点)的输出值。 它们也是内插必须满足的唯一边界条件:内插必须通过所有这些点。 请注意,这些边界条件位于“离散”点上,在本例中为单元格的 2n 角点,其中 n 是颜色空间的尺寸。
在继续作之前,正式化边界条件的概念非常有用。 对于封闭单元格边界的任何子集 S(维度中的单位多维数据集),S 上的边界条件是函数 BC:S → Rm 的规范,其中 m 是输出维度。 换句话说,需要内插符(可能表示 Interp: [0,1]n→ Rm,才能满足:S 中所有 x 的 Interp(x) = BC(x)。
在单元多维数据集上内插的标准方案中,S 是多维数据集的 2n 顶点的离散点集。
现在可以通用化边界条件来解决前面所述的问题,并在单元多维数据集中提供新的内插算法。 可以在多维数据集的整个边界面上施加边界条件,而不是只允许离散边界点。 确切的假设如下:
(a) point vn =(1,1,...,1) 很特殊,只允许离散边界条件。 换句话说,不能对 n 个边界面施加连续边界条件习=1(i=1,...,n)。
(b) 对于其余 n 个边界面习=0(i=1,...,n),可以对整个人脸施加边界条件,如果两个人脸相交,则人脸上的边界条件应就交集达成一致。
(c) 具有边界条件的人脸中不包含的任何顶点都将具有单独的(离散)边界条件。
可以将离散边界条件称为有限数据,将连续边界条件称为跨边界条件,以讨论有限和跨finite 数据的内插。
首先,审查标准四面内插(如在Sakamoto专利中使用的),这有助于为这个问题的特定表述设置表示法。 已知单位立方体 [0,1]n 可以细分为 n! 四合体,由 n 个符号上的排列集参数化。 更具体地说,每一种这种四合物都由不平等定义
其中,σ:{1,2,..,n}→{1,2,...,n} 是“symbols”1、2、...、n 的排列,也就是说,它是 n 个符号集的双向映射。 例如,如果 n = 3 和 σ = (3, 2, 1), 这意味着 σ(1)=3, σ(2)=2, σ(3)=1,则相应的四边形由 z≥y≥x 定义,其中通用表示法 x, y, z 用于 x1, x2, x3。 请注意,这些四面体不相交。 为了进行内插,在两个不同的四边形的公用脸上定位的点将具有相同的内插值,而不考虑内插中使用了哪一个四重体。 不过,在对有限点进行内插的标准方案中,对于给定输入点(x1、...、xn),首先确定它位于哪个四边形体中,或者等效于相应的排列σ,然后将四边内插定义为
其中 是标准基向量。 在继续进行通用化之前,请注意,v0、v1、...、vn 是四边形的顶点,
是“偏心坐标”。
对于边界面上的 BC 的一般情况,可以使用条心投影的概念。 与以前一样,对于给定的输入点(x1,...,xn),首先确定它所谎言的四元数,或者等效于相应的排列σ。 然后执行一系列偏心投影,如下所示。 第一个投影 将点发送到平面
除非
在这种情况下,它不会更改。 映射 BProj 的精确定义如下:
with 和 k = 1、2、...、n。
如果 ,则可以停止,因为 BC 按假设 (a) 在 vn 中定义。 如果
,很明显,
具有第σ(1)部分被消灭。 换句话说,它位于一个边界面上。 要么它位于 BC 定义的人脸上,在这种情况下可以停止,或者执行另一个条心投影
其中
。 如果
位于 BC 定义的人脸上,你可以停止;否则,
。 由于每个投影都会消灭一个组件,因此有效维度会减少,因此你知道该过程最终必须停止。 在最坏的情况下,将 n 个投影向下执行到维度 0,即多维数据集上的顶点,根据假设(c),你知道 BC 将定义它。
假设已执行 K 投影,则使用
x(0)= x,输入点,BC 在 x(k) 处定义。 然后,通过定义一系列输出向量来展开投影:
其中 ,你最终获得答案
工作示例
图 2: Worked 示例
请考虑图 2 中描述的情况,其中 n = 3,m = 1,并且你有以下 BC:
(a) 顶点上的四个离散 BC
(0, 0, 1): β001
(0, 1, 1): β011
(1, 0, 1): β101
(1, 1, 1): β111
(b) 脸 x3=0 上的连续 BC: 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>相关联。
第一个投影:
第二个投影:
第三个投影:,它位于人脸 x3=0 上。 然后向后替换提供
,这是最终答案。
应用
(a) 连续四边插
显示连续四边插的
图 3: 顺序四边插
请参阅图 3。 若要在施加不兼容网格的两个平面之间内插,请考虑包含图中显示的给定点 P 的单元格。 单元格的“顶部”顶点直接来自顶部平面中的网格。 底面中的顶点与底部平面中的网格不兼容,因此整个人脸都被视为具有通过底部平面中网格上的内插获取的值的 BC。 然后,很明显,此设置满足上述假设(a)、(b)和(c),你可以应用内插算法。
此外,还清楚的是,该算法已将内插问题的维度减少 1,因为结果是上网格顶点上的值的线性组合,以及下平面中的内插(维度小于 1)。 如果下层平面中存在类似的三明治平面配置,则可以在该平面中应用该过程,进一步将维度减少 1。 此过程可以继续,直到达到维度 0。 这种投影和内插的级联可以称为“顺序四边插”。
(b) 间隙内插
显示间隙内插的
图 4: 间隙内插
这是一个网格,它严格地放置在正象限内的立方体上。 多维数据集本身有一个网格,每个坐标平面都有不一定兼容的网格。 立方体与坐标平面之间的“间隙”具有“L 形”的横段,不适用于标准技术。 但是,通过此处引入的技术,可以轻松引入覆盖此差距的单元格。 图 4 描述了其中一个。 坐标平面上的网格支持内插,该内插为单元格的所有底面提供必要的 BC,其中一个剩余顶点由立方体下角提供。
有关实现的最终说明
在实际应用程序中,算法的基本设置的“单元多维数据集”是从较大的格子中提取的,顶点上的值可能需要昂贵的计算。 另一方面,也很明显,四边插只需要四边形顶点的值,这是单元立方体的所有顶点的子集。 因此,实现所谓的“延迟评估”更为高效。在上述算法的软件实现中,通常有一个子例程,该子例程将单元多维数据集及其顶点上的值作为输入。 延迟求值意味着,无需在顶点传递值,而是传递评估顶点值所需的信息,而无需实际执行计算。 在子例程中,只有在确定封闭四边线后属于封闭四边线的顶点,才会对这些值进行实际评估。
用于高动态范围虚拟 RGB 源设备的查找表
如果使用建模为虚拟 RGB 设备的源设备构造转换,则源着色器值可能是负值或大于 unity(1.0)。 发生这种情况时,源设备称为具有高动态范围(HDR)。 此案特别考虑。
对于 HDR 转换,可以从设备的域确定每个着色通道的最小值和最大值。 通过使用这些值,将应用每个着色器通道的简单缩放,以便将等于最小着色值的着色器值转换为 0.0,而等于最大着色器的值将转换为 1.0,值之间的线性缩放介于 0.0 和 1.0 之间。
ICCProfileFromWCSProfile
由于此功能的主要目的是支持 Windows 的预 Vista 版本,因此必须生成在 ICC 规范 ICC.1:1998-09 中定义的版本 2.2 ICC 配置文件。 在某些情况下(请参阅下表“基线设备到 ICC 配置文件类映射”),可以从 WCS 配置文件创建基于矩阵或 TRC 的 ICC 配置文件。 在其他情况下,ICC 配置文件由 LUT 组成。 以下过程介绍如何创建 AToB 和 BToA LUT。 当然,国际刑院档案也有其他领域。 某些数据可以从 WCS 配置文件派生。 对于其他数据,必须开发智能默认值。 版权将分配给Microsoft;因为它Microsoft用于创建 LUT 的技术。
此设计适用于所有类型的设备模型,包括插件。只要插件具有关联的基线设备模型,就可以确定基础设备类型。
创建 ICC 配置文件的难点在于创建 AToB 和 BToA 查找表。 这些表在设备空间(例如 RGB 或 CMYK)与配置文件连接空间(PCS)之间映射,这是 CIELAB 的变体。 这与 CITE 转换中使用的颜色管理过程基本相同,用于从设备空间映射到设备空间。 但是,必须提供以下信息才能进行转换。
参考 PCS 的查看条件。
参考 PCS 域。
在 PCS 值和着色之间转换的设备模型。
WCS 配置文件及其关联的 CAM 作为参数提供。 有两种基线设备模型可在着色和 PCS 编码之间进行转换。 下面解释了你需要两个原因。
可以从 ICC 配置文件格式规范获取 PCS 的参考查看条件。 ICC 配置文件格式规范中提供的信息足以计算初始化 CMS 使用的 CAM 所需的所有数据。 为了保持一致性和灵活性,此信息存储在 WCS 颜色配置文件中。
还可以使用 WCS 配置文件来存储定义 PCS 参考域的示例。 CITE 颜色管理系统(CMS)有两种方法来创建域边界。 一个是采样完整的设备空间,并使用设备模型创建度量值。 第二种方法是使用配置文件中的测量样本来创建引用域边界。 由于 ICC PCS 的域太大,无法生成有用的参考域,因此第一种方法不合适。 但第二种方法是基于配置文件的灵活方法。 若要重新定义参考 PCS 域,可以更改 PCS 设备配置文件中的度量数据。
ICC PCS 是理想设备的建模。 通过将 PCS 模型创建为真实设备,可以利用智能 CMM 中使用的颜色管理过程。 从着色到 PCS 编码创建设备模型非常简单。 只需在真正的彩色值与 PCS 编码值之间映射。 由于设备模型的 CMS 接口仅支持 XYZ 值,所以可能还必须在 XYZ 和 LAB 之间映射。 这是一个众所周知的转换。 本文档 2.2.02 第 7.9 和 7.10 节介绍了此模型。
如果设备的域大于 PCS 的域,则可能需要执行一些域映射。 基线 GMM 可用于此目的。 请注意,正确创建的 ICC 配置文件具有相对着色、感知和饱和意向的查找表,尽管它们可能都指向同一 LUT 内部。
显示创建 A T o B L U T.Diagram that shows the creation of an A T o B L U T.的关系图
图 5: 创建 AToB LUT
图 5 说明了此过程。 首先,从 DM 配置文件中的数据初始化设备模型。 然后,按如下所示构造设备域边界。 设备模型中的数据采样通过设备模型运行,以获取彩色数据。 着色数据通过 CAM 运行,以创建外观数据。 外观数据用于创建设备域边界。
接下来,使用参考 PCS 度量配置文件中的数据为 PCS 创建域边界。
使用刚刚创建的两个域边界来初始化 GMM。 然后,使用设备模型、GMM 和 PCS 设备模型创建转换。 通过转换运行设备空间的采样以创建 AToB LUT。
图 6: 创建 BToA LUT
图 6 说明了 BToA LUT 的创建。 这与创建 AToB LUT 几乎完全相同,其中交换了源和目标的角色。 此外,必须采样完整的 PCS 游戏才能创建 LUT。
请注意,由于 CAM(WCS 中的 CIECAM02)参与了该过程,因此媒体白点和 PCS 白点(由 ICC 授权为 D50)之间的色度适应由 CAM 透明地生效。
HDR 虚拟 RGB 设备
为 HDR 虚拟 RGB 设备生成配置文件时,必须特别考虑以下事项:也就是说,着色器值可能小于 0.0 或大于 1.0 的设备。 在 ATOB LUT 的生成中,将生成一组更大的 1D 输入 LUT。 着色器值将缩放并偏移到范围 0 .。 1 使用 WCS 配置文件中的最小和最大着色值。
由于 HDR 设备的着色空间不太可能完全填充,因此标记的 3D LUT 中也提供了特殊支持。 为了处理稀疏填充区域中的颜色,将重新编码着色器,以便实现超过 0.0 和 1.0 的推断。 所使用的范围 -1 .. +4.
由于应用于三维 LUT 的重新缩放,因此会生成一组 1D 输出 LUT,以将结果映射回 0 范围。 1.
多个 PCS
国际刑院发现,一台PCS不够灵活,无法满足 CMS 的所有预期用途。 在配置文件规范的版本 4 中,ICC 澄清说,实际上有两个 PCS 编码。 一个用于着色意向;另一个用于感知意向。 (未为饱和意向指定 PCS。国际刑院已经使这一部分模棱两可。彩色 PCS 具有指定的最小和最大光度,但色度和色调值范围大致± 127。 此 PCS 看起来像一个矩形棱镜。 如前所述,感知 PCS 卷类似于喷墨打印机的域。
这两个 ICC PCS 也有两种不同的数字编码。 在感知 PCS 中,值为零表示零的光度。 在彩色 PCS 中,值为零表示 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、液晶显示器 | 显示设备(“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 模型:
ICC 模型:
从 WCS 模型转换为 ICC 模型,如下所示。
定义新曲线:
这些不是音调复制曲线,因为它们不映射 1 到 1。 规范化将实现此目的。 ICC 模型的最终定义包括:
对于非 HDR RGB 虚拟设备,还会生成一个显示 ICC 配置文件,提高空间效率。 在这种情况下,M ICC 的三元矩阵可以直接从 WCS 配置文件的初选获取,而无需上述模型转换。 最后一个,但很重要,注意的是,这种三星矩阵必须以色度调整为 D50,以符合 PCS 的 ICC 规范。 换句话说,要在 ICC 配置文件中编码的矩阵的每一行的条目必须分别求和为 96.42、100 和 82.49。 在目前的实现中,色度适应是由 CAT02 完成的,这也是 CAM02 中使用的色度适应转换。
黑色保存和黑色代系
黑色保护的实现与支持黑色通道的设备中的黑色通道的生成绑定在一起。 为此,将收集有关每个源颜色的信息,以允许支持黑色通道的设备模型确定如何最好地在输出上设置黑色通道。 虽然黑色保存对于在一个黑色通道设备之间转换到另一个黑色通道设备之间的颜色转换相关,但黑色代系针对涉及黑通道目标设备的所有转换实现。
黑色通道信息记录在名为 BlackInformation的数据结构中。 BlackInformation 结构包含一个布尔值,指示颜色是否仅包含黑色着色器和指示称为黑色权重的“黑色”度的数值。 对于支持黑色通道的源设备,黑色权重是源颜色中黑色着色量的百分比。 对于不包含黑色通道的源设备,使用其他着色器和外观值计算黑色权重。 通过将最大着色值与最小着色值除以最大着色值之差来计算名为“颜色纯度”的值。 通过将颜色的光度与目标设备的最小光度之差除以目标设备的最小光度和最大光度之间的差,计算出名为“相对光度”的值。 如果源设备是累加设备(监视器或投影仪),则黑色重量确定为 1.0 减去颜色纯度乘以相对光度。 例如,如果源设备是 RGB 监视器,则计算每个颜色的 R、G 和 B 的最大值和最小值,并且黑色权重由公式确定:
BW = (1.0 – (max(R,G,B) – min(R,G,B)) / max(R, G, B)) * 相对光度
如果源设备支持减色,例如 CMY 打印机,则在上述公式中使用之前,单个着色器必须“补色”(从 1.0 减去)。 因此,对于 CMY 打印机,R = 1.0 – C、G = 1.0 – M,B = 1.0 – Y。
颜色转换处理的每个颜色的黑色信息在颜色转换过程中确定。 仅当指定黑色保存时,才确定仅黑信息。 始终确定目标设备模型是否支持黑色着色器。 黑色信息通过 ColorimetricToDeviceColorsWithBlack 方法传递到目标设备模型,该方法使用生成的 LUT。
请注意,由于颜色转换优化,上述过程仅在创建优化的转换 LUT 期间发生,而不是在执行 TranslateColors 方法期间发生。
针对具有三个以上源通道的转换进行优化
优化转换的大小由以下几个因素决定:源设备中的颜色通道数、每个源颜色通道的表中的步骤数以及输出设备中的颜色通道数。 用于确定转换表大小的公式为:
Size = 每个通道 source\ device(Number\ of\ channels\ in\ in\ source\ device) 输出设备中的通道数 x
如你所看到的,表的大小根据源设备中的通道数呈指数级增长。 许多源设备支持三个颜色通道,例如红色、绿色和蓝色。 但是,如果源设备支持四个通道(如 CMYK),表的大小和构造表所需的时间会随着步骤数的一个因素而增长。 在基于度量的 CMS 中,转换是“动态”构造的,这次可能是不能接受的。
为了缩短构造颜色转换表所需的时间,可以利用两个事实。 首先,虽然源设备可能支持三个以上的颜色通道,但中间设备无关的颜色空间(CIECAM02 Ja C b C)只有三个颜色通道。 其次,处理中最耗时的部分不是设备建模(从设备颜色坐标转换为三角值),而是游戏映射。 使用这些事实,可以构造一个初步的颜色转换表,该表通过游戏映射步骤在独立于设备的颜色空间中转换颜色,最后通过输出设备颜色模型转换颜色。 此表的构造为维度 3。 然后,我们通过将源颜色组合转换为中间与设备无关的空间来构造维度四个最终颜色转换表,然后使用初步颜色转换表完成到输出设备颜色空间的转换。 因此,可以减少计算(查阅表格中的步骤数)数字\ 通道 域映射计算到中间表 ₃ 域映射计算中的步骤数。 尽管你必须执行(查阅表格)中的步骤数 数字\ 通道 设备建模和三维表查找的计算,但这仍然比原始计算快得多。
只要源设备模型与颜色转换中的任何其他组件之间传递信息,上述过程将正常工作。 但是,如果输出设备和源设备都支持黑色着色器,并且源黑色着色器用于确定输出黑色着色器,则该过程将无法正确传达源黑色信息。 另一个过程是构造一个初步的颜色转换表,该表仅通过游戏映射步骤转换独立于设备的颜色空间中的颜色。 然后,使用以下步骤构造维度四个最终颜色转换表:a)将源颜色组合转换为中间设备无关的空间,b) 通过在初步颜色表中内插而不是应用实际的域映射过程来执行游戏映射步骤,c) 使用来自域映射步骤和任何源黑色通道信息的结果值,以使用输出设备模型计算输出设备着色器。 即使没有黑色通道,在源设备模型和输出设备模型之间传输信息时,也可以使用此过程;例如,如果两个模块是使用插件体系结构实现的,该插件体系结构允许模块之间的数据交换。
前两个过程可用于有效缩短构造四维颜色转换表所需的时间。
CheckGamut
ICM 调用 CreateTransform 并 CreateMultiProfileTransform 采用标志值一词,其中一个是ENABLE_GAMUT_CHECKING。 设置此标志后,CITE 必须以不同的方式创建转换。 初始步骤相同:必须初始化源和目标 CAM,然后必须初始化源和目标域边界描述符。 无论指定意向如何,都必须使用 CheckGamut GMM。 应使用源设备和目标设备模型和域边界描述符初始化 CheckGamut GMM。 但是,转换随后应创建一个截断的转换,其中包括源设备模型、源 CAM、任何干预的 GMM 和 CheckGamut GMM。 这可确保 CheckGamut CMM 输出的增量 J、delta C 和 delta h 值成为最终生成的值。
当转换中只有两个设备配置文件时,CheckGamut 的含义是明确的。 当有两个以上的设备配置文件和两个以上的 GMM 时,CheckGamut 会报告是否已通过第一个设备模型和最后一个 GMM 以外的所有颜色都属于目标设备的范围。
相关主题