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
相关产品推荐
相关产品推荐

