PIL 图像从 I 模式转换为 P 模式

PIL Image convert from I mode to P mode

我有这张深度图:

我用 PIL 加载如下:

depth_image = Image.open('stereo.png')

如果我打印图像的模式,它显示模式 I,根据文档,即 (32-bit signed integer pixels)

这是正确的,因为图像值的范围从 0 到 255。我想给这个深度图像着色以获得更好的可视化效果,所以我尝试使用如下调色板将其转换为 P 模式:

depth_image = depth_image.convert('P', palette=custom_palette)
depth_image.save("colorized.png")

但结果是这样的黑白图像:

我确定调色板没问题,因为 int 格式中有 256 种颜色都在一个数组中。

我试过在保存之前将其转换为 RGB,例如:

depth_image = depth_image.convert('RGB')

之后我还尝试添加调色板,例如:

depth_image = depth_image.putpalette(custom_palette)

如果我尝试在不将其转换为 RGB 的情况下保存它,我会得到:

    depth_image.save("here.png")
AttributeError: 'NoneType' object has no attribute 'save'

到目前为止,我将尝试将图像转换为 numpy 数组,然后从那里映射颜色,但我想知道关于 PIL 我错过了什么。我正在查看文档,但没有找到太多关于 IP 转换的信息。

我认为问题在于您的值缩放到范围 0..65535 而不是 0..255。

如果您这样做,您会看到值比您预期的要大:

i = Image.open('depth.png') 
n = np.array(i) 

print(n.max(),n.mean())
# prints 32257, 6437.173

于是,我赶紧试了一下:

n = (n/256).astype(np.uint8)
r = Image.fromarray(n)
r=r.convert('P') 
r.putpalette(custom_palette)     # I grabbed this from your pastebin