我正在使用带有 NumPy 的查找表 (LUT) 实现颜色插值。有一次,我使用 RGB 值的 4 个最高有效位从 17x17x17x4 LUT 中选择相应的 CMYK 值。现在它看起来像这样:
import numpy as np
rgb = np.random.randint(16, size=(3, 1000, 1000))
lut = np.random.randint(256, size=(17, 17, 17, 4))
cmyk = lut[rgb[0], rgb[1], rgb[2]]
第一个问题来了……有没有更好的办法?您可以告诉 NumPy 的索引lut
是沿轴 0 存储的rgb
,而不必实际写出来,这似乎很自然。cmyk = lut.fancier_take(rgb, axis=0)
那么在 NumPy中有什么类似的东西吗?
此外,我留下了一个 shape 数组(1000, 1000, 4)
,因此为了与输入保持一致,我需要使用几个来旋转它swapaxes
:
cmyk = cmyk.swapaxes(2, 1).swapaxes(1, 0).copy()
而且我还需要添加复制语句,因为如果不是,结果数组在内存中不连续,这会给以后带来麻烦。
现在我倾向于在花哨的索引之前旋转 LUT,然后按照以下方式做一些事情:
swapped_lut = lut.swapaxes(2, 1).swapaxes(1, 0)
cmyk = swapped_lut[np.arange(4), rgb[0], rgb[1], rgb[2]]
但同样,它似乎并不正确......必须有一种更优雅的方式来做到这一点,对吧?像cmyk = lut.even_fancier_take(rgb, in_axis=0, out_axis=0)
...