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

时间:2018-04-27 10:23:55

标签: 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.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]])

我的问题:是否有更优雅的方式来获得相同的结果?更具体地说,我正在寻找一种将彩色图像(3D阵列)分成其彩色通道(2D阵列)列表的NumPy功能。或者,我认为可以使用lut作为色彩映射,通过matplotlib进行转换。

1 个答案:

答案 0 :(得分:1)

这是:

red, green, blue = img.transpose()

lut[red, green, blue].transpose()

你在找什么?

重新排列频道解压缩所需的轴所需的img.transpose()

对于任意数量的频道:

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