
はじめに
「撮影した後から、好きな場所にピント(被写界深度)を合わせ直せる」
そんな魔法のようなことができるライトフィールドカメラをご存知でしょうか。深度合成画像を作ってみたいと思い調査していたところ、この特殊なカメラの存在に行き着きました。2006年ごろから2010年にかけてそれなりに活発にガジェット界隈をにぎわせた存在です。
そこで今回は、ライトフィールドカメラのRAW画像を入手し、自分自身でピントをずらした画像を生成(リフォーカス)するプログラムを実装しようと試みました。しかし、結論から言うとパラメータやアルゴリズムの繊細な調整の壁にぶつかり、”完璧な実装”には至りませんでした。しかし、補完を完全に(商用ライブラリレベル)はできないものの、復元までは実装することができたため、その実装結果をまとめてみました。
公式ツールのアーカイブから出力する方法:【Lytro Light Field】Lytro DesktopでLFPファイルを開く方法|ライトフィールド画像のピント調整とJPEG書き出し
この記事では、ライトフィールドカメラの面白い仕組みの解説から、数式ベースでの実装アプローチ、そしてなぜ自作実装が困難だったのかという課題についてまとめます。
0.ライブラリや過去のリポジトリ(ことごとく使えなかった)
ライトフィールドカメラのRAW画像は、下で説明する通り処理をしないと通常の画像として見えないためプログラムで処理する必要があります。
既存ライブラリとして以下のようなものがありましたが私の環境(できれば3.12以降で動かしたい)では動かなかったり、これだけのためにライセンスを買うには高価でした。
そこで、簡易的にどの程度自作できるのか挑戦することにしました。
| ライブラリ・方法 | 最終更新日 | 使用可否 | リンク |
| plenopticam (pypi) | 2022/7/5 | 依存ライブラリのビルド不可※1 | https://pypi.org/project/plenopticam/ |
| Process-Light-Fields-Captured-with-Lytro-Camera | 2021/6/11 | 特定カメラのみ、MATLABライセンス | https://github.com/Jaramilloh/Process-Light-Fields-Captured-With-Lytro-Camera |
| Light Field Toolbox for MATLAB | 2023/4/18 | MATLABが必要。ライセンス2万円/年以上 | https://github.com/doda42/LFToolbox |
※1. 依存関係のライブラリのビルドができない、バイナリを探してバイナリを呼び出す形で導入してもほかの部分でこけた。
1. ツールとリポジトリ
今回開発したLytro Light Fieldの撮影データから深度別の画像を合成したかった(開発中)リポジトリです。
lightfield-extractor
Light FieldカメラのRAWデータから深さ指定で画像を作る
github.comLight Fieldカメラは入手困難。

Light Fieldカメラは、現在(2026)時点では、そもそも生産されておらず、パイオニアであったLytro 社が2018年に事業終了。 現状手に入れる方法は中古品を探すほかない。
Lytro 社はライトフィールド技術を利用したカメラで有名になったが、googleに買収?(会社としては買収されず、特許と一部の従業員が移籍する形)され一般向けにはライトフィールドカメラは入手困難となった。
同様の技術がパナソニックのフォーカスセレクトやGalaxy S5などで採用されているらしいです。
2. データの準備
対象画像は、研究用などでももちいられる Stanford Lytro Light Field Archiveからダウンロードしました。
スタンフォード大学 Lytro Light Field Archive
圧縮後でも1項目11GBとかあるので、テストしたいだけの場合は、Light-Field Imagesセクションから1つの対象に絞ってダウンロードするよ良いかもしれません。 (Flowers & PlantsをDownloadセクションから一括DLすると zipファイルで11.6GB)

ダウンロードしたデータには、画像と深さ情報(.jsn),撮影情報,およびRAWデータがあります。

flower_1.png

