Задача, которую мы с вами будем сегодня решать, формулируется так:
Как проявить фактуру на более-менее однородных поверхностях (например на стенах зданий), но при этом не испоганить все остальное изображение, при этом сведя к минимуму ручную работу кисточкой.
Говоря языком фотошопа, нам нужно получить такую маску, которая скрывала бы детали изображения прямо пропорционально их контрастности.
Для решения подобной задачи пользователи довольно часто прибегают к помощи тонмапперов типа фотоматикса, поскольку тонмаппер как раз и занимается разгоном локального контраста (более подробно про это можно почитать в моей статье про
Exposure Fusion).
Однако, как вы все понимаете, любые автоматические алгоритмы уступают по качеству продуманной работе в фотошопе.
Размышляя над поставленным вопросом, я пришел к выводу, что решение данной проблемы лежит примерно в той же плоскости, что и алгоритм частотного разложения, любезно открытй публике
zhur74, однако после нескольких неудачных попыток с фильтром Hi-Pass я решил действовать несколько иначе.
Для начала стало понятно, что подобную маску нужно получать из разности (в терминах режимов наложения) между каналом L изображения вообще без шарпенинга и им же, но уже изображения с шарпенингом, причем очень сильным, дабы она (разность) как следуют проявилась.
Ход мыслей, думаю, вам понятен - чем контрастнее деталь, тем сильнее разгонит ее контраст шарпенинг, тем сильнее она будет отличаться от оригинала.
Далее чисто технический момент - полученная маска нуждается в небольшом размытии и доработке кривыми с целью увеличения контраста. После всех этих процедур выглядеть она будет жутковато, но пугаться этого не стоит, ибо это всего лишь маска.
После получения маски мы делаем два слоя с исходником:
У одного будет инвертированная полученная нами маска - как раз то, что нам надо.
У другого - неинвертированная, позволяющая шарпить все за исключением низкоконтрастных областей.
Для первой мы применяем гипершарпенинг (рычажки по вкусу, но USM где-то в районе 0,3/500/0 или дважды/трижды по 0,2/500/0 - самое оно) тем самым проявляя фактуру.
Для второй применяем тот шарпенинг, который мы применяем обычно - либо USM, либо смарт, либо скрипт Паши Косенко - по вкусу (тем самым подчеркивая края).
После мержа получаем результат.
Важное замечание: после простейшего анализа выясняется, что у данного алгоритма есть один минус - он будет сильно увеличивать шум на однотонных поверхностях, где не предполагалось применять увеличение фактурности, например на небе. Это стоит учесть и в случае необходимости доработать кисточкой полученную маску.
Итак, в качестве подопытного кролика у нас есть вот такая картинка:
Что мы хотим с ней сделать?
Мы хотим проявить текстуру листвы и текстуру гранита пристани, но чтобы выглядело это пристойно без ощущения перешарпа на контрастных границах.
Что ж, поехали. Сестра, скальпель!
Первые три пункта за их очевидностью не иллюстрируем.
1) Переводим картинку в Lab.
2) Копируем в буфер канал L.
3) Конвертим обратно в RGB (Lab нам больше не нужен).
4) Вставляем поверх оригинала два слоя из буфера, получается вот так:
5) Жестко шарпим верхний слой:
6) После шарпенинга ставим ему режим наложения Difference:
7) Полученный результат моем Гауссом с радиусом 1.0
8) Дальше безбожно задираем кривыми контраст
9) И еще раз!
10) Маска готова! Делаем два дубля оригинала, создаем маски для каждого:
11) Копируем нашу маску в две созданные маски, и верхнюю сразу инвертируем, слой маски удаляем, он больше не нужен.
Обратите внимание - здесь я намеренно демонстрирую инвертированную маску, чтоб вы понимали как она выглядит:
12) Легонько шарпим нижний дубль:
13) И даем волю рукоблудству с верхним:
14) Мержим всю нашу котовасию и получаем результат:
Обратите внимание - я специально упустил шаг с редактированием маски - и здесь вы видим артефакт на воде, о котором я говорил - появился нежелательный шум, если доработаете маску кисточкой, его не будет.
Всем спасибо за внимание!
UPD: Господа! Коллективный разум в виде нескольких комментаторов нашел более оптимальный способ добиться такого же результата, как показано в данном уроке. Основу для маски можно получить благодаря фильтру Find Edges - он делает практически идентичное описанному в шагах 1-6.