为何PNG图片被Python读取为黑白图像?
问题原因与解决办法
你的问题出在这张PNG图片的颜色模式上:它是索引色模式(调色板模式),而非常规的RGB真彩色模式。
原因解析
- 索引色图片的存储逻辑是:只保存一个单通道的"索引矩阵"(每个像素值对应调色板里的颜色编号),真正的RGB颜色信息存在独立的调色板中。
- PIL默认打开这类图片时,只会加载这个单通道的索引数据,所以输出的数组shape是
(57, 86),matplotlib用灰度色阶渲染这个单通道数据,就显示成了灰度图。 - 而图像查看器会自动读取调色板,把索引映射成对应的RGB颜色,所以你看到的是彩色效果。
解决方法
方法1:直接转换为RGB模式
打开图片时调用convert("RGB"),强制将图片转为真彩色模式,这样得到的数组就是你预期的(H,W,3)格式:
import numpy as np from PIL import Image as im from matplotlib import pyplot as plt image = np.array(im.open("optimised.png").convert("RGB")) print(image.shape) # 输出 (57, 86, 3) plt.imshow(image) plt.show()
方法2:保留调色板并手动映射(可选)
如果需要保留原调色板信息,可以先获取调色板再完成颜色映射:
import numpy as np from PIL import Image as im from matplotlib import pyplot as plt img = im.open("optimised.png") # 获取调色板,转为(256,3)的RGB数组 palette = np.array(img.getpalette()).reshape(-1, 3) # 将索引矩阵映射为RGB图像 rgb_image = palette[np.array(img)] print(rgb_image.shape) # 输出 (57, 86, 3) plt.imshow(rgb_image) plt.show()
内容的提问来源于stack exchange,提问作者scribe
相关产品推荐
相关产品推荐

