Die Depth Map des iPhone 15 Pro
(tech.marksblogg.com)- 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
- Zu den unterstützten Verfahren gehören LiDAR-Scanner, scannerloses 3D-time-of-flight-LIDAR und structured-light-3D-Scans
- 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
jqopenexrlibimage-exiftool-perllibopenexr-devpython3-pippython3.12-venv
- Das Paket
libimage-exiftool-perlinstalliert 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
jcwird 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.pywerden folgende Dateien erzeugtIMG_E2153_metadata.json: 14 KBIMG_E2153_depth_0.tiff: 433 KBIMG_E2153_hdrgainmap_48.tiff: 5,9 MBIMG_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,primaryundxmp- Der Eintrag
urn:com:apple:photo:2020:aux:hdrgainmaphat den Wert[48] - Die Größe von
primarywird als[5712, 4284]angegeben
- Der Eintrag
- 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.pywird ein HEIC-Bild des iPhone 15 Pro in eine OpenEXR-Datei konvertiert- Die resultierende Datei ist 468 MB groß
- Das Konvertierungsskript ruft mehrfach
oiiotoolauf, das Bildverarbeitungswerkzeug von OpenImageIO
Kanalaufbau bei der EXR-Erzeugung
- Zunächst wird mit
oiiotool --infodie Größe des Quellbilds geprüft - Das Base-Bild benennt die RGB-Kanäle als
sdr.R,sdr.G,sdr.Bund 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]
- Verwendet wurde die OCIO-Datei
- Die HDR-Gain-Map verwendet den Y-Kanal des TIFF, um ein EXR zu erzeugen
- Dieser wird als Kanal
gainmap.Ybenannt - Die Größe wird auf 4032×3024 geändert
- Die Rec.709-Kurve wird nach Linear konvertiert
- Dieser wird als Kanal
- Die Gain Map wird durch dreifaches Kopieren des Y-Kanals in RGB umgewandelt
gainmap.Rgainmap.Ggainmap.B
- Mit
exiftoolwird der WertHDRGainMapHeadroomextrahiert; 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,Bdes HDR-Base-Bildssdr.R,sdr.G,sdr.Bdes SDR-Base-Bildsgainmap.R,gainmap.G,gainmap.Bder Gain Mapdepth.Yder 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.exrwird neben dem Quellbild unter dem Namen<prefix>_acesCG.exrabgelegt
1 Kommentare
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.
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.
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
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.
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.
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.
Für das Scannen kleiner Objekte habe ich auf TikTok für etwa 100 Dollar einen Creality Ferret SE gekauft, der hervorragend ist.
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.
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.
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.
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.
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.
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.