Python 如何将多维查找表应用于彩色图像?
为了简单起见,让我们假设图像有两行四列,像素颜色由三组强度级别表示。强度量化为五个不同的整数值。我想通过使用每个像素的强度级别作为索引,通过3D查找表将这样的彩色图像转换为单通道图像。此玩具示例可实现如下所示: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
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生成预期结果。有没有办法避免双重换位?