Самохин Роман (roman_samokhin) wrote,
Самохин Роман
roman_samokhin

Category:

Новости велосипедостроения: Action для частотного разложения

Перед тем как перейти к основному описанию, сразу предупрежу, предполагается, что вы уже знакомы с частотным разложением, а в частности, со статьей Андрея Журавлева «Ретушь портрета на основе частотного разложения изображения». Кстати, именно мастер-классы Андрея по частотному разложению и экшенописанию, натолкнули в своё время на идею экшена, речь о котором пойдет ниже.

Что требовалось от экшена?

О частотном разложении уже столько всего написано, и, казалось бы, сложно придумать что-то новое. В интернете встречается множество реализаций этой техники, многочисленные авторские Actions. Каждый из них, хоть в чем-то, но обязательно казался мне неудобным, ограничивал в свободе и с трудом вписывался в привычный рабочий поток. Если коротко, то мне нужен был экшен, который честно разложит на две (а при необходимости и больше) полосы конкретный растровый слой. Не схлопнутую версию изображения, а именно конкретный слой, это важная условие. Такой экшен наверняка оценили бы те, кто занимается коллажированием: в сложной структуре файла, где множество элементов изображения разнесены по разным группам и слоям, очень важно иметь возможность быстро и безболезненно разложить конкретный слой, требующий ретуши. Но даже если ваш файл имеет всего один пиксельный и несколько корректирующих слоёв, то даже в этом случае экшен будет полезен – один клик и нужный слой готов к ретуши, при этом остальные никак не пострадали.

Вот подробный список всего, что хотелось получить от экшена:

  • Недеструктивность. Под этим, в первую очередь, понимаю минимальное вмешательство в послойную структура файла. Вариант, когда для разложения требуется «схлопнуть» изображение (хоть и на отдельном слое), не устраивает. Мы не станем лишать себя удовольствия редактировать корректирующие, растровые или прочие слои, когда они никак не мешают разложению на частоты.

  • Стабильность. Это требование, по сути, обязательно для любого хорошего Action. Он должен работать независимо от локализации Photoshop, названия слоёв или особенностей структуры файла.

  • Скорость. Количество команд и временных слоев, создаваемых экшеном, минимально, а лишние вопросы не задаются. Например, дважды заставлять нас вводить одно и тоже значение радиуса для фильтра Gaussian Blur и High Pass, было бы избыточным беспокойством.

  • Наглядность. В ходе работы экшена должна быть возможность визуализировать подбор радиуса. Причем, в зависимости от ситуации или просто личных предпочтений, кому-то будет удобнее ориентироваться по низкочастотной (размытой) составляющей, а кому-то по высокочастотной составляющей (в том виде, который выдаёт фильтр HighPass). Еще лучше, если сохранится возможность визуализации двумя способами одновременно.

  • Точность. Некоторые реализации разложения работают неоптимально для 8- и 16-битных изображений, также в определенных условиях ошибается фильтр High Pass. Хотя все эти ошибки незначительны и на практике сильных проблем не создают, нам всё же будет приятно если и такие погрешности удастся избежать.


Что получилось, или «инструкция к применению»


Скачать Action

По ссылке находится Set c четырьмя вариациями экшена, как говориться, на вкус и цвет:


Суть у всех четырех сценариев одна, различия только в применяемом фильтре размытия и визуализации подбора радиуса: экшены SF_GaussianBlur и SF_SurfaceBlur при настройке радиуса отображают размытое изображения (НЧ составляющую), а эти же экшены, но с припиской "High_Pass_preview" в названии, будут показывать ВЧ-составляющую, на подобии того, как это делает фильтр High Pass. Примечательно, что даже с экшенами "High_Pass_preview", все равно остается возможность одновременно видеть размытую версию изображения в небольшом окне:

2

Пользоваться всем этим просто: встаем в палитре Layers на слой, требующий ретуши частотным разложением, запускаем любой экшен, подбираем параметры размытия и готово. В результате мы получаем группу, в которой находятся слои с низкочастотной ("Low") и высокочастотной ("High") составляющими, а также копии этих слоёв, предназначенные непосредственно для ретуши ("Low_Retouch" и "High_Retouch"). Плюс к этому добавлен дополнительный слой кривых "High_Contrast_Booster", его удобно включать при работе на слое "High_Retouch", когда требуется подчеркнуть детализацию для более явного отображения недостатков. Получившаяся структура группы сделана по образу и подобию экшена Андрея Журавлева:

