GIMP: фильтр Balance

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

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

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

Фильтр «Balance».

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

O = \begin{cases} {I * F / 128} & {I \le 128} \\ {255 - (255 - I) * (255 - F) / 128} & {I > 128} \end{cases}» src=«https://habrastorage.org/getpro/habr/upload_files/eaa/6bc/96e/eaa6bc96ef4018025c7ccf18535dfabf.svg» /><p>где O — результат наложения, I — исходный слой, F — накладываемый слой.</p><p>Данное наложение используется в фильтре четыре раза.</p><p>Проиллюстрирую работу филтра поэтапно на примере изображения «Лена».</p><img src=
Исходное изображение «Лена»

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

«Гауссово размывание» радиусами 25×25

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

«Гауссово размывание» радиусами 50×50

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

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

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

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

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

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

Сравнение.

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

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

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

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

Эпилог.

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

Habrahabr.ru прочитано 6177 раз