Сохранить ч/б изображение в оттенках двух цветов с помощью Pillow

Есть черно-белое изображение. Я хотел бы сохранить его в оттенках двух цветов, чтобы вместо оттенков от чёрного до белого были оттенки от фиолетового до розового. Какой метод и как использовать для обработки? colorize?


Ответы (1 шт):

Автор решения: Serge3leo

Вариантов много, поскольку вопрос недостаточно формализован.

Один из них: интерполировать между фиолетовым и розовым в зависимости от яркости, т.е. от положения между чёрным и белым. Правда, надо ещё выбрать в какой цветовой системе делать таковую интерполяцию, пусть будет RGB.

from collections import namedtuple
import numpy as np
from PIL import Image, ImageOps

che = ImageOps.grayscale(Image.open("Guerrillero Heroico.jpg"))
violet = np.array((105, 0, 198))
pink = np.array((255, 192, 203))
grey = np.asarray(che)
vpche = Image.fromarray(np.uint8(
            violet + np.einsum('ij,k', grey,
                               (pink - violet) / np.iinfo(grey[0, 0]).max)
            ))

Альтернативный вариант, сфокусироваться на слове "оттенки", и получить картинку, скажем, в градациях фиолетового. Для чего удобнее взять фиолетовый цвет в HSV:

hsv = namedtuple('hsv', 'H S V')
hsv_violet = hsv(272., 100., 78.)

vche = Image.merge('HSV', (
            Image.fromarray(np.full(che.size[::-1], hsv_violet.H*256/360, np.uint8)),
            Image.fromarray(np.full(che.size[::-1], hsv_violet.S, np.uint8)),
            che
        )).convert('RGB')

Полный пример кода, результаты и возможность поиграться на Colab или github.dev (Codespaces): https://github.com/Serge3leo/temp-cola/blob/main/ruSO/1616847-Фиолетово-розовый/Фиолетово-розовый.ipynb

P.S.

Можно сфокусироваться на "двух цветах" и предложить человеческому глазу интерполировать так, как ему удобнее, получив результат с использованием пикселов только двух заданных цветов в технике псевдосмешения цветов (dithering). Т.е. в зависимости от яркости менять соотношение плотности пикселов.

→ Ссылка