Йожык вне тумана (youzhick) wrote,
Йожык вне тумана
youzhick

Резче, еще резче

Cнова занялся умышленной порчей картинок (первая серия, если кто пропустил, была здесь).

На этот раз препарируем многократный шарпенинг, то бишь увеличение резкости. Вообще, многократное шарпление картинки - это то, чего нужно избегать всеми возможными способами. Но если возможных способов не осталось... то велкам под кат.

Сначала я хотел забабахать здоровенный теоретический пост о работе линейных фильтров вообще и шарпенинга в частности, но потом понял, что математику никто читать не будет, да и вообще лень :) Так что, ниже будет лишь несколько общих слов и ОЧЕНЬ много тестов. Не уверен, что это действительно кому-то нужно, но, пожалуй, интересно.




Для начала несколько оговорок:

Во-первых, речь пойдет только о монохромных изображениях; в случае цветных - за редкими исключениями - каждый канал можно обрабатывать как независимую Ч/Б картинку. Иное относится либо к очень замороченным кустарным методам, либо к автоматике, которая работает лишь в частных случаях и почти никогда не встраивается в широко распространенные графические пакеты.

Во-вторых, не пытайтесь оценивать тестовые картинки по уменьшенным версиям. Резкость живет в деталях, поэтому открывайте сразу увеличенные изображения - где они есть по клику. Для графиков это не столь принципиально - важные и так будут приведены в 100% масштабе.

Ну, и в-третьих, примеров внизу действительно МНОГО. Маньяки вроде меня могут, конечно, изучить все, но остальным думаю, достаточно будет рассмотреть несколько особо выбивающихся, и, найдя среди приведенных свой любимый способ увеличения резкости - посмотреть тесты именно для него.



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

"Естественное" восстановление резкости или четкости изображения должно бы происходить путем сужения области перехода. Как-то так:

(все графики приведены для одномерного изображения: координата пикселя по горизонтали, яркость по вертикали)


На первом шаге резкость увеличилась немного. Этого показалось мало - ее увеличили еще. Потом еще, и еще, пока, наконец, переход не стал достаточно четким. Так должно было бы выглядеть идеальное увеличение резкости. К сожалению, алгоритмы, реализующие подобную обработку, можно построить лишь для некоторых частных случаев; для абстрактной же картинки - приходится искать иные подходы.

При всем богатстве инструментов, все распространенные способы увеличения резкости являются вариациями применения нерезкой маски (Unsharp Mask). Суть проста до гениальности: из домноженного на некоторую константу значения яркости пикселя вычитается взвешенная сумма яркостей в некоторой его окрестности (весовая функция для суммируемых пикселей обычно берется гауссовой, что, впрочем, не обязательно). Результат понятен: в местах переходов яркости появляются горбы и впадины, визуально увеличивающие "крутизну" переходов.

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


Важно, что результат является не прямым устранением размытия, а искажением картинки, обманывающим зрение. Вместо одного плавного перехода появляется тройка: один усиленный и два почти незаметных. Если же процедуру повторить, т.е. попытаться отшарпить изображение, по которому уже прошлись нерезкой маской, "улучшению" подвергнутся уже все три новых перехода, а не только центральный, заменивший оригинал:



Заметно отличается от "идеального" шарпенинга выше, правда? Впрочем, замечу еще раз, что речь идет о повторном увеличении резкости. Однократная операция подобного результата не даст ни при каких параметрах.

Вторая врожденная проблема нерезкого маскирования - шум. Отличить реальный переход яркости от шумового сложно, да и вообще не всегда возможно. При формальном же "лобовом" применении маски ни о каком различении речи вообще не идет. Единственная надежда на то, что ширина шумовых переходов отличается от реальных, а нерезкая маска весьма избирательна в том, что касается силы воздействия: под переходы разной ширины надо подбирать разные радиусы размытия маски.


Ладно, перейдем от абстракции к живому фотошопу. Напомню основные способы увеличения резкости:

1. Unsharp mask
Фильтр, реализующий классический метод нерезкого маскирования. Позволяет играться радиусом размытия маски и силой воздействия. Кроме того имеет ползунок Threshold, определяющий пороговое значение - минимальную величину перепада яркости, которая подвергается обработке. Крайне полезное дополнение к классике.

2. Smart Sharpen
Детали алгоритма лично мне неизвестны, но по идее, тоже вариация нерезкой маски. Порога чувствительности здесь нет, зато есть раздельный контроль шарпенинга в светах и в тенях.

3. High Pass + контрастное наложение.
Наиболее гибкий метод. Слой изображения дублируется, обрабатывается фильтром High pass и затем накладывается в режиме Overlay или Soft light. Радиус хай пасса здесь аналогичен радиусу нерезкой маски, а сам накладываемый слой содержит "карту" увеличений и уменьшений яркости изображения. Ноль у этой карты находится на уровне среднего серого (128, 128, 128). Соответственно, есть возможность редактирования самой карты: играясь кривыми для слоя-карты можно реализовать и раздельный контроль светов/теней, и дополнительное увеличение эффекта, и еще много чего.

