世界を動かす技術を、日本語で。

iPhone 15 Proの深度マップ

概要

  • AppleのiPhone は2017年以降、 深度マップ付き画像 をHEIF形式で保存
  • HEIC Shenanigans プロジェクトで画像やメタデータ抽出・EXR変換が可能
  • PythonスクリプトとCLIツール を組み合わせた変換手順
  • OpenEXRやOpenColorIOなど 映画業界標準技術 の活用
  • 実際の変換コマンド例 とワークフローの解説

iPhone画像の深度マップとHEICフォーマット

  • 2017年以降のiPhone では、LiDARや構造化光3Dスキャンによる 深度マップ撮影 が可能
  • 画像と深度マップは HEIFコンテナ(HEIC形式) に保存
  • HEICファイル は複数画像や豊富なメタデータを格納可能
  • JPEG形式 も選択可能だが、深度マップやHDRは非対応
  • Finn Jaeger(Replayboys社VFX責任者) がHEIC Shenanigansプロジェクトを公開

HEIC Shenanigansプロジェクトの概要

  • HEIC Shenanigans は画像・メタデータ抽出やEXR変換のスクリプト群
  • Python(374行) で実装
  • 画像や深度マップを個別に抽出し、 OpenEXR形式 に変換可能

作業環境と前提条件

  • AMD Ryzen 9 9950X(16コア/32スレッド) 搭載ワークステーション
  • DDR5 96GB RAM、Crucial T700 4TB NVMe SSD 構成
  • Ubuntu 24 LTS(Windows 11 Pro上でWSL利用) 環境
  • Nvidia GTX 1080 利用理由:Windowsのドライバ互換性とArcGIS ProのWindows専用性

必要なツールのインストール

  • Python 3.12.3jqopenexrlibimage-exiftool-perllibopenexr-devpython3-pippython3.12-venv をインストール
    • $ sudo add-apt-repository ppa:deadsnakes/ppa
    • $ sudo apt update
    • $ sudo apt install jq openexr libimage-exiftool-perl libopenexr-dev python3-pip python3.12-venv
  • Exiftool のバージョン注意:HEIC対応の最新版推奨
  • jc(JSON Convert) のインストール
    • $ wget https://github.com/kellyjonbrazil/jc/releases/download/v1.25.2/jc_1.25.2-1_amd64.deb
    • $ sudo dpkg -i jc_1.25.2-1_amd64.deb
  • HEIC Shenanigansリポジトリのクローン
    • $ git clone https://github.com/finnschi/heic-shenanigans ~/heic-shenanigans
  • Python仮想環境のセットアップと依存モジュールインストール
    • $ python3 -m venv ~/.iphone_depth
    • $ source ~/.iphone_depth/bin/activate
    • $ python3 -m pip install -r ~/heic-shenanigans/requirements.txt
    • $ python3 -m pip install OpenImageIO
  • DJV v2.0.8 でEXR画像の表示

iPhone 15 Pro画像のサンプル

  • Joel Joseph(ArcGIS Desktop製品の専門家) 提供のHEIC画像を使用

HEICからOpenEXRへの変換ワークフロー

  • Academy Software Foundation のオープンソース規格(OpenEXR、OpenColorIOなど)を活用
  • OpenEXR はILMが開発したHDR画像フォーマットで、VFXや3Dレンダリングで広く利用
  • 変換コマンド例
    • $ python ~/heic-shenanigans/heic_to_exr.py IMG_E2153.HEIC
    • 結果ファイルは 468MB のEXRファイル

