快速近似的RGB/LAB转换算法?

8

我正在使用OpenGL开发一款数据可视化工具,而LAB色彩空间是最适合我处理的数据可视化(3个数据轴映射到色彩空间的3个轴)的颜色空间。是否有一种快速的算法(例如无非整数指数幂运算,适用于着色器执行),可以近似地将LAB值转换为RGB值以及从RGB值转换为LAB值?


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

1
如果在着色器中进行实际转换计算过于复杂/昂贵,您总是可以使用查找表。由于两个颜色空间都有3个组件,因此可以使用3D RGB纹理来表示查找表。
使用3D纹理可能听起来很繁琐。由于在OpenGL中通常使用8位/分量来表示颜色,因此您需要一个256x256x256的3D纹理。每个像素需要4个字节,这是一个64 MB的纹理,不是非常夸张,但非常重要。
但是,根据翻译表中的值的平滑程度,您可能可以使用较低的分辨率。请记住,纹理采样使用线性插值。如果分段线性插值足以使用某个查找表的基本分辨率,则可以大大减小大小。
如果您走这条路,并且无法为LUT使用64 MBytes,则必须调整LUT的大小,并进行可能的大小/性能与质量权衡。

1
我不确定我理解你的数学计算。如果每个分量有8个比特,那么你的表格不需要是256x256x256吗? - Mark Ransom
@MarkRansom 哎呀,是的,我确实这么认为。听起来有点太美好了。 - Reto Koradi
@MarkRansom 好的,已更新。现在可能看起来略微不那么吸引人,但至少我希望它是正确的。感谢您指出这一点。 - Reto Koradi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接