Матчинг гистограмм: метод доменной адаптации
Матчинг гистограмм — это полезный метод из классического CV и один из методов доменной адаптации. Суть метода заключается в изменении гистограммы изображения таким образом, чтобы она соответствовала гистограмме другого изображения или желаемой гистограмме.
Такой метод может быть полезен для аугментации. В albumentations есть реализация этого метода: HistogramMatching
. Он окажется нужным, когда у вас не хватит картинок из какого-нибудь домена, а вы захотите быстро набрать побольше похожих картинок.
Например, у вас в датасете много фотографий в светлом помещении, а на проде внезапно появились фото в темном помещении. Вы берете матчинг гистограмм, превращаете некоторые светлые картинки из датасета в темные, добавляете себе в сет и переобучаете модель! Это, конечно, будут не трушные размеченные данные с камер, но зато быстро и дешево 🙂
Гистограмма и CDF
Вспомним, что такое гистограмма изображения. Сначала рассмотрим Изображение 1 с пикселями яркостью в диапазоне [0, 3]:
Нам также понадобится функция распределения (CDF, или cumulative distribution function):
Эквализация, или выравнивание гистограммы
Это частный случай матчинга гистограмм. В случае эквализации мы матчим не на любую гистограмму, а на гистограмму равномерного распределения.Получили таблицу для эквализации Изображения 1
Почему именно такая формула? Это связано с тем, что мы маппим именно на равномерное распределение. Более подробно можно прочитать в книге “Цифровая обработка изображений” Р. Гонсалеса (“3.3.1. Эквализация гистограммы”)
Применим получившийся маппинг и получим эквализованное изображение 1:
Алгоритм матчинга
- Эквализуем гистограмму изображения 1;
- Эквализуем гистограмму изображения 2;
- Формируем таблицу матчинга и матчим 🙂
Рассмотрим Изображение 2 и нарисуем CDF Изображения 1 и 2 вместе:
Эквализуем гистограммы этих двух изображений и найдем маппинг между исходным и эквализованным изображениями:
Составим общую таблицу значений яркости пикселей и найдем матчинг из CDF Изображения 1 в CDF Изображения 2:
Можно не делать эквализацию, а матчить значения CDF напрямую. На графике это выглядит так:
В итоге мы получим Изображение 1, сматченное на Изображение 2:
Замечания
Зачем мы вообще делаем эквализацию, если можно матчить CDF напрямую?
Эквализация может улучшить результат матчинга. Особенно важно это в том случае, если изображения слишком разные по контрасту и яркости.
А как быть с цветными картинками?
Цветные картинки матчат либо каждому каналу отдельно, либо с использованием единой таблицы матчинга для всех каналов. Этот единый матчинг получается из изображений, переведенных в GrayScale.