Преобразование изображения в конкретную палитру с использованием PIL без сглаживания
Я пытаюсь преобразовать изображение RGB в формат PNG для использования определенной индексированной палитры с помощью библиотеки подушек (Python Image Library, PIL). Но я хочу преобразовать, используя метод «округление до ближайшего цвета», а не сглаживание, потому что изображение является пиксельной графикой, а сглаживание искажает контуры областей и добавляет шум к областям, которые должны быть плоскими.
Я старалсяImage.Image.paste()
, и он использовал четыре указанных цвета, но это дало размытое изображение:
from PIL import Image
oldimage = Image.open("oldimage.png")
palettedata = [0, 0, 0, 102, 102, 102, 176, 176, 176, 255, 255, 255]
newimage = Image.new('P', oldimage.size)
newimage.putpalette(palettedata * 64)
newimage.paste(oldimage, (0, 0) + oldimage.size)
newimage.show()
Я старалсяImage.Image.quantize()
как упомянуто вПикту ответ на аналогичный вопрос, но это также произвело дизеринг:
from PIL import Image
palettedata = [0, 0, 0, 102, 102, 102, 176, 176, 176, 255, 255, 255]
palimage = Image.new('P', (16, 16))
palimage.putpalette(palettedata * 64)
oldimage = Image.open("School_scrollable1.png")
newimage = oldimage.quantize(palette=palimage)
newimage.show()
Я старалсяImage.Image.convert()
и оно конвертировало изображение без сглаживания, но оно включало цвета, отличные от указанных, предположительно потому, что использовало либо веб-палитру, либо адаптивную палитру
from PIL import Image
oldimage = Image.open("oldimage.png")
palettedata = [0, 0, 0, 102, 102, 102, 176, 176, 176, 255, 255, 255]
expanded_palettedata = palettedata * 64
newimage = oldimage.convert('P', dither=Image.NONE, palette=palettedata)
newimage.show()
Как автоматически преобразовать изображение в определенную палитру без сглаживания? Я хотел бы избежать решения, которое обрабатывает каждый отдельный пиксель в Python, как предложено вОтвет Джона Ла Руи и комментарии к нему, потому что мое предыдущее решение, включающее внутренний цикл, написанный на Python, оказалось заметно медленным для больших изображений.