2 Punkte von GN⁺ 2025-06-06 | 1 Kommentare | Auf WhatsApp teilen
  • iPhones speichern seit 2017 zusammen mit aufgenommenen Bildern auch eine Depth Map mittels LiDAR, 3D-Time-of-Flight und strukturiertem 3D-Lichtscan; auch aus den HEIC-Dateien des iPhone 15 Pro lässt sie sich extrahieren
  • Der HEIC/HEIF-Container kann neben dem Originalbild auch HDR-Gain-Maps, Depth Maps und große Mengen an Metadaten enthalten, sodass sich daraus mehr Informationen analysieren lassen als aus einem einfachen JPEG
  • HEIC Shenanigans von Finn Jaeger ist eine Sammlung von Python-Skripten, die Bilder und Metadaten aus HEIC trennen und nach EXR konvertieren; zum Zeitpunkt des Schreibens umfasst das Projekt 374 Zeilen
  • Aus einer Beispiel-HEIC mit 1,57 MB wurden ein Base-TIFF mit 71 MB, ein HDR-Gain-Map-TIFF mit 5,9 MB, ein Depth-TIFF mit 433 KB und Metadaten als JSON mit 14 KB erzeugt; die Auflösung der Depth Map ist mit 768×576 niedriger als die des Originals mit 5712×4284
  • Die OpenEXR-Konvertierung kombiniert über OpenImageIO, OpenColorIO und ACES die Kanäle für SDR, HDR-Gain-Map und Depth Map; die finale EXR-Datei wächst dabei auf bis zu 468 MB

Wie Depth Maps in iPhone-Fotos gespeichert werden

  • Apple unterstützt seit 2017 Depth Maps in mit dem iPhone aufgenommenen Bildern
  • Die Depth Map und andere Bilder werden gemeinsam in einer HEIF-Containerdatei gespeichert
    • HEIF kann mehrere Bilder und viele Metadaten enthalten
    • Das Format wurde zwischen 2013 und 2015 entworfen, Apple übernahm 2017 die HEIC-Variante
  • Mit dem iPhone aufgenommene Bilder werden seither standardmäßig im HEIC-Container gespeichert
    • Falls weder Depth Map noch HDR benötigt werden, kann auch das JPEG-Format verwendet werden

Interne Bilder mit HEIC Shenanigans trennen

  • Finn Jaeger veröffentlichte Screenshots, die zeigen, dass das iPhone mehrere Depth Maps erzeugt
  • HEIC Shenanigans stellt Skripte bereit, um Bilder und Metadaten aus dem HEIC-Container zu extrahieren und in EXR-Dateien umzuwandeln
    • Zum Zeitpunkt des Schreibens umfasst das Projekt 374 Zeilen Python-Code
  • Das Beispiel folgt Finns Codebasis anhand eines mit dem iPhone 15 Pro aufgenommenen HEIC-Bilds

Laufzeitumgebung und benötigte Werkzeuge

  • Für die Ausführung werden Python 3.12.3 und mehrere CLI-Tools benötigt
    • jq
    • openexr
    • libimage-exiftool-perl
    • libopenexr-dev
    • python3-pip
    • python3.12-venv
  • Das Paket libimage-exiftool-perl installiert exiftool 12.76+dfsg-1
    • Diese Version wurde Ende Januar 2024 veröffentlicht
    • Seitdem gab es mindestens 10 Releases mit Fehlerbehebungen oder Verbesserungen für die HEIC-Unterstützung
    • Für die Beispielschritte reicht diese Version aus, bei späteren Problemen könnten diese jedoch in neueren exiftool-Versionen bereits behoben sein
  • JSON Convert jc wird verwendet, um die Ausgabe verschiedener CLI-Tools in JSON umzuwandeln
  • EXR-Bilder wurden mit DJV v2.0.8 geprüft

