воскресенье, 26 октября 2008 г.

Как сшивать панорамы

Нашел интересное руководство, полегное линуксойдам занимающимся графикой.

советы.блогспот.ком: Как сшивать панорамы

Давно хотел написать эту заметку. Расскажу о том, как можно сравнительно легко склеивать панорамы из отдельных фотоснимков. Хотя на всех иллюстрациях снимки экрана сделанны в линуксе, все описываемые программы доступны и пользователям других операционных систем (Windows, MacOS X). Так что аудитория этой заметки заметно шире моей обычной аудитории. В отличие от панорамного софта, который чаще всего упоминается в рунете, эти программы свободны и распространяются бесплатно. Итак, герои сегодняшнего дня:

Hugin. Графический интерфейс для склейки панорам. В примерах использовалась версия 0.7.0-beta5. Программа названа в честь одного из воронов Одина.

Autopanosift. Программа ищет «связующие точки» между отдельными кадрами. В большинстве случаев вызывается из Хугина.

Enblend. Бесшовно склеивает отдельные кадры в единое изображение. Она обычно тоже запускается автоматически из Хугина, хотя в сложных случаях её можно запускать и вручную.

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

В общих чертах, технологический процесс выглядит так:


  1. снимаем фото,
  2. загружаем отдельные кадры в Хугин,
  3. ищем «связующие точки» между отдельными кадрами, или автоматически (с помощью Autopanosift), или вручную,
  4. оптимизируем панораму (после этого отдельные кадры располагаются так, чтобы связующие точки по возможности совпадали), смотрим на предварительный результат,
  5. окончательно выбираем проекцию и склеиваем кадры в единую панораму (на этом этапе пригождается Enblend),
  6. обрезаем сшитую панораму, проверяем на наличие ошибок сшивки,
  7. окончательно ретушируем кадр, как в случае обычных фото.
Теперь подробнее о каждом этапе.

Как снимать панорамы


Нужно взять фотокамеру и последовательно снимать фрагменты будущей панорамы. Здесь есть несколько тонкостей:

  • кадры должны перекрываться примерно на треть, это необходимо для успешного поиска связующих точек между отдельными кадрами,
  • составлять горизонтальные панорамы удобнее из вертикальных кадров, таким образом вертикальный угол зрения однорядной панорамы будет шире, панорама будет восприниматься естественнее при просмотре целиком на экране компьютера, больше будет запас для окончательного кадрирования,
  • чаще всего удобно снимать с широким углом изображения (на минимальном «зуме»), в этом случае панорама будет состоять из минимального числа кадров (и наоборот, когда цель состоит в создании максимально детальной панорамы, стоит снимать длиннофокусным объективом, но в несколько «рядов»),
  • используйте бленду или прикрывайте объектив рукой, чтобы избежать бликов на объективе (при съёмке панорам часто приходится снимать почти против света),
  • не используйте поляризатор, хотя он и делает цвета сочнее на отдельных кадрах, из-за него небо на панораме в целом выглядит неестестсвенно,
  • снимайте все кадры панорамы с одними и теми же настройками экспозиции и баланса белого; хотя Хугин и Enblend и умеют выравнивать экспозицию и баланс белого в итоговой панораме, это не всегда получается достаточно хорошо, а разные цветовые тона сразу делают заметными отдельные кадры в панораме; тут очень может пригодится ручной режим экспозиции в фотокамере (если такой есть),
  • то же относится и к фокусному расстоянию, сшивать будет проще, если все кадры будут сняты с одним и тем же фокусным расстоянием,
  • старайтесь снимать с горизонтально выровненного штатива, если есть такая возможность; конечно, можно успешно снять панораму и с рук, но очень многие панорамы мне не удались именно из-за того, что я поленился достать штатив,
  • как в случае штатива, так и в случае съёмки с рук, важно обеспечить неподвижность оси вращения камеры, в идеале она должна проходить через оптическую ось объектива,
  • последние два правила особенно важны, если объекты переднего плана расположены близко к камере,
  • лучше снимать все кадры последовательно в одном направлении, или слева направо, или справа налево, это минимизирует смещение подвижных объектов (например, облаков) в соседних кадрах; если в панораму попадает какой-то быстродвижущийся объект (например, машина, животное, человек), то потом бывает удобно иметь любой кадр панорамы в двух вариантах, с объектом и без него.
Многие из этих «хитростей» я почерпнул отсюда (текст по-итальянски). Это проект, который объединяет 380 круговых панорам, снятых с разных вершин в западных Альпах. Кстати, интересный пример того, что можно сделать со снятыми панорамами.

В результате получаем набор кадров будущей панорамы. Например, такой:



Как склеивать кадры в Hugin



Запускаем Хугин. В современных версиях Хугина все основные действия доступны прямо с его первой вкладки. По порядку, сверху вниз. Вначале загружаем фото:



После этого нужно создать контрольные точки. Жмём «Объединить…»:



После этого запустится Autopanosift:



Как правило, достаточно нажать кнопку «Compute» и дождаться, пока программа найдёт все контрольные точки.



Когда Autopanosift закончит, кнопка «Exit» в его окошке станет доступна:



Жмём и попадаем обратно в Хугин. Вначале откроется окно предварительного просмора



Это результат предварительной сшивки. Чтобы увидеть проблемные области, удобно переключить режим совмещения с нормального на «Разницу», тогда в области перекрытия кадров светлый цвет будет соответствовать несовпадению изображений:



Однако закроем предварительный просмотр и вернёмся на первую вкладку Хугина. Там будут указаны параметры оптимизации. В данном случае предварительный результат оставляет желать лучшего:



