使用Numpy将值映射到更高维度
我正在尝试在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)