Автор: programistich
Дата: январь 14, 2020

 

Меня часто спрашивают почему Google Camera такая крутая и почему такой хайп вокруг нее. В этом случае я показываю как круто она снимает и вопросы отпадают. Но давайте все таки технически разберемся во всем этом и как это устроено.

В современных мобильных камерах алгоритмы обработки важнее, чем железо. Но когда начинаешь разбираться, понимаешь, что камеру Google конструировали гении.

Всё началось в 2011 году, когда глава экспериментального подразделения Google X Себастьян Трун (Sebastian Thrun) обратил внимание, что большую матрицу и оптику в очки не поставить, а снимать как-то надо. Поэтому, единственным выходом оставалось, улучшить картинку софтом. Для решения этой задачи был приглашен профессор Стэнфордского Университета, эксперт в области вычислительной фотографии — Марк Левой.

Именно он в 2011 году выпустил приложение SynthCam для iPhone 4, которое симулировало размытие фона как в зеркалках. Так себе симулировало будем честны. Марк Левой возглавил команду разработчиков, которые назвали себя Gcam(Google Camera). При разработке алгоритма было сразу заложено 4 принципа, которые сильно повлияли на развитие вычислительной фотографии:

Быть мгновенным. На обработку снимка не должно тратиться более нескольких секунд и все вычисления должны проходить локально на устройстве, а не в облаке, например. А значит, алгоритм должен быть простым для вычисления.

Быть автоматическим. Никаких ручных настроек. Пользователь должен получать качественные снимки не задумываясь о тонкостях алгоритма.

Быть естественным. Эффект не должен делать изображение сюрреалистичным, мультяшным. А ночь не должна выглядеть как плохая дневная фотография. Кстати, этот принцип и сейчас заметен: например, Pixel далеко не всегда делает такой ядреный HDR, как конкуренты, хотя мог бы.

Быть консервативным. HDR+ должен рассматриваться как режим по умолчанию, не содержать артефактов, а результат должен быть, как минимум, не хуже чем обычная фотография.

Эти принципы побудили команду Gcam подойти к работе нестандартно, потому как все остальные решения того времени этим принципам не отвечали.

Обычно в мобильной фотографии динамический диапазон расширяют при помощи техники брекетинга (вилки). Делается несколько снимков: один нормальной яркости, один светлее, один темнее. А потом они склеиваются: тени берутся из светлого снимка, света с темного, остальное с обычного. За счёт этого мы получаем расширение динамический диапазон, то есть HDR. Сейчас это умеет любой смартфон.

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

Так что же придумали инженеры Gcam? Они решили, что эффективнее будет склеивать между собой снимки не с разной экспозицией, а с одинаковой, причем чуть недоэкспонированные, т.е. темные или недосвеченные. Звучит нелогично! Чем вообще может помочь склейка темных снимков? А откуда взять информацию в тенях? А как это вообще поможет избавиться от шума? И вот тут начинается магия Google.

Начнём с того, что в этом случае, снимки не склеиваются, а как бы накладываются друг на друга, усредняя информацию о цвете при каждом наложении. Из-за того что снимки делаются с более короткой выдержкой, они получаются чётче, объекты меньше размываются.

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

Плюс ко всему, увеличивается глубина цвета с 10 до 14 бит. И это даёт возможность искусственно высветить тени без видимых артефактов. Звучит всё гениально и просто, но на самом деле алгоритм чрезвычайно сложный, потому как он должен работать во всех условиях при съёмке с рук, не сажать мгновенно батарейку и не выдавать артефактов.

Реализация в приложении устроена следующим образом. Когда вы запускаете приложение камера, оно начинает непрерывно снимать, загружая в циклический буфер от 15 до 30 фотографий, в зависимости от уровня освещённости. В момент, когда вы делаете снимок, запись прекращается и берутся последние кадры из буфера. Из первых трёх кадров выбирается самый резкий, а потом на него накладываются другие снимки исключая фрагменты которые не изменились. Каждый снимок сравнивается покадрово и все измененные области отсекаются.

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

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

Конечно, Google не единственный кто умеет в вычислительную фотографию. Вместе с iPhone XS Apple предоставила свою версию магического алгоритма. Со слов Фила Шиллера, технология работает следующим образом: в циклическом буфере вращается 4 кадра с нормальной экспозицией и 4 промежуточных кадра с пониженной экспозицией, а также 1 светлый кадр с более длинной выдержкой; далее нейронный движок анализирует все кадры и склеивает удачные фрагменты между собой.

Принцип работы похож на вариант реализации от Google, но за счёт того, что нужно склеить снимки с 3 разными экспозициями, такой алгоритм гораздо сложнее реализовать на практике, не получив артефакты типа гоустинга и агрессивной компрессии цвета. Более того, такой метод теоретически должен быть более затратен для вычисления.

Но стоит отдать должное Apple, потому, что они не только успешно это реализовали, но добились вычисления в реальном времени, за счёт плотной интеграции со своим железом. То есть на экране iPhone в камере вы видите то, что получится на фотографии, Google таким похвастаться не может (кроме Pixel 4, где реализована функция Live HDR).

Но Google может другое: они реализовали подобный алгоритм и при съёмке видео вплоть до 30 кадров в секунду, что вообще взрывает мозг.

Итого, преимущества алгоритма от команды Gcam:

• значительно уменьшаются шумы, практически без потери детализации;

• почти полное отсутствие артефактов;

• естественная цветопередача;

• чёткая картинка даже при условии быстрого движения в кадре.

Но у такого подхода, конечно есть недостатки. Во-первых, во время съёмки непонятно, каким получится итоговый снимок, потому как в видоискателе отображается картинка прямиком с матрицы, без особых улучшений. А во-вторых, чтобы посмотреть результат придётся немного подождать пока снимок обработается, но это только в режиме расширенного HDR+, где очень большой динамический диапазон, который требует чуть больше времени.