В практике обработки изображений часто встают задачи различных выравниваний цветовых компонент этих самых изображений. И в первую очередь это касается яркостной составляющей изображений. К этим задачам относится такой фильтр как Retinex. Этот фильтр хорошо выравнивает яркостную составляющую изображения, но беспощадно искажает соотношение цветовых составляющих - картинка становится "кислотной".

Для нужд STEX (ScanTailor-Experimental) была поставлена задача разработки фильтра, производящего выравнивание яркостной составляющей, но щадящей цвет. Это необходимо для вытягивания слабовыраженных контуров, не поддающихся отрисовке ни одним из имеющихся в STEX порогов без доп. префильтрации с сохранением гармоничности цветных иллюстраций.

Данный фильтр разрабатывался в GIMP и был реализован в STEX для яркостной компоненты, а позднее в виде CLI утилиты stbibalance на базе STB в полноцветовом исполнении.

Фильтр "Balance".

Действие фильтра определяется наличием двух слоёв (двух значений) с одинарным и двойным радиусом размытия. Разница между этими двумя слоями применяется не напрямую, а через систему наложений "Перекрытие" ("Overlay"). Наложение "Перекрытие" можно выразить следующей формулой:

O = \begin{cases} {I * F / 128} & {I < 128} \\ {255 - (255 - I) * (255 - F) / 128} & {I \ge 128} \end{cases}

где O - результат наложения, I - исходный слой, F - накладываемый слой.

Данное наложение используется в фильтре четыре раза.

Проиллюстрирую работу фильтра поэтапно на примере изображения "Лена".

Исходное изображение "Лена"
Исходное изображение "Лена"

Копирую исходный слой дважды. На первой копии применяю "Гауссово размывание" одиночного радиуса (25).

"Гауссово размывание" радиусами 25x25
"Гауссово размывание" радиусами 25x25

На второй копии применяю "Гауссово размывание" двойного радиуса (50).

"Гауссово размывание" радиусами 50x50
"Гауссово размывание" радиусами 50x50

Копирую эти два слоя, чтобы получились две пары этих слов, но с разным порядком следования. В каждой паре исходный (нижний) слой "Инвертирую нелинейно"

"Инвертировать нелинейно"
"Инвертировать нелинейно"

и накладываю второй слой пары режимом "Перекрытие".

Наложение "Перекрытие" первой пары слоёв
Наложение "Перекрытие" первой пары слоёв
Наложение "Перекрытие" второй пары слоёв
Наложение "Перекрытие" второй пары слоёв

Накладываю в режиме "Перекрытие" полученные два слоя последовательно на исходный слой. Это и будет результатом действия фильтра "Balance".

Результат фильтра "Balance"
Результат фильтра "Balance"

Сравнение.

Для сравнения посмотрим, как проявит себя порог на исходном и отфильтрованном изображении. Применим "Порог" к исходному слою с автоматическим определением значения порога (кнопка "Авто").

Автоматический "Порог" исходного слоя.
Автоматический "Порог" исходного слоя.

Таким же образом применим "Порог" к фильтрованному слою.

Автоматический "Порог" фильтрованного слоя.
Автоматический "Порог" фильтрованного слоя.

Эпилог.

Для удобства применения всех этих нудных операций, я сделал SCM-скрипт: Gimp Balance filter Plugin. Добавляется пункт в меню "Цвет" -> "Авто" -> "Balance".

Комментарии (0)