Python 如何将多维查找表应用于彩色图像?

Python 如何将多维查找表应用于彩色图像?,python,numpy,matplotlib,image-processing,lookup-tables,Python,Numpy,Matplotlib,Image Processing,Lookup Tables,为了简单起见,让我们假设图像有两行四列,像素颜色由三组强度级别表示。强度量化为五个不同的整数值。我想通过使用每个像素的强度级别作为索引,通过3D查找表将这样的彩色图像转换为单通道图像。此玩具示例可实现如下所示: import numpy as np levels = 5 rows, columns, channels = 2, 4, 3 lut = np.arange(levels**channels).reshape([levels for n in range(channels)]) np

为了简单起见,让我们假设图像有两行四列,像素颜色由三组强度级别表示。强度量化为五个不同的整数值。我想通过使用每个像素的强度级别作为索引,通过3D查找表将这样的彩色图像转换为单通道图像。此玩具示例可实现如下所示:

import numpy as np
levels = 5
rows, columns, channels = 2, 4, 3

lut = np.arange(levels**channels).reshape([levels for n in range(channels)])
np.random.seed(0)
img = np.random.randint(low=0, high=levels, size=(rows, columns, channels))
我知道我可以像这样硬编码索引:

red = img[:, :, 0]
green = img[:, :, 1]
blue = img[:, :, 2]
indexed = lut[red, green, blue]
上述代码可推广用于多光谱图像:

indexed = lut[[img[:, :, i] for i in range(channels)]]
两种方法产生相同的结果:

In [931]: indexed
Out[931]: 
array([[103,  91,  89,   4],
       [ 55,  30,  48,  15]])
我的问题是:有没有更优雅的方法来获得同样的结果?更具体地说,我正在寻找一个NumPy函数,它可以将彩色图像3D阵列拆分为彩色通道2D阵列列表。或者,我认为可以通过matplotlib使用lut作为颜色映射来执行转换。

是这样的:

red, green, blue = img.transpose()

lut[red, green, blue].transpose()
你在找什么

重新排列通道拆包所需的轴所需的img.transpose

对于任意数量的通道:

lut[tuple(img.transpose())].transpose()

因此,您希望避免创建红色、绿色和蓝色变量?lut[tupleimg.T].T生成预期结果。有没有办法避免双重换位?