スクリプトによる処理手順(主なコマンド)

  • 画像サイズ取得
    • $ oiiotool --info /tmp/tmpc3kmiaka/input_base.tiff
  • sRGB→Linear P3→ACEScg変換のベース画像作成
    • $ oiiotool /tmp/tmpc3kmiaka/input_base.tiff --ch R,G,B --chnames sdr.R,sdr.G,sdr.B --colorconfig studio-config-v1.0.0_aces-v1.3_ocio-v2.1.ocio --colorconvert 'sRGB - Texture' 'Linear Rec.709 (sRGB)' --colorconvert 'Linear P3-D65' 'ACES - ACEScg' -o /tmp/tmpc3kmiaka/base.exr
  • HDRゲインマップの生成とRGB化
    • $ oiiotool /tmp/tmpc3kmiaka/input_hdrgainmap_50.tiff --ch Y --chnames gainmap.Y --resize 4032x3024 --colorconfig studio-config-v1.0.0_aces-v1.3_ocio-v2.1.ocio --ocionamedtransform 'Rec.709 - Curve' -o /tmp/tmpc3kmiaka/gainmap.exr
    • $ oiiotool /tmp/tmpc3kmiaka/gainmap.exr --ch gainmap.Y,gainmap.Y,gainmap.Y --chnames gainmap.R,gainmap.G,gainmap.B -o /tmp/tmpc3kmiaka/gainmap_rgb.exr
  • HDRゲインマップのヘッドルーム値抽出とスケーリング
    • $ exiftool -HDRGainMapHeadroom -b /tmp/tmpc3kmiaka/input_base.tiff
    • $ oiiotool /tmp/tmpc3kmiaka/gainmap_rgb.exr --mulc -0.12135654640000004 --addc 1.0 -o /tmp/tmpc3kmiaka/gainmap_scaled.exr
  • HDRベース画像作成
    • $ oiiotool /tmp/tmpc3kmiaka/base.exr /tmp/tmpc3kmiaka/gainmap_scaled.exr --mul --chnames R,G,B
  • 深度マップのEXR化
    • $ oiiotool /tmp/tmpc3kmiaka/input_depth_0.tiff --ch Y --chnames depth.Y --resize 4032x3024 -o /tmp/tmpc3kmiaka/depth.exr
  • 最終EXRファイルへの各チャンネル追加
    • RGB(HDRベース画像)、SDR、ゲインマップ、深度マップの順に siappend で追加
    • $ oiiotool /tmp/tmpc3kmiaka/final.exr /tmp/tmpc3kmiaka/base.exr --ch sdr.R,sdr.G,sdr.B --siappend -o /tmp/tmpc3kmiaka/final.exr
    • $ oiiotool /tmp/tmpc3kmiaka/final.exr /tmp/tmpc3kmiaka/gainmap_rgb.exr --ch gainmap.R,gainmap.G,gainmap.B --siappend -o /tmp/tmpc3kmiaka/final.exr
    • $ oiiotool /tmp/tmpc3kmiaka/final.exr /tmp/tmpc3kmiaka/depth.exr --ch depth.Y --siappend -o /tmp/tmpc3kmiaka/final.exr
  • 最終ファイル名<prefix>_acesCG.exrとして保存

まとめとサービス案内

  • HEIC Shenanigans を活用することで、iPhoneのHEIC画像を 映画業界標準のEXR形式 へ変換可能
  • コンサルティングや開発支援 の提供(北米・欧州対応)
  • お問い合わせはLinkedIn経由 で受付

Hackerたちの意見

いい記事だね。これらの深度マップは、「ポートレート」モードの写真で背景をぼかすために使われてるんだろうね。写真を撮った後に焦点を変えたり、"絞り"で被写界深度を調整できるのは面白いと思うけど、偽のボケ味はあんまり好きじゃないな。いつも悪いフォトショップみたいに見えるし。ファイル形式にちょっと誤字があるかも?「HEIC」が14回、「HIEC」が3回出てきてるよ。

それについては修正したよ。指摘してくれてありがとう。

なんで見た目が偽物っぽいかっていうと、光学や絞りの計算が間違ってるからだと思う。すごく悪い近似をしてるけど、製品としては80%の人を満足させられるんだよね。正しい絞りの計算でカメラアプリ作ったら、みんなお金払ってくれるかな?それともスマホユーザーは違いが分からなくて気にしないのかな。

iOS用のReality Composerには、LIDAR対応の特別な機能があって、物体をキャプチャできるんだ。でも、LIDARがないAppleデバイスではフォトグラメトリーに戻らないって知ってちょっとがっかりした。3Dモデリングやフォトグラメトリーをやってる人には、知っておいてほしい情報だね。

Polycamはフォトグラメトリーに戻るよ。Canvas(LiDARが必要)やScaniverse(LiDARはオプション)についてもいい話を聞いたことがある。

Hegesを使った3Dスキャンが一番うまくいったよ。LiDARは大きな物体(車とか)には結構いいけど、Face IDの深度カメラを使えば小さい物体もキャッチできる。小さい物のスキャン用にCreality Ferret SEをTikTokで100ドルくらいで買ったんだけど、めっちゃすごいよ。

iOSのChromeでサイトがすごく変なことしてるんだ。ページを下にスクロールするとフォントサイズが大きくなって、上にスクロールすると小さく戻る。すごく混乱するよ。とにかく、oiiotoolのことは初めて聞いた!めっちゃクールだね。

それを使ってオートステレオグラムが作れるよ。

LIDAR自体は、表示されている深度マップよりもずっと解像度が低いんだ。LIDARと通常のカメラデータを組み合わせて合成する必要がある。

うん、LIDARは実際の焦点に使われて、深度マップはマルチカメラの視差から計算されると思ってた。

