PIL量化图像转numpy数组仅返回单数字值而非RGB值问题咨询
问题原因
Image.quantize()方法输出的图像默认是P模式(调色板索引模式):这类图像不会在像素位直接存储RGB三通道值,仅存储每个像素对应调色板的索引序号(也就是你输出数组里的0~7这类单个数字),这是转数组仅得到单值的核心原因,你使用的调色板bmp文件本身不存在异常。- 额外代码bug提示:你代码中numpy导入写的是
import numpy as py,后续转数组却调用np.asanyarray(),别名不统一会直接触发运行报错,需要统一导入别名。 - 对P模式图像执行resize操作时,无论选择哪种重采样算法,都不会自动将图像转为RGB模式,因此从量化到上下采样的全流程中,只要没有主动做模式转换,图像始终会保留调色板索引格式。
解决方案
不需要手动编写索引值到RGB值的映射逻辑,PIL内置了模式转换方法,在转数组前主动将图像从P模式转为RGB模式即可,修改后的核心代码如下:
# 原有上下采样逻辑保持不变 upsample = downsample.resize((w,h), PIL.Image.Resampling.BICUBIC ) # 新增:将调色板索引模式转为标准RGB三通道模式 upsample = upsample.convert("RGB") # 再转数组即可得到三通道RGB值 rgb = np.asanyarray(upsample)
转换后得到的数组形状为(图像高度, 图像宽度, 3),最后一个维度依次对应R、G、B三个通道的像素值,和量化前输入图像的数组格式完全一致。
内容的提问来源于stack exchange,提问作者Aaron O'Neill
相关产品推荐
相关产品推荐