Максимальная погрешность оптимизации составила 25 пикселей, т.е. одна из контрольных точек отстоит от своей пары на соседнем снимке на 25 пикселей. Это действительно плохо.

Перейдём на вкладку «Контрольные точки» и, попарно разглядывая кадры, посмотрим, как их расставил Autopanosift. Вот, например, и наша проблемная точка:



Проблемная точка оказалась где-то в облаках. И это хорошо, это легко исправить. Вообще, следует избегать размещения контрольных точек на изменчивых объектах: облаках, качающейся траве, волнах. Контрольные точки на таких объектах — почти гарантия проблем сшивки.

К сожалению, Autopanosift не умеет распознавать объекты на фото и предсказывать их поведение. Поэтому результаты его работы требуется корректировать вручную. В частности, точки на облаках можно просто убрать.

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

На иллюстрации я добавляю такую точку:



Для этого я щёлкаю на выбранной точке на снимке слева, а затем примерно в том же месте на снимке справа. Чаще всего Хугин правильно размещает парную точку на втором снимке. Иногда же ему это не удаётся, и тогда можно увидеть такое сообщение:



Ничего страшного, парную точку можно уточнить вручную. Современные версии Хугин услужливо увеличивают окрестность точки, так что правильно поставить парную точку легко. Уточнив её положение, нажимаем «Добавить».

Ещё пара советов о расположении точек: избегайте «кучкования» всех контрольных точек в одном месте, особенно если это место находится на переднем плане, небольшие ошибки в положении этих точек будут соответствовать большим смещениям кадра при оптимизации. Старайтесь «выкладывать» контрольные точки вдоль важных для глаза контуров (и наоборот, не ставьте слишком много там, где глаз не чувствует линии).

Вот, например, сравните как расставила точки программа:



и как лучше их расположить:



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

Поправив контрольные точки, попробуем ещё раз оптимизировать панораму. Кстати, если перейти на вкладку «Оптимизатор», то можно будет выбрать, какие именно параметры кадра оптимизировать. Мне кажется, что очень часто лучших результатов можно достичь, если оптимизировать не только положение кадра, но и его поворот вокруг оптической оси, «(y,p,r)». Особенно это верно для панорам, снятых с рук (снимая с рук, легко нечаянно немного наклонить камеру).



Заново оптимизировав, можно ещё раз посмотреть на результат в области предварительного просмотра:



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

Очень полезны функции «По центру» и «Уместить», а вот функцией «Выровнять» надо пользоваться осторожно. Если панорама была снята с горизонтально выровненного штатива, то выравнивание вообще не должно требоваться, если же сняли с рук, и кадры пошли «волной», то иногда выравнивание помогает убрать волну, но мне кажется, что при этом ухудшается результат сшивки. Функция «Выровнять» в Хугине довольно новая.

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



Для просмотра на экране целиком, на мой взгляд, очень хорошо подходит цилиндрическая проекция. Если же планируется просматривать в тех или иных программах просмотра, например в апплете PTViewer, то лучше использовать эквидистантную проекцию (или ту, которую требует программа просмотра). А «рыбий глаз», по-моему, лучше всё равно снимать «рыбьим глазом».

Результат сшивки я всегда сохраняю в формате TIFF, потому что потом его ещё приходится редактировать. Жмём «Собрать», и ждём:



Ждём долго, это, пожалуй, самый долгий вычислительный процесс во всей технологической цепочке. Конец этого процесса выглядит примерно так:



Всё. У нас теперь есть большой файл со сшитой панорамой. Сохраняем проект Хугина и закрываем. Дальше нужно довести сшитую панораму до ума.

Обработка сшитой панорамы



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



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

Чтобы обрезать нашу панораму, дважды щёлкнем по ячейке с исходным файлом A1. Откроется новое окно с изображением:



Масштабируем с помощью Ctrl+колёсико мышки. Зажав Ctrl и перетягивая мышку от левого верхнего угла к правому нижнему выделяем прямоугольную область:



Да, выделять прямоугольную область в nip2 нужно именно так: от верхнего левого угла к правому нижнему и зажав Ctrl.

Теперь в главном окне nip2 появляется новая ячейка A2:



Именно содержимое этой ячейки (уже обрезанную панорамe) мы и сохраняем в файл.

В данном случае я обрезал с небольшим запасом, поэтому в одном месте на краю панорамы есть дырка:



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



Наконец, сохраняем окончательный вариант панорамы, добавляем геотаги, и любуемся:



Чтобы добавить геотаги потребуется скопировать EXIF-теги из исходных кадров в окончательный вариант панорамы. Я это делают так:
$ exiftool -tagsfromfile первый-кадр.jpg панорама.jpg
Это не совсем правильно, но быстро.

Что ещё можно сделать с панорамой?



Одно из самых интересных панорамных сообщества, на мой взгляд, группа Perfect Panoramas на фликере. Туда принимают только те панорамы, в которых модераторы не найдут дефектов.

Есть фотосообщество в ЖЖ, тоже посвященное панорамам. Не помню, как называется.

Панорамам с геотегами — самое место на Panoramio. Хорошие панорамы потом покажут в Google Earth :)

В интернете панорамы можно показывать с помощью апплета PTViewer. Вот пример того, что из этого можно сделать.

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

Успехов!

PS. Я нашёл ещё два сходных руководства на русском языке: Клеим панораму Александра Прокудина и Склейка панорам в Hugin (© БэЖэ). Много учебных материалов доступно на сайте программы Hugin, но, увы, только на английском языке.

Комментариев нет: