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

PIL中fromarray在P模式下转换后生成错误灰度图像问题咨询

解决P模式图像转numpy再转回后变灰度的问题

这个问题的核心在于P模式(调色板模式)的图像包含两部分信息:像素索引数组和对应的调色板(颜色映射表),而你当前的代码只保留了索引数组,丢失了调色板信息,所以转回图像时系统只能用默认的灰度调色板来渲染,自然就变成灰度图了。

修复后的代码

from PIL import Image
import numpy as np

# 打开图像并转为P模式
label = Image.open(dir).convert('P')
# 保存原始图像的调色板信息
original_palette = label.getpalette()
# 转换为numpy数组(仅保留索引)
label_array = np.asarray(label)
# 从数组转回P模式图像
img = Image.fromarray(label_array, mode='P')
# 将原始调色板赋值回去
img.putpalette(original_palette)
# 保存图像
img.save('test.png')

关键说明

  • P模式图像的每个像素值其实是调色板中的索引,不是直接的RGB颜色值。当你用np.asarray()转换时,只会提取这些索引值,调色板不会被包含在数组里。
  • img.putpalette(original_palette)这一步是关键,它把原始图像的颜色映射表重新绑定到新生成的图像对象上,这样才能正确还原出原本的彩色效果。
  • 如果你的原始P模式图像使用的是自定义调色板(比如语义分割的标签图),这种方法能完美保留原本的颜色映射关系。

内容的提问来源于stack exchange,提问作者Moonchester

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:19:29