
Первым делом, пожалуй, сошлюсь на источники: ключевым по теме данного поста стал англоязычный пост Barry Grussling — «Focus Stacking in Linux»; прочая информация получена из официального руководства enblend/enfuse. Собственно enfuse и будет нашим главным инструментом для стекинга.
Что такое стекинг? Это когда мы делаем несколько кадров одного и того же, в общем случае — с разными параметрами, а затем хитрый алгоритм собирает нам результирующую картинку. Например, если мы сделаем несколько снимков с разной экспозицией, то можем получить в результате что-то очень похожее на результат сведения HDR, о котором я говорил в предыдущем посте. С той лишь разницей, что собственно HDR-изображения (т.е. с динамическим диапазоном более 8 бит на канал) мы не получим, сразу приведение к 8-битному виду.
Кроме стекинга по экспозиции рассмотрим еще уменьшение шумов и стекинг по фокусу.
Но начнем с экпозиционного. Для примера возьмем те же три снимка, с которыми мы уже имели дело в прошлом посте. И проделаем над ними следующие операции (в командной строке):
$ align_image_stack -a aligned_ IMG_*
Это, как нетрудно заметить, выравнивание. Кстати, Luminance HDR тоже это делает, причем с использованием той же утилиты, которая входит в состав пакета Hugin. Я использовал здесь только самые необходимые параметры, поскольку пока нам этого достаточно.
И сводим выровненные кадры:
$ enfuse -o result.tif aligned_*
Опять же, оставляем все параметры по умолчанию, указав только исходные файлы и конечный… Получаем примерно такое:

А если хочется добавить «драмы», можем чуть усложнить вызов:
$ enfuse -o result.tif --hard-mask aligned_*
И получить:

Следующая замечательная вещь, которую мы можем сделать посредством стекинга, это уменьшение шумов без потери детализации. Для этого нужно снять на высоких ISO серию снимков. Несмотря на то, что в данном случае мы не меняем настройки между снимками, снимки все-таки должны быть разными — нельзя просто взять и скопировать один в нескольких экземплярах, поскольку на них шум будет в одних и тех же точках.
Я отснял четыре кадра на ISO 3200, а затем применил к ним те же самые команды, что и выше для стекинга экспозиции. Давайте посмотрим 100% кроп — было:

Стало:

Для сравнения — кроп с кадра, снятого на ISO 1600:

К сожалению, я тогда не догадался снять тот же кадр на ISO 800, что должно соответствовать сборке из четырех 3200-х, а переснимать всю серию мне лень.
Переходим к самому сложному: к стекингу по фокусу… Тут нас ждет несколько проблем: во-первых, изменение фокуса, в отличие от других параметров, меняет контуры снятых объектов, что затрудняет выравнивание, во-вторых, желание максимальной резкости потребует уже неумолчательных параметров при сведении. И, кстати, для этого примера я был вынужден снимать уже со штатива (все предыдущие были спокойно сняты с рук), отчасти это связано с проблемой контуров, отчасти с тем, что для наглядности съемка делалась с минимальной дистанции, приближено к условиям предметной съемки, для которой стекинг по фокусу обычно и применяется.
Итак, я сделал семь снимков, со штатива, с ручным фокусом. Покажу первый, четвертый и седьмой:
Выравнивание делается так:
$ align_image_stack -a aligned_ -m -g 10 -C IMG_*
Описание параметров можно прочитать здесь. Вкратце: -m
позволяет выравнивать контуры разного размера
в кадре (а они при разной фокусировке разные), -C
выполняет обрезку (crop), а -g 10
задает локальный поиск
и размер поля для этого поиска.
Для сведения же выполняем такую команду:
$ enfuse -o result.tif \
--exposure-weight=0 --saturation-weight=0 --contrast-weight=1 --hard-mask \
aligned_*
Нам нужны сфокусированные, т.е. наиболее контрастные участки, тогда как все остальное нам не интересно,
пусть программа на него не отвлекается. Ну и --hard-mask
, чтобы не накладывать размытое на четкое. Получаем:

Неидеально, но вся страница читается. Для получения более высокого качества нужно еще больше шагов, да и снимать не на открытой диафрагме, как в демонстрационном примере…
В целом, стекинг — очень интересная технология, позволяющая обойти различные ограничения, например, на динамический диапазон, ISO или ГРИП, как показано выше. Единственное, что сильно сужает область применения — объект съемки должен быть неподвижен — выравнивание может компенсировать небольшие смещения рук, но вот с движением в кадре сделать ничего не получится.