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 我错过了什么。我正在查看文档,但没有找到太多关于 I
到 P
转换的信息。
我认为问题在于您的值缩放到范围 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
我有这张深度图:
我用 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 我错过了什么。我正在查看文档,但没有找到太多关于 I
到 P
转换的信息。
我认为问题在于您的值缩放到范围 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