Буквально считанные часы были у меня, чтобы ознакомиться с камерой Lytro. Однако впечатления были столь яркими, что я решил написать эту статью. Если рассматривать эту камеру среди других фотоаппаратов, то на данный момент это не практический инструмент, а занимательная игрушка и хорошее наглядное пособие. Идеи, лежащие в основе этой камеры, древни, как мир. Природа реализовала их сотни миллионов лет назад, создав фасеточный глаз насекомых.
Человечество технически попыталось реализовать эту идею лет сто назад. Растровая интегральная фотография связана с именем Габриэля Липмана, получившего в 1908 году Нобелевскую премию по фотографии — правда, не за интегральную растровую фотографию, а за интерференционную. Цель наглядного пособия — показать существование явления и продемонстрировать принципы, лежащие в его основе. С демонстрацией у камеры Lytro все очень хорошо, а с познавательностью и принципами — не так просто. Есть достаточно короткое описание на сайте проекта и существенно более полное в диссертации Ren Ng. Диссертация «стандартных» размеров, в 200 страниц. Автор, безусловно, руководствовался заповедями диссертанта: «Не пиши длинно: диссертация не “Война и мир”, а ты не Лев Толстой. Не пиши кратко, это свидетельствует либо о большом таланте, либо о скудости ума; ни того, ни другого ученый совет тебе не простит». В общем, диссертация очень интересная, но на пальцах изложить ее содержание я не берусь. Отмечу только, что в солидной библиографии среди работ, положенных в основу, упоминаются и труды 1930-х годов ведущего сотрудника ГОИ Андрея Александровича Гершуна, который, в том числе, является и одним из основоположников гидрооптики, которой я отдал значительную часть своей жизни.
Итак, что из себя представляет камера. Маленький параллелепипед, в одном торце которого виден объектив, другой ее торец целиком занимает сенсорный квадратный экран.
На верхней грани сенсорный ползунок, позволяющий менять фокусное расстояние объектива, и кнопка спуска затвора. На нижней грани кнопка питания и разъем Micro-USB. Если включить камеру, то у нас есть возможность касанием экрана выбрать точку фокусировки или точку, по которой будет оцениваться экспозиция, сделать снимок и потом его рассматривать. Экран довольно грубый, примерно 240×240 точек, но тем не менее, он позволяет увидеть и оценить тот эффект, ради которого была сделана камера. А именно: касанием экрана можно сфокусироваться на любой точке снимка. Т. е. фокусировка возможна не до, а после.
Камера записывает не изображение, а ход лучей. Чтобы посмотреть это более подробно и попытаться понять, как же это все работает, надо подключить камеру к компьютеру. На момент моего знакомства с камерой была только одна возможность: подсоединить ее к компьютеру фирмы Apple. (24 июля 2012 года анонсировано и программное обеспечение для Windows.)
В этом случае компьютер скачает с камеры программное обеспечение, установит его и позволит перенести снимки на компьютер. После этого, запустив программу, можно рассматривать полученные снимки уже размером 1080×1080 точек. Для того, чтобы поделиться снимками со знакомыми, предусмотрена только возможность выложить их в интернете на сайте производителя, где с помощью проигрывателя, построенного на технологии Flash, можно поиграть, меняя точку фокусировки снимка. Предусмотрена возможность вставить ссылку на проигрыватель и в тело собственного HTML-файла.
Возможность редактировать снимки или хотя бы просто записать их на внешний носитель не предусмотрена. Однако голь на выдумки хитра, и дотошные пользователи обнаружили на компьютере папочку, в которой сложены снимки двух типов: *.lfp и *-stk.lfp (ссылки позволяют скачать примеры файлов). А Nirav Patel научился разбирать эти снимки на составляющие. Для этого он написал программу lfpsplitter, которая преобразует эти файлы в несколько других, но уже привычного или достаточно легко читаемого формата. Файл *.lfp представляет собой сырую информацию с матрицы. После применения к нему программы преобразования:
./lfpsplitter IMG_0001.lfp
получаем следующие файлы: IMG_0001_table.json, IMG_0001_imageRef0.raw, IMG_0001_metadataRef.json, IMG_0001_privateMetadataRef.json.
Применив к IMG_0001_imageRef0.raw программу raw2tiff из пакета Libtiff:
raw2tiff -w 3280 -l 3280 -d short IMG_0001_imageRef0.raw output.tif
получим стандартное изображение в формате TIFF, на котором увидим группу изображений, созданных микролинзами. В результате мы получим матрицу, на которой расположено 300×300 микроизображений.
Миниатюра сырого снимка. Красным квадратом отмечено положение фрагмента, приведенного ниже.
Фрагмент при верстке увеличен в два раза. Грубо говоря, светящаяся точка представляется кружком, чей диаметр зависит от расстояния до объекта.
Файл *-stk.lfp представляет собой стопку снимков, сфокусированных в разных плоскостях, и карту глубин. После применения к нему программы преобразования:
./lfpsplitter IMG_0001-stk.lfp
получаем следующие файлы: IMG_0001-stk_table.json, IMG_0001-stk_depth.txt, IMG_0001-stk_0.jpg, …, IMG_0001-stk_N.jpg.
Миниатюры половинного размера двух снимков из стопки. Щелкнув по ним мышью, можно увидеть исходное изображение.
Снимки в стопке — в формате JPEG, и содержат уже 1080×1080 точек. Достаточно легко представить себе, как из сырого снимка можно получить стопку снимков с разрешением 300×300. Если представить, что мы снимаем светящуюся точку, расположенную на разных расстояниях от аппарата, то ее изображение будет представлять из себя кружки, диаметр которых будет связан с расстоянием до объекта. Таким образом, беря яркость концентрических колец, мы можем получить стопку снимков, сфокусированных в разных плоскостях. Начиная с некоторого расстояния точки до аппарата, ее изображение будет фиксироваться уже не одной линзой микрорастра, а несколькими. Но и эту систему уравнений можно попытаться достаточно просто решить. А вот достижение авторов проекта, позволившее удевятерить разрешение, является нетривиальным.
Да, на сегодняшний момент это только игрушка. 12-мегапиксельная матрица этой камеры позволяет получить изображение 1 Мп. Если снять 12-мегапиксельной обычной мыльницей с той же дистанции тот же объект, то за счет диафрагмирования и преобразовав его в изображение размером 1 Мп, мы получим снимок, на котором все объекты будут резкими независимо от дистанции до них.
Снимок сделан с той же точки, что и камерой Lytro, но уже камерой Canon A650 при диафрагме F:8 и фокусном расстоянии 7 мм. Взят фрагмент кадра.
Таким образом, вся самая интересная информация, которую позволяет получить камера Lytro, лежит не в стопке снимков, а в текстовом файле IMG_0001-stk_depth.txt, содержащем карту глубин. Я написал простенькую программу на Gambas3, которая создает из этого текстового файла изображение, где расстоянию до объекта соответствует плотность серого. Чем темнее, тем ближе. Исходный код можно скачать здесь.
Воспользовавшись фильтром для графического редактора GIMP:
и применив к двум вышеприведенным снимкам нашу карту глубин, получим:
Объединив всю стопку снимков, записанных камерой Lytro, мы в лучшем случае получим снимок, резкость которого во всех плоскостях будет такой же, как у снимка, снятого обычной мыльницей. А вот карта глубин, записанная камерой, позволит из этого снимка выделить объекты, находящиеся на разной дистанции. Если применить эту карту глубин к снимку, снятому мыльницей, мы можем получить, с помощью достаточно простого проигрывателя, возможность менять точку фокусировки. Таким образом, у нас появляется возможность получить изображение, довольно точно соответствующее снимку, сделанному куда более светосильным объективом с очень маленькой глубиной резкости даже при использовании маленькой по площади матрицы.
Файл IMG_0001-stk_table.json связывает файлы в стопке с информацией о расстоянии. К сожалению, в стопке файлы расположены не в порядке изменения расстояния, а идентификатор, указанный в этом файле, при разборе на составляющие программой lfpsplitter не записывается в файл JPEG. Поэтому он практически бесполезен, и, чтобы определиться, необходимо посмотреть в двоичном редакторе исходный файл IMG_0001-stk.lfp. В результате я написал программу просмотра только для конкретного снимка, вставив параметры и номера файлов прямо в текст программы. Для полноценной программы просмотра надо было писать собственную программу разбора исходного файла на составлявшие. Кроме функций просмотра, данная программа может объединять снимки, показывая для каждого из 400 квадратов, на которые разбита карта глубин, самый резкий фрагмент. Исходный код можно скачать здесь.
Для конкретного снимка несложно сделать и собственную программу демонстрации на основе технологии Flash. Нижеприведенная программа не только перефокусирует снимок, но и показывает зону одинаковой, по мнению камеры, резкости.
Камера Lytro — это первый работающий и очень добротно сделанный прототип, показывающий, куда дальше может развиваться фотография. Уже сегодня можно сделать матрицы с размером чувствительного элемента столь маленьким, что практически не найдется объективов, которым такое разрешение полезно. Группировка же чувствительных элементов за микролинзовым растром позволит получить дополнительную информацию. При таком же размере пикселя, как в камере Lytro, но используя матрицу 25×25 мм, мы могли бы получить уже не 1-мегапиксельное, а 25-мегапиксельное изображение, из которого потом можно легко выбрать нужную плоскость фокусировки. Если реализовать видеосъемку с таким разрешением, то любимый многими режиссерами прием фокусировки на сюжетно важном объекте можно сделать независимым от мастерства оператора и реализовывать его на этапе монтажа. Кроме того, микрорастр открывает возможности получения стереоизображения.
На сегодняшний момент, к сожалению, камера Lytro — это игрушка не под Linux. Похоже, что проблема программного обеспечения состоит только в драйвере USB. Если бы память камеры была видна как съемный диск, никаких проблем с работой в других операционных системах не было бы. Хотя здесь есть одна неясность: файлы, которые мы научились разбирать, скачаны с MacBook, и непонятно, был ли файл со стопкой снимков получен и обработан камерой или уже компьютером.