3

При желании, слой "Low_Retouch" можно заново разложить на частоты с большим радиусом размытия, в этом случае мы получаем дробление уже не на 2 полосы, а на 3 и больше.

Для ретуши High-cлоя прекрасно подходят Healing Brush Tool, Spot Healing Brush Tool, Patch Tool и Stamp Tool с жесткими краями. Для слоя Low, в принципе, применимо тоже самое, но особенно успешно здесь можно использовать Mixer Brush Tool, Stamp Tool c мягкими границами и сниженной непрозрачностью, или обычную кисть. Настройка Sample, если таковая имеется у инструмента, в этих случаях должна иметь значение Current Layer.

Action предназначен для RGB-файлов, хотя и в CMYK он тоже работает. Оптимизирован для 16-битных картинок, слой можно раскладывать хоть 100 раз подряд, никаких погрешностей расчетов заметно не будет. Локализация и версия фотошопа значения не имеет.
Экшен прост в использовании, но о некоторых нюансах его работы предупредить обязан:

  • выбранный для разложения на частоты слой не должен иметь над собой прикрепленного Clipping Mask-слоя, в противном случае экшен также честно отработает, просто Clipping Mask «отвалится»;

  • маска слоя должна быть пустой (белой), или вообще отсутствовать;

  • непрозрачность слоя 100%, а режим наложения – normal, если это не так, то экшен в ходе работы принудительно изменит непрозрачность и режим наложения копии слоя. Разложение также пройдет честно, но изображения на экране до запуска экшена и после может не совпасть;

  • при подборе радиуса изображение на экране будет отображаться с учетом вышележащих корректирующий слоёв, в общем случае это скорее плюс, но если вам это мешает, например, в случае с HighPass-preview, которое может потерять нейтральность, то можно заранее временно отключить вышележащие слои;

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


После работы экшена, не важно, прошло ли всё правильно или вы прервали его на этапе подбора радиуса, нажав Cancel, всё равно будет создана папка SF, которую вы тут же можете удалить, вернувшись к исходному состоянию файла.

Всё, что нужно знать для пользования экшеном, рассказал, ниже будет описание устройства сценария, которое вряд ли большинству будет интересно, только самым пытливым умам.

[Как экшен устроен?]Как экшен устроен?

Возьмем для примера любой экшен, скажем SF_GaussianBlur, и быстренько пробежимся по шагам, на самых интересных остановимся подробнее.

list

Шаги 1, 3, 4, 5, 6 – обычная "защита от дурака", на всякий случай сбрасывается активное выделение и снимаются Lock’и с копии слоя (если таковые имелись), режим наложения устанавливается в normal, а Opacity=100%. Чтобы экшен срабатывал и на смарт-объектах, дополнительно введено растрирование копии слоя. Для большей стабильности экшена, можно было бы встроить проверку типа слоя, который выбран для разложения (действительно ли он пиксельный?), проверку наличия маски слоя, или текущей цветовой модели документа, но такого типа условия появились в Photoshop недавно, на более старых версиях экшен станет «спотыкаться». Из соображений совместимости сценария проверку вышеперечисленных условий оставил на совести пользователя.

На шаге 2 делается копия исходного слоя, если он имел над собой Clipping Mask, то произойдет автоматический Release Clipping Mask.

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

Не будем терять время на шаги, которые и так очевидны (переходы по слоям, выделение, копирования), а перейдем непосредственно к процессу частотного разложения. На то, чтобы не использовать пару High Pass и Gaussian Blur у меня было несколько причин: во-первых, это необходимость дважды вводить радиус размытия (об этом уже вспоминали выше), во-вторых, невозможность использования фильтра размытия, отличного от Gaussian Blur, и в-третьих, всё та же пресловутая ошибка High Pass. Какие еще есть варианты? Команда Apply Image, при её использовании, низкочастотную составляющую мы можем получить любым фильтром из группы размытия (и не только размытия, например Median, Dust & Scratches), а высокочастотную составляющую вычислить честным вычитанием из исходного слоя. И всем Apply Image хорош, но в экшене он может сыграть злую шутку: проблема в том, что однозначно выбрать можно только слой Merged, а это, согласно требованиям к экшену, нам не подходит. При выборе слоя, отличного от Merged, его имя жестко запишется в сценарий, и если это название слоя уже повторяется в структуре файла (например после нескольких запусков экшена), то для Photoshop возникает неопределенность – какой именно из слоев с одинаковым названием выбрать для смешивания? «Это слабое место Apply Image, и дабы сохранить стабильность экшена, от данной команды придется отказаться», - именно так я рассуждал, когда мысленно отбросил Apply Image и искал другой способ разложения на частоты. Но когда я понял, что с Apply Image всё-таки можно стабильно работать, было поздно: экшен готов, а переделывать совсем не хочется. Теперь собственно о том, как конкретно реализовано частотное разложение в этом экшене. Вся суть заключается в вычислении низкочастотной составляющей на слоях, сделать это можно создав, к примеру, такую структур:

