Как использовать Image.convert () подушки с настраиваемой цветовой палитрой? - PullRequest
0 голосов
/ 14 июля 2020

Я хочу уменьшить битовую глубину (глубину цвета) изображения до набора настраиваемых цветов в Python. По сути, дать программе набор из x цветов и связать каждый пиксель полноцветного изображения с ближайшим цветом из данного списка. У меня возникли проблемы с библиотекой Pillow, как показано ниже.

Этот код правильно уменьшит цвета в изображении 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')

Этот код похож, за исключением того, что я пытался использовать свою собственную цветовую палитру. Проблема в том, что этот код возвращает то же изображение, что и приведенный выше код, и, кажется, просто go с адаптивной палитрой и игнорирует пользовательский, который я пытался указать:

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 задан в неправильном формате / размере или что мне нужно включить аргумент matrix в метод convert . Согласно документации, аргумент матрица равен 'Необязательная матрица преобразования. Если задано, это должен быть 4- или 12-кортеж, содержащий значения с плавающей запятой. ', что я не знаю, как реализовать.

Какой бы ни была проблема, я очень застрял и хотел бы получить некоторую помощь.

Альтернативно, есть ли лучшая Python библиотека для этой задачи, поскольку я открыт для предложений.

1 Ответ

1 голос
/ 14 июля 2020

Я считаю, что это примерно то, что вы хотите

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()

    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...