【问题标题】:Fast approximate algorithm for RGB/LAB conversion?RGB/LAB 转换的快速近似算法?
【发布时间】:2015-05-24 07:30:34
【问题描述】:

我正在开发一个使用 OpenGL 的数据可视化工具,而 LAB 颜色空间是我正在处理的数据可视化的最容易理解的颜色空间(3 个数据轴映射到颜色空间的 3 个轴)。是否有快速(例如,没有非整数求幂,适合在着色器中执行)算法将 LAB 值与 RGB 值进行近似转换?

【问题讨论】:

  • 我希望有,但我怀疑它是否存在。立方根部分将很难模拟。也许在少量等效点之间使用线性插值?
  • 好吧,这是一个子问题:例如OpenGL 使得 RGB 值是线性的(自动应用伽马),还是不是(显式伽马补偿)?如果它们是线性的,那就意味着 XYZ->RGB 步骤只需要矩阵乘法,对吗?

标签: algorithm colors pixel-shader color-space function-approximation


【解决方案1】:

如果在着色器中进行实际的转换计算过于复杂/昂贵,您始终可以使用查找表。由于两个颜色空间都有 3 个分量,因此您可以使用 3D RGB 纹理来表示查找表。

使用 3D 纹理听起来可能需要大量开销。由于 OpenGL 中通常使用 8 位/分量来表示颜色,因此您需要 256x256x256 的 3D 纹理。以 4 字节/纹素计算,这是一个 64 MByte 的纹理,这不算离谱,但非常可观。

但是,根据转换表中值的平滑程度,您也许可以使用较低的分辨率。请记住,纹理采样使用线性插值。如果分段线性插值足够好,并且查找表具有一定的基本分辨率,则可以大大减小大小。

如果您朝这个方向发展,并且无法为 LUT 使用 64 MB,您将不得不考虑 LUT 的大小,并在大小/性能与质量之间做出可能的权衡。

【讨论】:

  • 我不确定我是否遵循你的数学。如果每个组件有 8 个,你的表不需要是 256x256x256 吗?
  • @MarkRansom Argh,是的,我愿意。听起来确实好得令人难以置信。
  • @MarkRansom 好的,已更新。现在可能看起来不那么有吸引力了,但至少我希望它是正确的。感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
相关资源
最近更新 更多