我想在Python中将图像的位深度(颜色深度(降低到一组自定义颜色。本质上是给程序一组x颜色,并让它将全色图像中的每个像素与给定列表中最接近的颜色相关联。我的枕头库出现问题,如下所示。
此代码将正确地将图像"Z.png"中的颜色减少到只有4种颜色,基于从图像本身创建的调色板:
from PIL import Image
colorImage = Image.open("Z.png")
imageWithColorPalette = colorImage.convert("P", palette=Image.ADAPTIVE, colors=4)
imageWithColorPalette.save("Output.png")
from IPython.display import Image
Image('Output.png')
这个代码是类似的,除了我尝试使用我自己的调色板。问题是,这段代码返回的图像与上面的代码完全相同,似乎只是使用了自适应调色板,忽略了我试图指定的自定义调色板:
from PIL import Image
pall = [
0, 0, 0,
255, 0, 0,
255, 255, 0,
255, 153, 0,
]
colorImage = Image.open("Z.png")
imageWithColorPalette = colorImage.convert("P", palette=pall, colors=4)
imageWithColorPalette.save("Output.png")
from IPython.display import Image
Image('Output.png')
基于此处的文档:https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.convert在这里https://pillow.readthedocs.io/en/3.0.x/reference/ImagePalette.html.我假设我的pall的格式/大小不正确,或者我需要在convert方法中包含矩阵参数。根据文档,矩阵参数是可选的转换矩阵。如果给定,这应该是包含浮点值的4或12元组我不确定如何实施。
不管是什么问题,我都很困,我会寻求一些帮助。
另外,有没有更好的Python库可以用于此任务,因为我愿意接受建议。
我相信这符合您想要的
from PIL import Image
if __name__ == '__main__':
palette = [
159, 4, 22,
98, 190, 48,
122, 130, 188,
67, 153, 0,
]
img = Image.open('img.jpg')
p_img = Image.new('P', (16, 16))
p_img.putpalette(palette * 64)
conv = img.quantize(palette=p_img, dither=0)
conv.show()