所以我试图将bmp转换为NumPy数组,将数组存储在某处,然后将其转换回bmp图像。
bmp = Image.open(fn_bmp)
data = np.array(bmp.convert('P', palette=Image.WEB))
此数据暂时存储在另一个文件中,然后我会在稍后的某个时间检索它。
bmp = Image.fromarray(np.array(dataset).convert('P', palette=Image.WEB))
bmp.save(fn)
请注意,数据集是一个转换回NumPy数组的对象,np.array(dataset)==所有索引中的数据。
出于某种原因,当我显示或保存此结果图像时,对应于某些调色板颜色的“14”被解释为灰度值并保存这样的颜色。如何将图像保存为彩色调色板位图图像?我尝试添加保存选项(例如mode ='P',palette = Image.WEB)无济于事。谢谢你的帮助。
修改
在PIL文档的教程部分中,它指定了转换的限制。
该库支持每种支持模式与“L”和“RGB”模式之间的转换。要在其他模式之间进行转换,您可能必须使用中间图像(通常为“RGB”图像)。
所以,为了完成我正在做的事情,我必须在第一个数组中将图像转换为RGB,然后在第二个数组中转换回P..
然而,当从RGB转换回P时,图像(只有4种颜色)会变形。这有什么理由吗?
答案 0 :(得分:0)
在这种情况下,Image.fromarray(data)
会返回灰度图像。将此图像转换为其他图像模式时,它将保持灰度!
相反,您必须以调色板的形式提供颜色信息:
# first part
bmp = Image.open(fn_bmp)
bmp_P_web = bmp.convert('P', palette=Image.WEB)
web_palette = bmp_P_web.getpalette() # <---
data = np.array(bmp_P_web)
# second part
bmp = Image.fromarray(data)
bmp.putpalette(web_palette) # <---
不知道如何直接从PIL获取web_palette
,但这里有一种用numpy生成it的方法:
web_palette = np.zeros(3*256, int)
web_palette[30:-90] = np.mgrid[0:256:51, 0:256:51, 0:256:51].ravel('F')