他のコメントも言ってるけど、LIDARは深度マップの主要なソースとしては解像度が低すぎるね。実際、iPhoneはモデルやカメラによって、深度データをキャッチするために4つの方法を使ってる。昔はポートレート写真のためだけに深度マップをキャッチしてたけど、最近のiPhoneは標準の写真でもキャッチするみたい。1. 最初の方法は、背面に2つのカメラを使って、同時に写真を撮って視差を利用して深度マップを作るってやつ。これはiPhone 7 Plusから導入された、2つの背面カメラを持つ初めてのiPhone(1xメインカメラと2x望遠カメラ)。深度マップは2つの画像を比較するから、狭いレンズの視野に制限される。2. 次の方法はiPhone XRで使われていて、1つの背面カメラだけで、センサーのフォーカスピクセルを使ってざっくり深度を測る。生の結果は低解像度で不正確だから、機械学習で精度を上げてる。詳しくは見てみて: https://www.lux.camera/iphone-xr-a-deep-dive-into-depth/ 3. この方法の拡張版がフォーカスピクセルもないiPhone SEで使われて、機械学習だけで深度マップを生成してる。予想通り、こういう深度マップは現実との相関が一番低くて、写真の写真を撮るとシステムが騙されることもある。詳しくは見てみて: https://www.lux.camera/iphone-se-the-one-eyed-king/ 4. 4つ目の方法はFaceIDのあるiPhoneの自撮りに使われていて、TrueDepthカメラの3Dスキャンを使って深度マップを作る。記事の自撮りを見ればわかるけど、かなりぼやけてて低解像度な感じ。記事には他の補助画像もあって、人間の被写体や眼鏡、髪、肌を白で示してる。Appleはこれをポートレート効果のマットと呼んでいて、機械学習で生成されてる。ポートレートの深度マップとポートレート効果のマットを使ったアプリを作ったことがあって、結構楽しかったけど、もう利用できない。深度マップには新しいアートの可能性がたくさんあるよ。

方法3について、その記事は5年前のものだよ。詳しくは見てみて: https://github.com/apple/ml-depth-pro?tab=readme-ov-file

最近のiPhoneは、標準の写真でも被写体を捉えるみたいだね。人間やペットがシーンにいると、メインの写真モードからもキャッチするんだって。 > 僕は、ポートレートの深度マップとエフェクトマットを使って、クリエイティブなフィルターを作るアプリを作ったんだ。結構楽しかったけど、もう利用できなくなっちゃった。アプリの名前は何だったの?どこかに動画とかある?見てみたいな!僕も「Matte Viewer」っていう小さなツールを作ったんだけど、これはただ見る・エクスポートするためのもので、エフェクトは付いてないよ。: https://apps.apple.com/us/app/matte-viewer/id6476831058

深度マップを使ってステレオグラムやSIRDSを生成できるか気になるな。似たようなグレースケール画像からステレオグラム生成を遊んでたのを思い出す。

できるよ。これをするためのUIは、どうやらVisionOS版のPhotosアプリにしか含まれてないみたい。でも、深度マップがあれば、アルバムのどんな写真でも「Spatial Format」に変換できるし、MLの近似が十分に良ければ高解像度でも大丈夫。EXIFも読み取って、画像の物理的な寸法を元のキャプチャの視野に合わせて「スケール」するから、広角の写真はVR空間では望遠よりも物理的にずっと大きくなる。個人的には、このボタンと機能だけで4000ドルの価値があると思う。2007年にNikon D7で撮った写真をフル3Dで正しいスケールで見ると、忘れてた懐かしい記憶がよみがえってきて、すごく感動した。AppleはこれをVision Proの主要な売りにしないのはもったいないね。すごいのに。

何か見落としてるかもしれないけど、その記事はHDRゲインマップについて結構詳しく話してるね。これが深度マップにどう関係してるの?HDRゲインマップ関連の処理をスキップして深度マップだけ残せるのかな?ちなみに、個人的にはiPhoneのHDR表示が嫌いで(画面の明るさをユーザーが指定した最大よりも高くするから)、自分の写真ではHDRゲインマップを取り除くようにしてる。HDRって言えば、昔は3枚の写真を撮って、それをつなぎ合わせて露出オーバーやアンダーの部分を全部取り除くって感じだったけど、結果の画像にはHDRの情報が全然含まれてなかったな。

記事については同じことを思ったよ。何か見落としたのかなって。深度マップのいい概要があったけど、主にゲインマップやいくつかの異なるファイル形式についての内容だったね。良い記事だけど、ちょっと話が逸れちゃった感じ。

そうそう、深度マップとセマンティックマップは見るのが結構楽しいよね。TouchDesigner(BlenderやCinema 4Dでもいいけど)みたいなプログラムに読み込ませれば、写真にクールな深度エフェクトを作れるし、写真処理にも使える(Appleが最終的にそういう使い方してる)。他のコメントでも言われてたけど、昔はポートレートモードでしかキャッチされなかったけど、最近のiPhoneでは被写体(人間やペット)がシーンに検出されると、ほぼ自動でキャッチされるようになった。自分は写真アプリやツールを作ってるんだけど(https://heliographe.net)、その中の一つ、Matte Viewerは深度マップを表示・エクスポートするために特化してるよ: https://apps.apple.com/us/app/matte-viewer/id6476831058

ああ!Appleがこの技術を「ステッカー作成」機能に使ってるのかな?画像の被写体を押すと、それをステッカーとして抽出したり、別の画像にコピーしたりできるやつ。

それはML専用のアプローチだね。iPhoneで撮った写真じゃなくても機能するみたいだし。