Не поленюсь еще раз напомнить, что лучше обойтись единственной операцией увеличения резкости (причем, выполняемой в самом конце работы над картинкой). Но если результат все равно не устраивает, можно процедуру повторить.
Для Unsharp mask и Smart sharpen способ "повторения" всего один, с хай пассом же возможны вариации:
- (самый вменяемый метод) продублировать уже имеющийся слой-карту;
- (для нарывающихся на неприятности) создать новый слой-карту для уже отшарпленного изображения, т.е. слить слои и снова создать копию с хай пассом;
- (для особых извращенцев гурманов) попытаться отшарпить слой-карту. Т.е. продублировать слой с хай пассом, и снова натравить на него тот же хай пасс.


Все, закончили лирику, дальше будут пытки картинок. Для истязаний я взял фотографию рассвета с горы Моисея:



Удобно различимые переходы и небольшое количество шума. Переводим в Ч/Б, и начинаем множественно шарпить с особым цинизмом. Реально полезными будут представления на графиках дальше, но и на виды терзаемой картинки посмотреть тоже интересно, так что для начала приведу их.

Перебрать все варианты настроек, конечно, невозможно, поэтому для каждой картинки я буду указывать, что именно делалось, а числа на самих картинках - что, думаю, очевидно - число итераций шарпенинга.
Радиусы я выставлял 0.7 и 2.0 - те, для которых сам могу представить вменяемое использование на приведенной картинке.
Поехали.

(Картинки уменьшены; полные - по клику)


High Pass (Radius: 0.7) + Overlay
Повторение: дублированием слоя с хайпассом.



High Pass (Radius: 0.7) + Overlay
Повторение: повторный High pass слоя с предыдущим high pass'ом.


High Pass (Radius: 0.7) + Overlay
Повторение: шарпенинг уже слитой картинки (с Flatten после каждого наложенного high pass'а).


High Pass (Radius: 0.7) + Soft Light
Повторение: дублированием слоя с хайпассом.


High Pass (Radius: 0.7) + Soft Light
Повторение: повторный High pass слоя с предыдущим high pass'ом.


High Pass (Radius: 0.7) + Soft Light
Повторение: шарпенинг уже слитой картинки (с Flatten после каждого наложенного high pass'а).


High Pass (Radius: 2.0) + Overlay
Повторение: дублированием слоя с хайпассом.


High Pass (Radius: 2.0) + Overlay
Повторение: повторный High pass слоя с предыдущим high pass'ом.


High Pass (Radius: 2.0) + Overlay
Повторение: шарпенинг уже слитой картинки (с Flatten после каждого наложенного high pass'а).


High Pass (Radius: 2.0) + Soft Light
Повторение: повторный High pass слоя с предыдущим high pass'ом.


High Pass (Radius: 2.0) + Soft Light
Повторение: шарпенинг уже слитой картинки (с Flatten после каждого наложенного high pass'а).


Smart Sharpen (Галка "More Accurate" включена, разделения светов и теней нет)
Amount: 100%
Radius: 0.7


Smart Sharpen (Галка "More Accurate" включена, разделения светов и теней нет)
Amount: 500%
Radius: 0.7


Smart Sharpen (Галка "More Accurate" включена, разделения светов и теней нет)
Amount: 100%
Radius: 2.0


Smart Sharpen (Галка "More Accurate" включена, разделения светов и теней нет)
Amount: 500%
Radius: 2.0


Unsharp Mask
Amount: 100%
Radius: 0.7
Threshold: 0


Unsharp Mask
Amount: 100%
Radius: 0.7
Threshold: 3


Unsharp Mask
Amount: 500%
Radius: 0.7
Threshold: 0


Unsharp Mask
Amount: 100%
Radius: 2.0
Threshold: 0


Unsharp Mask
Amount: 100%
Radius: 2.0
Threshold: 3


Unsharp Mask
Amount: 500%
Radius: 2.0
Threshold: 0



Вот такая петрушка.
Выше было прикольно, а теперь - по делу.

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




Получается довольно показательное одномерное изображение:




Поскольку скорость убивания картинки при разных подходах отличается очень сильно, я попытался подобрать для каждого случая количество итераций, соответствующее более-менее одинаковому усилению центрального перепада яркостей на вершинах гор.
Сравнивать картинки выстроенные рядом не слишком удобно, так что если какую-то пару интересно сравнить друг с другом или с оригиналом - лучше открыть их отдельно в других окнах/вкладках и поперещелкивать вид.


Итого, для приведенных выше рядов картинок:










































Если же суммировать все результаты:
- Smart Sharpen для многократного увеличения резкости непригоден абсолютно.
- Unsharp Mask очень надежен при правильно подобранном пороге, но без подбора порога им тоже лучше не пользоваться.
- High Pass с контрастом наименее подвержен появлению страшных артефактов при многократном шарпенинге. Причем Soft Light дает меньшее усиление шума, чем Overlay даже при одинаковой степени усиления основных переходов. Это, впрочем, ожидаемо: с учетом слабости воздействия Soft light'а повторная дискретизация яркости работает почти как порог в Unsharp mask.
Да, и в большинстве случаев повторное увеличение резкости через хай пасс делать лучше дублированием слоя-карты (вопреки моим ожиданиям, именно в большинстве случаев, а не всегда).

А еще лучше - обходиться-таки без многократного шарпенинга. И да пребудет с вами резкость!
Tags: Заметки
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 8 comments