Найти тему
Заметки суриката

Удаление пятен с фотографий по карте пыли

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

Для начала нам надо сделать маску или карту пыли. Берем фотоаппарат, выставляем значение диафрагмы и выдержки побольше, в моем случае это F/16 и 8 секунд. Далее нам надо снять какой-нибудь относительно равномерный предмет вращая перед собой камеру, я лично сфотографировал обычную стенку на кухне. Открываем файл в ACR с обычными настройками и видим примерно следующее.

Дальше выкручиваем Clarity +100, Saturation -100, Blacks +0, Contrast +0. В тоновой коррекции сильно поднимаем контраст, можно поиграться с настройками шарпа и шумодава. Надо прекрасно осознавать что разные линзы дадут разную картинку, и логично что маски будут разные, поэтому надо помнить про это когда будете выставлять Lens Corrections. Получается у нас примено следующее, я понимаю что картина ужасная, и лучше такого не допускать. Но вот так вот получилось :)

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

Маска пыли получена, теперь начинаем эксперименты. Снимаем вид из окна, стараясь захватить побольше неба. Эта картинка у нас и будет в качестве теста. Выставляем параметры по вкусу, я особо заморачиваться не стал. Теперь самое интересное делаем кроп картинки, чтобы было посложнее делаем это дело все под углом. На превью пыли особо не видно, самое заметное пятно - правый верхний угол под проводом. Отправляем картинку в фотошоп. Один нюанс, если вы делаете экспорт из Lightroom, но надо убирать галочку Minimize Embeded Metadata, иначе информация о координатах кропа не попадет в файл.

Вот тут было самое сложное, надо на картинку после кропа наложить маску. Дальше немного теории, в каждый файл пишутся метаданные, среди них и есть данные по кропу. Хотелось бы отдельно отблагодарить программистов Adobe за систему, что они сделали, кроп прямоугольный и они могли просто писать туда 4 координаты кропа, так нет, они выпендрились и стали писать туда координаты левой верхней и правой нижней точки, а также угол наклона. В общем по этим данным надо было посчитать координаты кропа, вырезать это дело из маски и наложить на нашу картинку. В скрипте эти расчеты занимают около 20 строк, но я потратил на это несколько дней, вспомнил базовый курс тригонометрии, который забыл напрочь :)

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

Сделаем группу и маску для неё. Чтобы наши будущие воздействия не влияли на нужные объекты, нам надо сделать отдельно маску, обычно это на небо и воду, на остальном пыль не так заметна. Сделать маску неба можно кучей разных способов, это разница каналов через Calculations, канал Black в режиме CMYK, можно сделать Difference предварительно через Hue/Saturation выкрутив Cian и Blue, можно вообще кисточкой нарисовать, в общем каждый может выбрать что ему по душе.. Лично я, банально взял синий канал и провел над ним очень жестокую коррекцию через кривую. Идеально не получилось, но все равно некоторая корректировка в маске нам еще предстоит.

Внутри этой группы делаем еще одну группу, в неё кидаем копию основного слоя, в качестве маски используем туда наш слой с пылью. Select - Color Range - Fuzznnes: 200. Получаем выделение для пыли.

Далее идем на слой, с копией основного слоя и применяем фильтр Noise - Dust & Scrathers. Параметры можно подобрать самому, я использовал Treshold: 0, Radius: 50px, хотя 25 на самом деле было бы достаточно. Вообще пыль можно замазать разными способами, как например сделать из выделения Path, а затем через Stroke Path, пройтись Spot Healing Brush, еще как вариант можно сделать удаление с Content-Aware. Тут решать вам. Слою выставляем режим наложения Lighten или оставляем Normal, можно Luminocity, но разницы практически никакой.

Теперь желательно проверить что мы натворили. Я обычно выделяю верхнюю группу и выставляю ей режим Difference. Сразу видно, что из-за немного кривой маски мы залезли на часть дома, и есть ненужное замазывание проводов. Все это за 5 секунд, исправляется небольшим рисованием по маске пыли, во второй группе.

100% кроп конечного результата. Как видим, маска пыли легла корректно и пыль ушла.

Здесь в архиве (47,1 Mb), вы найдете оба RAW файла, маску пыли, скрипт и экшн.

Внимание! Внутри скрипта надо поменять путь к файлу с картой пыли, строка 18: var fileRef = new File("d:/_tmp/_lessons/_lesson5/_dustmask.psd");

Инсталяция скрипта довольно простая, достаточно его скопировать по пути C:\Program Files\Adobe\Adobe Photoshop CS(ваша версия)\Presets\Scripts и перезапустить фотошоп. Ссылка на скрипт появится в закладочке File -> Scripts. Я не проверял на совместимость с другими версиями, но на CS5, все работает нормально.

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

Тестировали файлы после ACR и Lightroom. Не уверен, что другие конверторы будут писать нужные метаданные.