【发布时间】:2013-06-19 10:25:29
【问题描述】:
我们的 API 中已经有一个高度优化的类来读取 3D Lut(Nuke 格式)文件并将转换应用于图像。因此,与其使用复杂的公式逐个像素地迭代并将 RGB 值转换为 Lab (RGB->XYZ->Lab) 值,我认为最好为 RGB 生成一个查找表到 LAB(或 XYZ 到实验室)变换。这可能吗?
我了解 3D Lut 如何用于从 RGB 到 RGB 的转换,但我对 RGB 到 Lab 感到困惑,因为 L、a 和 b 具有不同的范围。有什么提示吗?
编辑:
你能解释一下 Lut 是如何工作的吗? 这里有一种解释:link
例如,以下是我对 RGB->RGB 变换的 3D Lut 的理解: 一个示例 Nuke 3dl Lut 文件:
0 64 128 192 256 320 384 448 512 576 640 704 768 832 896 960 1023
R, G, B
0, 0, 0
0, 0, 64
0, 0, 128
0, 0, 192
0, 0, 256
.
.
.
0, 64, 0
0, 64, 64
0, 64, 128
.
.
这里不是为源 10 位 RGB 值生成 1024*1024*1024 表,而是将每个 R、G 和 B 范围量化为 17 个值,生成 4913 行表。 第一行给出了可能的量化值(我认为这里只有长度和最大值很重要)。现在假设,如果源 RGB 值为 (20, 20, 190 ),则输出将是第 4 行 (0, 0, 192)(使用一些插值技术)。那是对的吗? 这个是 10 位源的,你可以通过将范围从 0 更改为 255 来生成一个类似的 8 位源?
同样,您将如何进行 sRGB->Lab 转换?
【问题讨论】:
-
源色彩空间中的离散值是可能的(例如,每个通道 8 位是合适的,>= 每个通道 16 位会导致表格非常大)。 目标色彩空间可以根据您的需要精确(它只确定您在表格单元格中写入的多少,而不是表格的大小是)
-
替代方案:GPGPU(可能与 CUDA、OpenCL 或 GLSL 一起使用)
-
您不必量化输出。您甚至可以为您的实验室存储三个花车;它只会使表格线性变大。但是,如果您将 8 位 RGB 与 16 位 RGB 进行比较,您的表有 1600 万个与 2.8e14 个条目(我什至不知道这个数字的名称......)所以如果您保留您的 输入信号 用低位数量化(即每通道 RGB 8 位 24 位),生成和使用表格是合适的(见我的回答)。
-
是的,我不知道为什么我之前感到困惑(我找不到关于 3dlut 文件格式的好文章)。也许我不会使用所有 256 个值作为源 RGB 值,而是使用 17x17x17。
-
请问您为什么不接受我的回答?有什么问题吗?
标签: c++ image-processing