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

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

Hacker Newsで議論の続きを見る