如何将多维查找 table 应用于彩色图像?
How to apply a multidimensional look up table to a color image?
为了简单起见,我们假设图像有两行四列,像素颜色由强度级别的三元组表示(强度被量化为五个不同的整数值)。我想通过使用每个像素的强度级别作为索引,通过 3D 查找 table 将此类彩色图像转换为单通道图像。这个玩具示例可以按如下方式实现:
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 数组)。或者,我认为可以使用 lut
作为颜色图通过 matplotlib 执行转换。
这是:
red, green, blue = img.transpose()
lut[red, green, blue].transpose()
你在找什么?
重新排列通道解包所需的轴所需的 img.transpose()
。
对于任意数量的频道:
lut[tuple(img.transpose())].transpose()
为了简单起见,我们假设图像有两行四列,像素颜色由强度级别的三元组表示(强度被量化为五个不同的整数值)。我想通过使用每个像素的强度级别作为索引,通过 3D 查找 table 将此类彩色图像转换为单通道图像。这个玩具示例可以按如下方式实现:
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 数组)。或者,我认为可以使用 lut
作为颜色图通过 matplotlib 执行转换。
这是:
red, green, blue = img.transpose()
lut[red, green, blue].transpose()
你在找什么?
重新排列通道解包所需的轴所需的 img.transpose()
。
对于任意数量的频道:
lut[tuple(img.transpose())].transpose()