Gain Map und Depth Map aus HEIC extrahieren

  • Die Beispiel-HEIC-Datei ist 1,57 MB groß
  • Beim Ausführen von gain_map_extract.py werden folgende Dateien erzeugt
    • IMG_E2153_metadata.json: 14 KB
    • IMG_E2153_depth_0.tiff: 433 KB
    • IMG_E2153_hdrgainmap_48.tiff: 5,9 MB
    • IMG_E2153_base.tiff: 71 MB
  • Die EXIF-Metadaten des Base-TIFF haben folgende Eigenschaften
    • Dateiformat: TIFF
    • Komprimierung: Uncompressed
    • Farbe: RGB
    • Bildgröße: 5712×4284
    • Megapixel: 24,5
    • Bits Per Sample: 8 8 8
  • HDR-Gain-Map und Depth Map haben eine niedrigere Auflösung als das Original
    • Originalbild: 5712×4284
    • HDR-Gain-Map: 2856×2142
    • Depth Map: 768×576
  • Die JSON-Metadaten enthalten unter anderem aux, nclx_profile, primary und xmp
    • Der Eintrag urn:com:apple:photo:2020:aux:hdrgainmap hat den Wert [48]
    • Die Größe von primary wird als [5712, 4284] angegeben
  • Es wurden drei GitHub-Issues erstellt mit der Bitte, base64-kodierte Werte in menschenlesbarer Form zu dekodieren

Der Ablauf der Konvertierung von HEIC nach OpenEXR

  • Die Academy Software Foundation fördert Open-Source-Projekte und Standards für Film, Fernsehen und kreative Industrien
    • Zu den Mitgliedern gehören unter anderem die Academy of Motion Picture Arts and Sciences, Disney, Nvidia und Netflix
  • OpenEXR ist ein HDR-Bilddateiformat
    • Es wurde 1999 erstmals von Industrial Light and Magic entwickelt
    • 2003 wurde es als Open Source veröffentlicht
    • Es wird in der Produktion visueller Effekte und beim 3D-Rendering verwendet
  • Beim Ausführen von heic_to_exr.py wird ein HEIC-Bild des iPhone 15 Pro in eine OpenEXR-Datei konvertiert
    • Die resultierende Datei ist 468 MB groß
  • Das Konvertierungsskript ruft mehrfach oiiotool auf, das Bildverarbeitungswerkzeug von OpenImageIO

Kanalaufbau bei der EXR-Erzeugung

  • Zunächst wird mit oiiotool --info die Größe des Quellbilds geprüft
  • Das Base-Bild benennt die RGB-Kanäle als sdr.R, sdr.G, sdr.B und konvertiert den Farbraum
    • Es geht von der sRGB-Kurve über Linear Rec.709
    • Von Linear P3-D65 wird nach ACEScg konvertiert
  • Für die Farbkonvertierung wird eine OpenColorIO-Konfigurationsdatei verwendet
    • Verwendet wurde die OCIO-Datei studio-config-v1.0.0_aces-v1.3_ocio-v2.1.ocio
    • Diese Datei ist textbasiert und umfasst 1.242 Zeilen
    • Die Beschreibung enthält Academy Color Encoding System - Studio Config [COLORSPACES v1.0.0] [ACES v1.3] [OCIO v2.1]
  • Die HDR-Gain-Map verwendet den Y-Kanal des TIFF, um ein EXR zu erzeugen
    • Dieser wird als Kanal gainmap.Y benannt
    • Die Größe wird auf 4032×3024 geändert
    • Die Rec.709-Kurve wird nach Linear konvertiert
  • Die Gain Map wird durch dreifaches Kopieren des Y-Kanals in RGB umgewandelt
    • gainmap.R
    • gainmap.G
    • gainmap.B
  • Mit exiftool wird der Wert HDRGainMapHeadroom extrahiert; anschließend wird die Gain Map mit dem Kehrwert dieses Headroom-Werts skaliert
  • Das HDR-Base-Bild wird erzeugt, indem das Base-Bild mit der skalierten Gain Map multipliziert wird
  • Die Depth Map erzeugt aus dem Y-Kanal des TIFF einen EXR-Kanal depth.Y
    • Die Größe wird auf 4032×3024 geändert
  • Die finale EXR-Datei wird durch das schrittweise Hinzufügen mehrerer Kanäle aufgebaut
    • R, G, B des HDR-Base-Bilds
    • sdr.R, sdr.G, sdr.B des SDR-Base-Bilds
    • gainmap.R, gainmap.G, gainmap.B der Gain Map
    • depth.Y der Depth Map
  • Falls das Quellbild eine Matte enthielt, würde in diesem Schritt auch eine Matte-Ebene verarbeitet und hinzugefügt
  • Die finale Datei final.exr wird neben dem Quellbild unter dem Namen <prefix>_acesCG.exr abgelegt

