Сообщить об ошибке.

Тонирование черно-белого фото модулем Pillow в Python

Функция ImageOps.colorize() модуля Pillow в Python

Синтаксис:

from PIL import ImageOps

ImageOps.colorize(image, black, white, mid=None, 
                  blackpoint=0, whitepoint=255, midpoint=127)

Параметры:

  • image - объект изображения для обработки. Изображение должно быть черно-белым в градациях серого. Обесцветить можно, изменив режим изображения на L. Например, Image.convert('L').
  • black - цвет, который будет использоваться для черных входных пикселей.
  • white - цвет, который будет использоваться для белых входных пикселей.
  • mid=None - цвет, используемый для полутоновых (серых) входных пикселей.
  • blackpoint=0 - значение int в диапазоне [0, 255] для отображения черного цвета.
  • whitepoint=255 - значение int в диапазоне [0, 255] для отображения белого цвета.
  • midpoint=127 - значение int в диапазоне [0, 255] для отображения полутонов.

Возвращаемое значение:

  • объект изображение Image.

Описание:

Функция ImageOps.colorize() модуля Pillow раскрашивает/тонирует черно-белое изображение (должно быть в градациях серого). Например, на черно-белую фотографию можно наложить сепию (сделать фото под старину).

Эта функция вычисляет цветовой клин, который сопоставляет все черные пиксели исходного изображения с первым цветом black, а все белые пиксели - со вторым цветом white.

Если указан необязательный аргумент mid, то получится трехцветное отображение. Аргументы black и white должны быть кортежами RGB или строками цветовых хешей (например '#eeeeee').

Можно указать позиции отображения для любого из цветов (например, blackpoint). Эти аргументы представляют собой целое значение, соответствующее месту, где должен быть отображен соответствующий цвет. Эти аргументы должны иметь логический порядок, такой, чтобы blackpoint <= whitepoint <= midpoint (если указан аргумент mid).

Грубо говоря про аргументы можно думать так: black, white, mid отвечают за новый цвет, который примет оттенок blackpoint=0, whitepoint=255 и midpoint=127 соответственно. Значения аргумента black будет распространяться от blackpoint=0 до значения 126, а значения mid будет распространяться ему навстречу от midpoint=127 до значения 1 и они будут смешиваться. Значение white будет распространяться и от whitepoint=255 до значения 128 и mid также распространяется в сторону white, где они будут тоже смешиваться.

Пример тонирования черно-белого изображения.

from PIL import ImageGrab, ImageOps
import time

# делаем задержку в 2 секунды на выбор 
# окна, для которого нужно сделать скриншот
time.sleep(2)
# создание скриншота
img_tmp = ImageGrab.grab()
# обесцвечиваем изображение с оттенками серого
img_tmp = ImageOps.grayscale(img_tmp)
# сохраним для сравнения
img_tmp.save('test.jpg')    

# накладываем сепию black='#523224' - это значит, что
# цвет '#523224' будет распространяться от `blackpoint=0`
# до `whitepoint=254` постепенно ослабевая, т.к. ему на встречу 
# распространяется white='#ffffff' от `whitepoint=255` до значения 1
im = ImageOps.colorize(img_tmp, black='#523224', white='#ffffff')
# сохраняем
im.save('test_colorize-0.jpg')

# изменим точку вхождения черного цвета blackpoint=80.
# это значит, что палитра от 0 до 80 примет цвет #523224 
# и останется без изменений
im = ImageOps.colorize(img_tmp, black='#523224', white='#ffffff', blackpoint=80)
# сохраняем 
im.save('test_colorize-1.jpg')

# раскрасим картинку в 3 цвета
im = ImageOps.colorize(img_tmp, black='#0000ff', white='#ffff00', mid='#ff0000')
# сохраняем
im.save('test_colorize-2.jpg')