flower_1_wap_depth
ピントの深さマスク
// flowers_plants\depth_images\flowers_plants_1_warp_depth.jsn
{
"LambdaMin" : -35,
"LambdaMax" : 16
}3. Light Fieldカメラの仕組み
プログラムの説明のため、カメラの仕組みについて簡単に説明しておきます。
普通のカメラは光を「1枚の平らな平面」に焼き付けますが、ライトフィールドカメラは光の「位置」と「方向」の両方を記録します。これにより、撮影した後に自由な位置でピントを合わせ直すことができるというのが強みです。(その分デメリットもあり一般普及はしなかったようですが)
なぜ1枚でピントの異なる画像が作れるの?
なぜ、一気に複数のピントの画像をとれるのか?
それは、カメラのセンサーに届く光を、「位置(どこを通ったか)」と「方向(どっち向きに進んでいるか)」に分解して保存しているからです。
光の方向と強さが分かれば、センサー上のどの画素が「ピントが合っている被写体からの光」を記録しているかを、後から計算で逆算することができます。
カメラの仕組み(物理的な構成)

マイクロレンズアレイ方式
(電子情報通信学会「知識ベース」 より引用 : https://www.ieice-hbkb.org/files/02/02gun_04hen_02.pdf)
ライトフィールドカメラのレンズは普通のカメラとは違い少し特殊な仕組みとなっています。先ほど説明したような解析を可能にしているのが、カメラ内部の特別な光学配置です。
- メインレンズ: 光の方向と位置を入れ替える役割を果たします。
- マイクロレンズアレイ: 撮像素子の直前に配置された小さなレンズの集まりです。
- これにより、本来1点に集束していた光が、マイクロレンズごとに「方向ごとの小さな光の束」に分解されます。
ライトフィールドカメラのRAW画像(深度調整なしで撮像素子で取れた画像のまま)を確認すると以下のようになっており、マイクロレンズ1つ1つがどこに対応しているか、確認できます。

RAW画像(7574×5264)

一部を少し拡大した画像

マイクロレンズがわかるようにもっと拡大した画像
カメラの機種によってはこのレンズの位置がハニカム状に配置されたものもあるようですが、今回入手出来た画像は格子状にマイクロレンズが配置されたものでした。
デメリット
メリットについては、ここまで話してきたように、一度の撮影で各々ピントが合った画像を作れるという絶大な利点がありました。
これだけ聞くと最強のカメラに思えますが、一般普及しなかった最大の理由が解像度のトレードオフです。 1枚の画像に様々な方向からの光線情報を詰め込むため、特定のピントに対応する情報は全体のほんの一部(約10分の1程度)になってしまいます。高画素なセンサーを使っても、最終的な出力画像の解像度は激減してしまう構造的な制約がありました。
さらに深く知りたい方へ この物理的な光線サンプリングの理論や、位置分解能と方位分解能のトレードオフに関する厳密な定義については、以下の学術資料を参考にしてください。
電子情報通信学会「知識ベース」 2群-4編-2章
(余談:私の専門であるディープラーニング(画像処理)の観点から見ると、このカメラは再評価されても良い気がしています。複数台のカメラを同期させるより処理が軽く、どのみちCNNの内部で畳み込み(プーリング)を行うのであれば、初期の超高解像度は不要です。一瞬で空間情報を取得できるこの仕組みは、ロボット制御などにおいて非常に強力なセンサーになり得ると考えています。
4. 原理:ピントの合った画像の作り方
ここでは簡単に、ピントに合った画像を先ほどのRAW画像から作る方法について、主要なコア部分に絞って数式を用いつつ、数式のお気持ちを紹介します。詳しくは各自で調べてみてください。
(とりあえずツールの使い方が知りたい方は、読み飛ばして構いません)
4.1. 分解:光線のパラメータ化
ライトフィールドは、空間上の光線を「どこを通り(位置)」、「どちらを向いているか(方位)」の4次元座標 \((u, v, x, y)\) で記述します。
- \((u, v)\): 主レンズ面上の座標(位置)
- \((x, y)\): センサー(マイクロレンズ)面上の座標(方位)
マイクロレンズアレイ(MLA)を配置したカメラでは、センサー上の各画素がこの4次元データを「分解」して記録します。これにより、従来のカメラでは失われていた「光の到来角度情報」が保持されます。
4.2. 再構成:シフト・アンド・アッド(Shift-and-Add)
特定の焦点距離 F にピントを合わせる処理は、「センサー上の光線を、レンズを通った後に特定の面に結像するように重ね合わせる」作業です。
これを数式で表すと、リフォーカス画像 \(L_F(x, y)\) は、元のデータ \(L(u, v, x, y)\) を用いて以下のように積分(合計)されます。
\[L_F(x, y) = \frac{1}{C} \iint L\left(u, v, x + \alpha(u – u_c), y + \alpha(v – v_c)\right) du \, dv\]
- \(\alpha\): リフォーカス倍率(ピントを合わせたい距離に応じて変化するパラメータ)
- \(u_c, v_c\): 主レンズの中心座標
- \(C\): 正規化定数
4.3 数式の意味
この式は非常にシンプルです。
- 各視点(マイクロレンズの位置)からの画像について、ピントを合わせたい対象物までの距離に応じた分だけ、画素を水平・垂直方向にずらします(Shift)。
- ずらした画像をすべて足し合わせます(Add)。
すると、ピントが合っている被写体は同じ位置に重なるため像が鮮明になり、ピントが合っていない背景は像がずれてボケる(平均化される)という仕組みです。
5. 作成したツールで合成してみる
上記の仕組みをPythonとOpenCVのサブピクセル補間(cv2.remap)などを用いて実装し、実際にRAW画像から合成を試みました。

左手前の花にフォーカスを合わせた画像

中央と奥の花にフォーカスを寄せた画像
課題:ノイズと…
結果として、手前の花にピントを寄せた画像、奥にフォーカスを合わせた画像など、「ピントが移動している」こと自体は確認できる画像の生成には成功しました。
しかし、拡大してみるとわかりますが、うっすらとノイズのようなものが乗ってしまいました。

極端にノイズが乗ったときの画像を拡大した画像
ここの補正には、カメラのレンズのパラメータなどが必要になってくるようですが、そのデータのURLのページはすでに公開を停止しており、手元にあるデータだけで復元するのは困難です。(完成写真からparameterをマップしなおすとかして疑似的に作ることも可能かもしれませんが、困難であることには変わりなさそうです)
追記:改良1 マスクをかけてみる
ノイズの原因として、もともとのマクロレンズの割り当て領域外のビットとの平滑化が1つの原因であるので、レンズ中央が最も信頼できる情報。マクロレンズの対象領域をマスクしたのちにサンプリングする方式に改良してみた。
目立ったノイズを軽減できた。

マスク前(拡大)

マスクマップ処理をしてサンプリング(拡大)
さいごに
いきなりブラックボックス化されたライブラリを使うのではなく、自力で数式からアプローチしたことで、先人たちのライブラリが「なぜあそこまで複雑な処理をしているのか」をコードレベルで深く理解できたのは大きな収穫でした。
なんとなくの復元まではできたものの、完全なリフォーカスが実装までには至らなかったことが心残りではあるので、古いpython環境を構築しなおして試してみてうまくいったら、記事にまとめて共有しようと思います。
ここまで読んでいただきありがとうございます。
では、次の記事で。 lumenHero
公式ツールで読みだす(.lfp形式の時のみでRAW画像未対応)
【Lytro Light Field】Lytro DesktopでLFPファイルを開く方法|ライトフィールド画像のピント調整とJPEG書き出し
Lytro Desktopを使ってLFP(ライトフィールド)画像を読み込み、ピントや絞りを調整してJPEG・PNG・TIFFへ書き出す方法を紹介。サンプルLFPファイルの入手先や非公式アーカイブも解説します。
参考文献
PhotoSepia corporation:ライトフィールドカメラの原理