Pull to refresh

Окрашивание изображений

Reading time 2 min
Views 57K

Здравствуй, Хабрахабр. Сегодня мы будем раскрашивать.
Что здесь будет? Будет поиск цветного изображения со схожими цветами по черно-белому и метод переноса цвета с первого на второе.

Поиск цветного изображения


Что у нас есть? Допустим, у нас есть куча цветных изображений и одно черно-белое, мы хотим из этой кучи выбрать одно, которое по цветам лучше всего подходит нашему черно-белому (если бы они, цвета, у него были). Каждое изображение на выборах будет представлять его сигнатура.

Сигнатура — это 128 чисел с плавающей запятой, они получаются из гистограммы канала l (яркость) изображения (из цветовой модели lab), нормализованной к единице, то есть сумма всех 128 чисел равна единице (нормализация нужна для того, чтобы убрать влияние размера изображения на сигнатуру). Схематично получение сигнатуры изображения выглядит так:


Подобный подход описан в [2], там есть и другие варианты сигнатур и экспериментальные результаты. Теперь у каждого цветного изображения есть сигнатура, и у черно-белого она тоже есть, как мы выберем изображение? Вычислим корреляцию между сигнатурой нашего бесцветного подопытного и цветных кандидатов, по наибольшему значению получим победителя. Корреляция, кстати, вычисляется вот так:




Здесь H1 и H2 — сигнатуры, N=128 — число элементов сигнатуры. Если d=1, то максимальное совпадение, -1 – максимальное различие, 0 – нет корреляции. Спасибо за замечание Assorium, вычитаемое действительно равно 1/128 в данном случае.
На этом этапе у нас уже есть черно-белое изображение и изображение-источник цвета, назовем его так. На первой картинке это левое и правое изображения, осталось получить центральное.

Перенос цвета с цветного на черно-белое


Этапы переноса цвета следующие:
1. Накладываем на изображение-источник цвета сетку 15х15, в каждой ячейке берем случайный пиксель (это называется jittered sampling)
2. Рассматриваем окрестность это пикселя в размере 25х25, вычисляем математическое ожидание и дисперсию (работаем с каналом l).
После первых двух шагов мы получаем с цветного изображения 225 образцов цвета, каждый из которых характеризуется следующим: двумя значениями каналов a и b; мат. ожиданием и дисперсией.
15х15 и 25х25 получены в ходе экспериментов.
3. Попиксельно обходим наше черно-белое изображение, вычисляем дисперсию и мат. ожидание, сравниваем с образцами, с наиболее подходящего образца переносим значения цветовых каналов a и b.

Этот метод придумал Welsh с товарищами, подробнее можно почитать у него [1].

В результате этих нехитрых манипуляций получаются вполне себе цветные картинки:



Ну и как же без рыжего кота:


Выводы


Ну, достоинства тут очевидны, руками ничего не делаем, все само красиво происходит, а недостатки? Для изображений, где основных тонов не два-три, а много больше, результаты могут получиться сильно неадекватные, устраняется это очень просто на словах и очень сложно на деле: применение распознавания, например, при использовании метода SURF и контурного анализа для поиска машинки, можно вместо:



получить гораздо более правдоподобную картину:



но это уже совсем другая история.

P.S.


Я буду крайне признателен за альтернативные подходы к окрашиванию в комментариях, хотя бы на уровне идей.

Использованные источники:
1 Welsh, T., Transferring color to greyscale images
2 Vieira, L. F. M. at al. Fully automatic coloring of grayscale images
Tags:
Hubs:
+120
Comments 60
Comments Comments 60

Articles