You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:37:05