使用Numpy将值映射到更高维度

5 投票
1 回答
986 浏览
提问于 2025-04-18 09:54

我正在尝试在Numpy中给一个二维灰度图像应用颜色映射(这个图像是通过OpenCV加载或生成的)。

我有一个包含256个RGB值的列表,这就是我的颜色映射:

cMap = [np.array([0, 0, 0], dtype=np.uint8),
        np.array([0, 1, 1], dtype=np.uint8),
        np.array([0, 0, 4], dtype=np.uint8),
        np.array([0, 0, 6], dtype=np.uint8),
        np.array([0, 1, 9], dtype=np.uint8),
        np.array([ 0,  0, 12], dtype=np.uint8),
        # Many more entries here
       ]

当我输入一个灰度图像(形状是 (y,x,1))时,我希望输出一个彩色图像(形状是 (y,x,3)),其中每个输入像素的灰度值用作 cMap 中的索引,以找到输出像素的合适颜色。到目前为止,我的尝试(灵感来自快速替换numpy数组中的值)是这样的:

colorImg = np.zeros(img.shape[:2] + (3,), dtype=np.uint8)

for k, v in enumerate(cMap):
    colorImg[img==k] = v

这让我遇到了一个错误 ValueError: array is not broadcastable to correct shape。我想我已经找到了问题所在:我进行的切片操作导致了一个一维的布尔数组,每个条目对应于 img 中的每个条目。然而,colorImg 的条目数量是 img 的三倍,所以这个布尔数组的长度不够。

我尝试了各种重塑和其他切片方法,但现在我真的卡住了。我相信有一种优雅的方法可以解决这个问题 :-)

1 个回答

1

你要找的函数是 numpy.take()。唯一需要注意的地方是要设置 axis = 0,这样返回的图像才会有正确的通道数量。

colorImg = np.take(np.asarray(cMap), img, axis = 0)

撰写回答