Как из чёрно-белого фото сделать цветное

Дмитрий Маштаков
  Сделать из чёрно-белого фото цветное - нет проблем. Существует масса программ, которые делают это. Но у меня был к этой теме свой собственный чисто исследовательский интерес.
  Прочёл я, что в Фотошопе для такого преобразования есть специальный фильтр. Как с ним работать - объясняют. А вот что в нём такого специального, не совсем понятно. Вероятно, специфика есть. Вот я и подумал, а не сделать ли мне такое же и в своей программе? Заодно вникну и поучусь.
 
  Оказалось, что красить фото целиком не получается. Добавишь светлую краску - светлые фрагменты фото выглядят достойно, однако тени неестественно светлы. Сделаешь лессировку, свет потемнеет, а тени почти не изменятся в цвете. Опять не то.
А что же нужно?

  Нужно, чтобы при изменении цвета, во всех местах картинки сохранились как видимая локальная светлота тона, так и контраст изображения. Используем для этого следующий алгоритм.
1. Выбираем цвет, в который будем окрашивать изображение.
2. Находим его RGB компоненты и нормируем их на единицу. То есть, попросту делим на число 255.
3. Находим светлоту тона как сумму A=R+G+B
4. Затем перебираем все пиксели в зоне преобразования. Считываем их цвет и определяем светлоту тона Ao=Ro+Go+Bo. Находим показатель степени, как отношение логарифмов – Z=Log(Ao)/Log(A). И затем находим компоненты нового цвета, перевычисляя их по формулам
    R=R^Z: G=G^Z: B=B^Z
Полученным цветом окрашиваем пиксель.

  Математики заметят, что мои вычисления не вполне корректны – то же значение светлоты тона мы гарантировано получим только в том случае, если компоненты цвета равны между собой, то есть, только тогда, когда и новый цвет серый. Однако практика показывает, что такое вычисление вполне приемлемо.

  На иллюстрации вы можете видеть, что описанный алгоритм даёт в точности такие же результаты, что и Фотошоп. Потому я и думаю, что и там алгоритм именно такой. Цвета получаются естественные, и их при желании можно разнообразить, как угодно.
  Для выполнения тонирования мы должны установить опцию «ф» на кнопке фильтры и нужную «Плотность» - степень покрытия новым цветом старого.
Цифра 9 это максимальное значение, оно означает полную замену серого тона цветным. Затем мы обозначаем область преобразования, кликнув по её диагональным углам, и подбираем с помощью палитры подходящий цвет.
  Цвет BGR 146 171 206 это телесный цвет. Неважно, светлый он или тёмный, главное, чтобы казался именно телесным. Программа учтёт его конкретную светлоту и сама всё пересчитает.

  Запускаем процесс кликом по кнопке «Ц».
  Область прямоугольная, мы обозначили её с избытком. Потому и получили прямоугольник телесного цвета большого размера. Теперь включаем «синий ластик» и убираем лишнее, счищая незакреплённую графику. Результат на всякий случай запоминаем на «поле_6».
  Теперь кликами обозначаем другую область, выбираем другой цвет, и повторяем процесс. Используя то же выделение,  и кликая по кнопкам «Т» или «С», можно темнить или светлить изображение. И так же счищать синим ластиком лишнее или то, что не понравилось.
  Неплохо также забрасывать начальное или промежуточное изображение на «поле_2». Ластик розового цвета будет переносить изображение с «поля_2» на поле нашего рисунка. В общем, работать легко и удобно. И мне даже показалось, что удобнее, чем в Фотошопе.

  Онлайн сервисы с искусственным интеллектом не советую. Раскрашивание картинок это творческая работа. Искусственному интеллекту не растолкуешь всего того, что собственно Вам от преобразования нужно.

__________
19.09.2021