4

"Source_Copy (Temp)" здесь это неразмытый исходный слоя, а "Low (Temp)" – слой инвертированный и размытый (на шаге 10) в режиме наложения Add. Чтобы эта последовательность слоёв после сложения представляла из себя низкочастотную составляющую (High-слой), её нужно доработать кривыми (слои "Scale_Offset (Temp)"). Так как итоговый High-слой в последствии будет накладываться в режиме Linear Light, то вся детализация, представленная в виде отклонений яркости, должна «вращаться» вокруг средне-серого, а контраст понижен в два раза (для компенсация удвоения контраста, заложенного в Linear Light). В Apply Image такая коррекция в паре с режимом наложения Subtract реализуется параметрами Offset=128, Scale=2. Наши две кривые "Scale_Offset (Temp)", имитирующие эту же коррекцию, приняли бы вид:

5

Черная точка опущена на 128 – контраст понижен в два раза, а отклонения яркостей на итоговом High-cлое станут откладываются от 128. Но проблема в том, такая коррекция идеально подойдет только для 8-битных изображений. Средне-серый цвет у 16-битных изображений, а именно для таких в первую очередь рассчитан экшен, не выражается 8-битным значением 128. Именно поэтому частотное разложение в Apply Image через Subtract: Offset=128, Scale=2 даёт небольшую погрешность на 16-битных картинках, тогда как на 8-битных работает прекрасно. Средне-серый в 16 битах можно было бы записать как 127.5, но дробные значения нельзя вводить ни в Apply Image, ни в интерфейсе кривых. Если в Apply Image из этой ситуации выходят использованием режима Add, то при раскладывании на слоях к нам на помощь приходит параметр Opacity. Посмотрим как это работает на примере:

7

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

8

Сдвиг черной точки вниз до значения 1 и Opacity=50% дают нам желаемый эффект аналогичного сдвига черной точки до 127,5. Именно такая комбинация непрозрачности и формы кривой используется в слоях "Scale_Offset (Temp)", что позволяет экшену очень точно раскладывать 16-битные изображения. Для 8-битных картинок можно было бы сделать отдельный экшен, сначала я так и поступил, но потом осознал бессмысленность затеи: те, кто обрабатывают картинки в 8 битах, вряд ли сильно задумываются о погрешностях разложения, а от 2-3 запусков экшена и так ничего страшного не случиться.

Напоследок еще нужно упомянуть, как сделан предпросмотр ВЧ-слоя при подборе радиуса в экшенах «High_Pass_preview». Про этот способ мне напомнил deffar, а впервые про него услышал от Евгения Карташова на мастер-классе Андрея Журавлева. Хитрость заключается в том, что на момент вызова фильтра размытия, мы создаём такую структуру:

9

где, "Source_Copy (Temp)" - исходный неразмытый слой, а слой "Low", подвергаемый размытию, инвертирован и накладывается в режиме normal с 50% непрозрачностью на исходник. Слой "High_Contrast_Boost" не обязателен, он просто увеличивает контраст деталей на средне-сером фоне, что делает подбор радиуса более комфортным. Инвертирование слоя "Low" применено не напрямую, а через корректирующий слой "Invert (Temp)", это сделано для того, чтобы в маленьком окошке предпросмотра фильтра размытия мы могли видеть неинвертированное изображение.

Казалось бы, используя эту последовательность слоёв, мы также получаем высокочастотную составляющую, причем эта структура не в пример проще той, что описана выше (через режим Add и хитрые слои кривых). Но, как оказалось, этот способ прекрасно подходит только для предпросмотра, а в качестве High-слоя при честном разложении почему-то получается заметная погрешность, причем как в 8, так и в 16 битах.

На этом всё. Пробуйте экшен, комментируйте, спрашивайте.
Tags: action, photoshop
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.
  • 15 comments