1 Kommentare

 
GN⁺ 2025-06-06
Meinungen auf Hacker News
  • Wie andere Kommentare richtig angemerkt haben, ist die LIDAR-Auflösung viel zu niedrig, um als primäre Datenquelle für die Tiefenkarte zu dienen.
    Soweit ich weiß, gewinnt das iPhone Tiefendaten je nach Modell und Kamera grob auf vier Arten. Früher wurden solche Tiefenkarten nur im Porträtmodus gespeichert, aber neuere iPhones scheinen sie auch bei normalen Fotos zu speichern.

    1. Seit dem iPhone 7 Plus nehmen die beiden rückseitigen Kameras gleichzeitig auf und erstellen wie beim menschlichen Sehen über Parallaxe eine Tiefenkarte. Sie ist naturgemäß auf den Bildwinkel des engeren Objektivs beschränkt.
    2. Modelle mit nur einer Rückkamera, etwa das iPhone XR, schätzen die Tiefe grob über die Focus Pixels des Sensors und korrigieren die niedrig aufgelösten, ungenauen Rohdaten per Machine Learning: https://www.lux.camera/iphone-xr-a-deep-dive-into-depth/
    3. Beim iPhone SE, das nicht einmal Focus Pixels hat, wurde die Tiefenkarte ausschließlich per Machine Learning erstellt; die Korrelation mit der Realität war am geringsten, sodass es sogar von einem Foto eines Fotos getäuscht werden konnte: https://www.lux.camera/iphone-se-the-one-eyed-king/
    4. Selfies auf iPhones mit FaceID erstellen die Tiefenkarte über den 3D-Scan der TrueDepth-Kamera. Auch im Selfie des Artikels wirkt sie verschwommener und niedriger aufgelöst.
      Die Hilfsbilder im Artikel, die Personen, Brillen, Haare und Haut weiß markieren, nennt Apple portrait effects mattes; sie werden per Machine Learning erzeugt.
      Früher habe ich einmal eine App gebaut, die mit Tiefenkarten und portrait effects mattes aus Porträtfotos kreative Filter erzeugte, und das war ziemlich spaßig, aber sie ist inzwischen offline. In Tiefenkarten steckt viel neues künstlerisches Potenzial.
    • Neuere iPhones speichern auch im normalen Fotomodus Tiefenkarten, wenn in der Szene Menschen oder Haustiere vorhanden sind.
      Ich frage mich, wie diese App hieß und ob es noch ein Video davon gibt. Ich habe als Teil einer Reihe von Fotowerkzeugen ebenfalls ein kleines Tool namens Matte Viewer gebaut; es bietet keine Effekte, sondern nur Anzeigen und Exportieren: https://apps.apple.com/us/app/matte-viewer/id6476831058
    • https://lookingglassfactory.com ist ein holografischer Bilderrahmen, der iPhone-Fotos mit Tiefenkarte als echtes 3D anzeigen kann.
    • Der Artikel zu Methode 3 ist 5 Jahre alt; inzwischen sollte man sich auch Apples ml-depth-pro ansehen: https://github.com/apple/ml-depth-pro?tab=readme-ov-file
    • LIDAR ist vor allem für schnellen Autofokus und Fokussieren bei wenig Licht optimiert, weniger dafür, Tiefenkarten in voller Auflösung zu erstellen.
    • Ich frage mich, ob Methode 4 in Sicherheits-Apps zur Lebenderkennung eingesetzt werden könnte.
  • Ein interessanter Beitrag. Solche Tiefenkarten scheinen für die Hintergrundunschärfe mit geringer Schärfentiefe im „Porträt“-Modus verwendet zu werden, also für künstliches Bokeh.
    Ich fand es immer interessant, dass man auch nach der Aufnahme noch den Fokus ändern und über die „Blende“ die Schärfentiefe anpassen kann, aber die Form des künstlichen Bokehs gefällt mir nicht. Es sieht immer nach schlechtem Photoshop aus.
    Bei der Dateiformat-Bezeichnung scheint ein Tippfehler vorzuliegen: „HEIC“ 14-mal, „HIEC“ 3-mal.

    • Dass es künstlich aussieht, liegt vermutlich daran, dass die tatsächliche Optik und Blendenmathematik falsch umgesetzt sind und aus Produktsicht eine sehr schlechte Näherung verwendet wird, die für 80 % der Leute gut genug ist.
      Mit korrekter Blendenmathematik ließe sich wohl eine bessere Kamera-App bauen, aber ich frage mich, ob Leute dafür zahlen würden – oder ob Smartphone-Nutzer den Unterschied nicht bemerken und es ihnen egal ist.
    • Der Tippfehler ist behoben.
    • Aus Sicht eines Fotografen ist künstliches Bokeh schwer zu ertragen. Es unterscheidet sich völlig vom Bokeh eines guten Objektivs und wirkt furchtbar unnatürlich; erstaunlich, dass Leute es schön finden.
      Wenn man schöne Porträts will, ist es besser, eine günstige DSLR zu kaufen oder zu leihen; die Ergebnisse sind hundertmal besser.
  • Reality Composer für iOS hat eine eigene Funktion, um Objekte per LIDAR zu erfassen.
    Ich war enttäuscht, als ich herausfand, dass auf Apple-Geräten ohne LIDAR nicht stattdessen auf Photogrammetrie ausgewichen wird. Das ist ein Hinweis für Leute wie mich, die 3D-Modellierung oder Photogrammetrie machen wollen.

    • Beim 3D-Scannen hatte ich mit Heges den größten Erfolg. LiDAR funktioniert bei großen Objekten wie Autos ziemlich gut, und mit der Face-ID-Tiefenkamera lassen sich auch kleine Objekte erfassen.
      Für das Scannen kleiner Objekte habe ich auf TikTok für etwa 100 Dollar einen Creality Ferret SE gekauft, der hervorragend ist.
    • Polycam hat einen alternativen Weg.
      Ich habe auch Gutes gehört: Canvas benötigt LiDAR, während es bei Scaniverse optional ist.
  • Tiefenkarten und semantische Karten sind ziemlich unterhaltsam anzusehen, und wenn man sie in Programme wie TouchDesigner, Blender oder Cinema 4D einspeist, lassen sich aus Fotos schöne Tiefeneffekte erzeugen.
    Man kann sie auch für die Fotobearbeitung nutzen, und letztlich verwendet Apple sie ebenfalls dafür.
    Früher wurden sie nur im Porträtmodus gespeichert, aber neuere iPhones speichern sie fast automatisch, sobald in der Szene Menschen oder Haustiere erkannt werden.
    Ich entwickle Foto-Apps und -Tools (https://heliographe.net); eines davon, Matte Viewer, dient dazu, solche Daten anzusehen und zu exportieren: https://apps.apple.com/us/app/matte-viewer/id6476831058

  • Die Auflösung von LIDAR selbst ist deutlich niedriger als die im Beitrag gezeigte Tiefenkarte. Sie muss durch Fusion von LIDAR- und normalen Kameradaten erzeugt werden.

    • Ich dachte ebenfalls, dass LIDAR für das eigentliche Fokussieren verwendet wird und die Tiefenkarte aus der Parallaxe mehrerer Kameras berechnet wird.
  • Der Artikel behandelt die HDR Gain Map ziemlich ausführlich, aber mir ist nicht ganz klar, warum das mit der Tiefenkarte zusammenhängt.
    Ich frage mich, ob man die Verarbeitung rund um die HDR Gain Map überspringen und die Tiefenkarte trotzdem beibehalten kann.
    Persönlich mag ich die HDR-Darstellung des iPhone nicht, weil sie die Bildschirmhelligkeit über die vom Nutzer festgelegte maximale Helligkeit hinaus erhöht. In meinen Fotos versuche ich, die HDR Gain Map zu entfernen.
    Früher bedeutete HDR, drei Aufnahmen zu machen und zusammenzuführen, um unter- und überbelichtete Bereiche zu entfernen; das resultierende Bild trug keine separate Information mit sich herum, dass es HDR sei.

    • Beim Lesen des Artikels hatte ich denselben Gedanken und fragte mich, ob ich etwas übersehen hatte. Der Überblick über Tiefenkarten war gut, aber je weiter es ging, desto mehr drehte sich fast alles um Gain Maps und verschiedene Dateiformate, wodurch es etwas zerfasert wirkte.
    • In den Photos-Einstellungen kann man die Anzeige für Display Enhanced HDR deaktivieren.
  • Ich frage mich, ob man mit einer Tiefenkarte Stereogramme oder SIRDS erstellen kann. Ich erinnere mich, dass ich früher einmal aus einem sehr ähnlichen Graustufenbild ein Stereogramm erzeugt habe.

    • Das geht bereits. Allerdings scheint diese UI nur in der visionOS-Version der Photos-App enthalten zu sein.
      Wenn ein Foto im Album eine Tiefenkarte hat oder die Auflösung hoch genug ist, damit eine Machine-Learning-Näherung ausreichend gut funktioniert, kann man es in das „Spatial Format“ umwandeln.
      Es liest auch die EXIF-Daten aus und „skaliert“ die physische Größe des Bildes passend zum ursprünglichen Bildwinkel der Aufnahme. Deshalb erscheinen Weitwinkelaufnahmen im VR-Raum physisch deutlich größer als Teleaufnahmen.
      Für mich rechtfertigen allein dieser Button und diese Funktion die 4.000 Dollar, die ich für das Gerät ausgegeben habe. Fotos, die ich 2007 mit einer Nikon D7 aufgenommen habe, in vollständigem 3D und im richtigen Maßstab zu sehen, hat längst vergessene Nostalgie und Erinnerungen wachgerufen und war ziemlich emotional.
      Dass Apple das nicht als zentrales Verkaufsargument der Vision Pro herausstellt, ist ein Fehler. Es ist wirklich großartig.
  • Ich frage mich, ob Apple das für die Funktion „create sticker“ nutzt, bei der man ein Motiv in einem Foto lange drücken und daraus einen Sticker machen oder es in ein anderes Bild kopieren kann.

    • Das halte ich für praktisch ausgeschlossen. Diese Funktion funktioniert bei allen Bildern, unabhängig von ihrer Herkunft.
      Tiefeninformationen wären vermutlich auch gar nicht besonders hilfreich. Dann würde fast der gesamte Boden oder Tisch, auf dem das Motiv steht, mit einbezogen.
      Das ist wahrscheinlich ein Ansatz der semantischen Segmentierung, der ausschließlich Machine Learning nutzt.
    • Da es auch bei Fotos funktioniert, die nicht mit einem iPhone aufgenommen wurden, wird es wohl eine reine Machine-Learning-Methode sein.
  • Ich warte auf den Tag, an dem jede Smartphone-Hardware standardmäßig ohne teure Sensoren 3D-Bilder per Gaussian splatting aufnehmen kann.
    Der Rechenaufwand mag groß sein, aber wahrscheinlich könnte es günstiger sein, als teure Sensoren hinzuzufügen und das Gewicht zu erhöhen.

  • Die Website verhält sich in Chrome auf iOS seltsam. Wenn man auf der Seite nach unten scrollt, wird die Schrift größer, und wenn man nach oben scrollt, wird sie wieder kleiner, was ziemlich verwirrend ist.
    Trotzdem habe ich oiiotool dadurch zum ersten Mal kennengelernt, und es ist wirklich cool.