【问题标题】:How to apply a multidimensional look up table to a color image?如何将多维查找表应用于彩色图像?
【发布时间】:2018-10-08 04:17:03
【问题描述】:

为了简单起见,让我们假设图像有两行四列,像素颜色由三个强度级别表示(强度被量化为五个不同的整数值)。我想通过使用每个像素的强度级别作为索引,通过 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 作为颜色图进行转换。

【问题讨论】:

    标签: python numpy matplotlib image-processing lookup-tables


    【解决方案1】:

    这是:

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

    你在找什么?

    img.transpose() 需要重新排列通道解包所需的轴。

    对于任意数量的频道:

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

    【讨论】:

    • 所以您想避免创建redgreenblue 变量?
    • lut[tuple(img.T)].T 产生预期的结果。有没有办法避免双重换位?
    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 2023-03-04
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多