Я использую Python Imaging Library, чтобы раскрасить черно-белое изображение с помощью таблицы поиска, которая определяет отношения цвета. Таблица поиска - это всего лишь 256-элементный список кортежей RGB:
>>> len(colors)
256
>>> colors[0]
(255, 237, 237)
>>> colors[127]
(50, 196, 33)
>>>
Моя первая версия использовала методы getpixel()
и putpixel()
:
for x in range(w):
for y in range(h):
pix = img.getpixel((x,y))
img.putpixel((x,y), colors[pix[0]])
Это было ужасно медленно. Отчет A profile
указывал на методы putpixel
и getpixel
в качестве виновников. Небольшое исследование (т.е. Чтение документов), и я нахожу "Обратите внимание, что этот метод относительно медленный". re: putpixel
. (фактическое время выполнения: 53 с в putpixel
и 50 с getpixel
для изображения 1024x1024)
Основываясь на предположении в документах, я использовал im.load()
и прямой доступ к пикселям:
pixels = img.load()
for x in range(w):
for y in range(h):
pix = pixels[x, y]
pixels[x, y] = colors[pix[0]]
Обработка ускоряется на порядок, но все еще медленная: около 3,5 секунд для обработки изображения 1024x1024.
Более тщательное изучение документов PIL, по-видимому, указывает, что Image.point()
точно предназначено для этой цели:
im.point(table)
= > изображение
im.point(function)
= > изображениеВозвращает копию изображения, в котором каждый пиксель был сопоставлен в данной таблице. Таблица должна содержать 256 значений для диапазона в изображении. Если вместо этого используется функция, она должна принимать один аргумент. Функция вызывается один раз для каждого возможного значения пикселя, и результирующая таблица применяется ко всем полосам изображения.
Я потратил некоторое время на хакерство с интерфейсом, но, похоже, не совсем правильно понял. Простите мое невежество, но документы PIL короткие, и у меня мало опыта обработки изображений. Я немного поработал с поиском, и я привел несколько примеров, но ничего, что сделало использование "click" для меня. Таким образом, наконец, мои вопросы:
- Является ли
Image.point()
правильным инструментом для этого задания? - Какой формат/структура
Image.point()
ожидает таблицу? - Может ли кто-то выполнить примерную реализацию? На каждой итерации, которую я пробовал до сих пор, оказалось прямое черное изображение.