2 points par GN⁺ 2025-06-06 | 1 commentaires | Partager sur WhatsApp
  • Depuis 2017, l’iPhone enregistre avec les images prises une Depth Map, via LiDAR, 3D time-of-flight et scan 3D par lumière structurée ; on peut aussi l’extraire des fichiers HEIC de l’iPhone 15 Pro
  • Le conteneur HEIC/HEIF peut stocker non seulement l’image d’origine, mais aussi une HDR gain map, une Depth Map et une grande quantité de métadonnées, ce qui offre davantage d’informations à analyser qu’un simple JPEG
  • HEIC Shenanigans de Finn Jaeger est un ensemble de scripts Python qui séparent les images et métadonnées internes d’un fichier HEIC et les convertissent en EXR ; au moment de la rédaction, il compte 374 lignes
  • À partir d’un exemple HEIC de 1,57 Mo ont été générés un TIFF de base de 71 Mo, un TIFF de HDR gain map de 5,9 Mo, un TIFF de depth de 433 Ko et un JSON de métadonnées de 14 Ko ; la résolution de la Depth Map est de 768×576, inférieure aux 5712×4284 de l’original
  • La conversion OpenEXR combine les canaux SDR, HDR gain map et Depth Map en passant par OpenImageIO, OpenColorIO et une configuration ACES ; le fichier EXR final atteint 468 Mo

Comment la Depth Map est stockée dans les photos iPhone

  • Depuis 2017, Apple prend en charge la Depth Map dans les images prises avec l’iPhone
  • La Depth Map et les autres images sont stockées ensemble dans un fichier conteneur HEIF
    • HEIF peut contenir plusieurs images et de nombreuses métadonnées
    • Le format a été conçu entre 2013 et 2015, et Apple a adopté la variante HEIC en 2017
  • Depuis, les images prises avec l’iPhone sont stockées par défaut dans un conteneur HEIC
    • Si la Depth Map et le HDR ne sont pas nécessaires, le format JPEG peut aussi être utilisé

Séparer les images internes avec HEIC Shenanigans

  • Finn Jaeger a publié une capture d’écran montrant l’iPhone générant plusieurs Depth Maps
  • HEIC Shenanigans fournit des scripts pour séparer les images et métadonnées d’un conteneur HEIC et les convertir en fichiers EXR
    • Au moment de la rédaction, le projet contient 374 lignes de Python
  • L’exemple suit la base de code de Finn avec une image HEIC prise avec un iPhone 15 Pro

Environnement d’exécution et outils requis

  • L’exécution nécessite Python 3.12.3 et plusieurs outils CLI
    • jq
    • openexr
    • libimage-exiftool-perl
    • libopenexr-dev
    • python3-pip
    • python3.12-venv
  • Le paquet libimage-exiftool-perl installe exiftool 12.76+dfsg-1
    • Cette version est sortie fin janvier 2024
    • Depuis, au moins 10 versions ont inclus des corrections ou améliorations liées à la prise en charge de HEIC
    • Cette version suffit pour les étapes de l’exemple, mais si des problèmes apparaissent ensuite, ils peuvent avoir été résolus dans une version plus récente d’exiftool
  • JSON Convert jc est utilisé pour convertir en JSON la sortie de plusieurs outils CLI
  • Les images EXR sont vérifiées avec DJV v2.0.8

Extraction de la Gain Map et de la Depth Map depuis HEIC

  • Le fichier HEIC d’exemple pèse 1,57 Mo
  • L’exécution de gain_map_extract.py génère les fichiers suivants
    • IMG_E2153_metadata.json : 14 Ko
    • IMG_E2153_depth_0.tiff : 433 Ko
    • IMG_E2153_hdrgainmap_48.tiff : 5,9 Mo
    • IMG_E2153_base.tiff : 71 Mo
  • Les métadonnées EXIF du TIFF de base présentent les caractéristiques suivantes
    • Format de fichier : TIFF
    • Compression : Uncompressed
    • Couleur : RGB
    • Taille de l’image : 5712×4284
    • Mégapixels : 24,5
    • Bits Per Sample : 8 8 8
  • La HDR Gain Map et la Depth Map ont une résolution inférieure à celle de l’original
    • Image d’origine : 5712×4284
    • HDR Gain Map : 2856×2142
    • Depth Map : 768×576
  • Les métadonnées JSON incluent notamment aux, nclx_profile, primary et xmp
    • L’entrée urn:com:apple:photo:2020:aux:hdrgainmap a la valeur [48]
    • La taille de primary est indiquée sous la forme [5712, 4284]
  • Trois issues GitHub ont été ouvertes pour demander le décodage, sous une forme lisible par un humain, des valeurs encodées en base64

Flux de conversion de HEIC vers OpenEXR

  • L’Academy Software Foundation soutient des projets et standards open source utilisés dans le cinéma, la télévision et les industries créatives
    • Parmi ses membres figurent l’Academy of Motion Picture Arts and Sciences, Disney, Nvidia, Netflix, etc.
  • OpenEXR est un format de fichier d’image HDR
    • Il a été développé initialement par Industrial Light and Magic en 1999
    • Il a été publié en open source en 2003
    • Il est utilisé dans la production d’effets visuels et de rendu 3D
  • L’exécution de heic_to_exr.py convertit l’image HEIC de l’iPhone 15 Pro en fichier OpenEXR
    • Le fichier obtenu pèse 468 Mo
  • Le script de conversion appelle à plusieurs reprises oiiotool, l’outil de traitement d’images d’OpenImageIO

Composition des canaux lors de la génération de l’EXR

  • oiiotool --info est d’abord utilisé pour vérifier la taille de l’image source
  • L’image de base renomme les canaux RGB en sdr.R, sdr.G, sdr.B et convertit l’espace colorimétrique
    • De la courbe sRGB vers Linear Rec.709
    • De Linear P3-D65 vers ACEScg
  • La conversion des couleurs utilise un fichier de configuration OpenColorIO
    • Le fichier OCIO utilisé est studio-config-v1.0.0_aces-v1.3_ocio-v2.1.ocio
    • Ce fichier est basé sur du texte et comporte 1 242 lignes
    • Sa description inclut Academy Color Encoding System - Studio Config [COLORSPACES v1.0.0] [ACES v1.3] [OCIO v2.1]
  • La HDR gain map est générée en EXR à partir du canal Y du TIFF
    • Elle est nommée canal gainmap.Y
    • Sa taille est redimensionnée en 4032×3024
    • Elle est convertie de la courbe Rec.709 vers Linear
  • La gain map devient du RGB en répliquant trois fois le canal Y
    • gainmap.R
    • gainmap.G
    • gainmap.B
  • Après extraction de la valeur HDRGainMapHeadroom avec exiftool, la gain map est mise à l’échelle avec l’inverse de cette valeur de headroom
  • L’image HDR de base est créée en multipliant l’image de base par la gain map mise à l’échelle
  • La Depth Map crée un canal depth.Y au format EXR à partir du canal Y du TIFF
    • Sa taille est redimensionnée en 4032×3024
  • Le fichier EXR final est constitué en ajoutant plusieurs canaux dans l’ordre
    • R, G, B de la base HDR
    • sdr.R, sdr.G, sdr.B de la base SDR
    • gainmap.R, gainmap.G, gainmap.B de la gain map
    • depth.Y de la Depth Map
  • Si l’image source contenait un matte, la couche matte serait également traitée et ajoutée à cette étape
  • Le fichier final final.exr est déplacé à côté de l’image source sous le nom <prefix>_acesCG.exr

1 commentaires

 
GN⁺ 2025-06-06
Avis sur Hacker News
  • Comme d’autres commentaires l’ont justement souligné, la résolution du LIDAR est trop faible pour servir de source principale à une carte de profondeur.
    D’après ce que je sais, l’iPhone obtient les données de profondeur d’environ quatre manières selon le modèle et l’appareil photo. Auparavant, ce type de carte de profondeur n’était enregistré qu’en mode Portrait, mais les iPhone récents semblent aussi l’enregistrer pour les photos ordinaires.

    1. Depuis l’iPhone 7 Plus, les deux caméras arrière prennent une photo simultanément et créent une carte de profondeur à partir de la parallaxe, comme la vision humaine. Elle est naturellement limitée au champ de vision de l’objectif le plus étroit.
    2. Les modèles qui n’ont qu’une seule caméra arrière, comme l’iPhone XR, estiment grossièrement la profondeur avec les pixels de mise au point du capteur, puis corrigent la source basse résolution et imprécise par apprentissage automatique : https://www.lux.camera/iphone-xr-a-deep-dive-into-depth/
    3. Sur l’iPhone SE, qui n’a même pas de pixels de mise au point, la carte de profondeur était produite uniquement par apprentissage automatique ; sa corrélation avec la réalité était la plus faible, au point qu’elle pouvait se faire tromper par une photo d’une photo : https://www.lux.camera/iphone-se-the-one-eyed-king/
    4. Les selfies sur les iPhone équipés de FaceID créent une carte de profondeur à partir du scan 3D de la caméra TrueDepth. Dans les selfies de l’article, elle paraît aussi plus floue et de plus basse résolution.
      Les images auxiliaires de l’article qui marquent en blanc les personnes, les lunettes, les cheveux et la peau sont ce qu’Apple appelle des portrait effects mattes, générées par apprentissage automatique.
      Il y a quelque temps, j’avais créé une app qui utilisait les cartes de profondeur et les portrait effects mattes des photos en mode Portrait pour produire des filtres créatifs ; c’était assez amusant, mais elle n’est plus disponible aujourd’hui. Les cartes de profondeur ouvrent beaucoup de nouvelles possibilités artistiques.
    • Les iPhone récents enregistrent aussi une carte de profondeur en mode photo standard lorsqu’il y a une personne ou un animal de compagnie dans la scène.
      Je me demande quel était le nom de cette app et s’il reste une vidéo. Moi aussi, dans le cadre d’une série d’outils photo, j’ai créé un petit outil appelé Matte Viewer : il n’applique pas d’effets, il permet seulement d’afficher et d’exporter : https://apps.apple.com/us/app/matte-viewer/id6476831058
    • https://lookingglassfactory.com est un cadre d’image holographique capable d’afficher en vraie 3D des photos iPhone contenant une carte de profondeur.
    • L’article sur la méthode n° 3 date d’il y a cinq ans ; aujourd’hui, il faut aussi regarder ml-depth-pro d’Apple : https://github.com/apple/ml-depth-pro?tab=readme-ov-file
    • Le LIDAR est surtout optimisé pour l’autofocus rapide et la mise au point en basse lumière, plutôt que pour créer des cartes de profondeur pleine résolution.
    • Je me demande si la méthode n° 4 pourrait servir à la détection du vivant dans des apps de sécurité.
  • Article intéressant. Ce type de carte de profondeur semble servir au flou d’arrière-plan avec profondeur de champ du mode « Portrait », autrement dit au faux bokeh.
    J’ai toujours trouvé intéressant de pouvoir changer la mise au point après la prise de vue et régler la profondeur de champ avec l’« ouverture », mais l’aspect du faux bokeh ne me plaît pas. On dirait toujours un Photoshop mal fait.
    Il semble y avoir une coquille dans la notation du format de fichier : « HEIC » 14 fois, « HIEC » 3 fois.

    • Si ça paraît faux, c’est probablement parce que la physique optique et les mathématiques de l’ouverture sont mal implémentées, et que, d’un point de vue produit, ils utilisent une très mauvaise approximation qui satisfait 80 % des gens.
      On pourrait sans doute faire une meilleure app photo avec des mathématiques d’ouverture correctes, mais je me demande si les gens paieraient pour ça, ou si les utilisateurs de smartphones ne verraient pas la différence et s’en ficheraient.
    • La coquille a été corrigée.
    • En tant que photographe, j’ai du mal à supporter le faux bokeh. Il n’a rien à voir avec le bokeh d’un bon objectif et paraît terriblement artificiel ; je suis surpris que les gens trouvent ça joli.
      Si l’on veut de beaux portraits, acheter ou emprunter un DSLR bon marché donnera des résultats 100 fois meilleurs.
  • Reality Composer pour iOS dispose d’une fonction dédiée à la capture d’objets avec le LIDAR.
    J’ai été déçu de découvrir que, sur les appareils Apple dépourvus de LIDAR, elle n’est pas remplacée par de la photogrammétrie. C’est bon à savoir pour ceux qui, comme moi, veulent faire de la modélisation 3D ou de la photogrammétrie.

    • C’est avec Heges que j’ai eu le plus de succès pour le scan 3D. Le LiDAR fonctionne assez bien pour de grands objets comme des voitures, et la caméra de profondeur Face ID permet aussi de capturer de petits objets.
      Pour scanner de petits objets, j’ai acheté sur TikTok une Creality Ferret SE à environ 100 dollars, et elle est excellente.
    • Polycam propose une voie alternative.
      J’ai aussi entendu de bons retours disant que Canvas nécessite le LiDAR, tandis que Scaniverse le rend optionnel.
  • Les cartes de profondeur et cartes sémantiques sont assez amusantes à regarder, et si on les importe dans des programmes comme TouchDesigner, Blender ou Cinema 4D, on peut créer de superbes effets de profondeur à partir de photos.
    Elles peuvent aussi servir au traitement photo ; au final, Apple les utilise aussi dans ce but.
    Auparavant, elles n’étaient enregistrées qu’en mode Portrait, mais les iPhone récents les enregistrent presque automatiquement lorsqu’une personne ou un animal de compagnie est détecté dans la scène.
    Je développe des apps et outils photo (https://heliographe.net), et Matte Viewer est l’un d’eux : il sert à visualiser et exporter ces données : https://apps.apple.com/us/app/matte-viewer/id6476831058

  • La résolution propre du LIDAR est bien inférieure à celle de la carte de profondeur montrée dans l’article. Elle doit être produite en fusionnant les données du LIDAR et celles de l’appareil photo classique.

    • Moi aussi, je pensais que le LIDAR servait à la mise au point réelle, et que la carte de profondeur était calculée à partir de la parallaxe de plusieurs caméras.
  • L’article consacre pas mal de place à la gain map HDR, mais je ne vois pas bien le lien avec la carte de profondeur
    Je me demande s’il est possible de conserver la carte de profondeur tout en sautant le traitement lié à la gain map HDR
    Personnellement, je n’aime pas l’affichage HDR de l’iPhone, parce qu’il augmente la luminosité de l’écran au-delà de la luminosité maximale définie par l’utilisateur. J’essaie de supprimer les gain maps HDR de mes photos
    À l’origine, le HDR consistait à prendre trois clichés et à les fusionner en éliminant les zones sous- ou surexposées, et l’image finale ne transportait pas d’information distincte indiquant qu’elle était HDR

    • J’ai eu la même réflexion en lisant l’article, et je me suis demandé si j’avais raté quelque chose. L’aperçu de la carte de profondeur était bon, mais plus on avançait, plus l’article traitait surtout des gain maps et de divers formats de fichiers, ce qui m’a semblé un peu dispersé
    • Dans les réglages de Photos, on peut désactiver l’affichage HDR renforcé pour l’écran
  • Je me demande si l’on peut créer des stéréogrammes ou des SIRDS à partir d’une carte de profondeur. Je me souviens avoir généré des stéréogrammes à partir d’images en niveaux de gris très similaires autrefois

    • C’est déjà possible. Cela dit, cette interface semble n’exister que dans la version visionOS de l’app Photos
      Si une photo d’un album possède une carte de profondeur, ou si sa résolution est suffisamment élevée pour qu’une approximation par apprentissage automatique fonctionne assez bien, on peut la convertir au “Spatial Format”
      Les EXIF sont aussi lus afin de “mettre à l’échelle” la taille physique de l’image en fonction de l’angle de champ de la prise de vue originale. Ainsi, dans un espace VR, une photo au grand-angle apparaît physiquement beaucoup plus grande qu’une photo prise au téléobjectif
      Personnellement, ce bouton et cette fonctionnalité justifient à eux seuls les 4 000 dollars dépensés pour l’appareil. Voir en 3D complète et à la bonne échelle des photos prises en 2007 avec un Nikon D7 a ravivé une nostalgie et des souvenirs longtemps oubliés, et c’était assez émouvant
      Apple fait une erreur en ne présentant pas cela comme un argument de vente central du Vision Pro. C’est vraiment impressionnant
  • Je me demande si Apple utilise cela pour la fonctionnalité “create sticker”, qui permet d’appuyer longuement sur un sujet dans une photo pour en faire un sticker ou le copier dans une autre image

    • Je pense que non, absolument pas. Cette fonctionnalité marche sur toutes les images, quelle que soit leur provenance
      Les informations de profondeur ne seraient probablement pas très utiles non plus en pratique. En procédant ainsi, on inclurait presque entièrement le sol ou la table sur lesquels se trouve le sujet
      Il s’agit probablement d’une approche de segmentation sémantique reposant uniquement sur l’apprentissage automatique
    • Comme cela fonctionne aussi avec des photos qui n’ont pas été prises avec un iPhone, c’est probablement une méthode reposant uniquement sur l’apprentissage automatique
  • J’attends le jour où tout le matériel des smartphones pourra par défaut prendre des images 3D avec du Gaussian splatting, sans capteurs coûteux
    Le coût de calcul pourrait être élevé, mais ce serait probablement moins cher que d’ajouter des capteurs coûteux et d’augmenter le poids

  • Le site se comporte bizarrement dans Chrome sur iOS. Quand on fait défiler la page vers le bas, la taille de la police augmente, puis elle diminue à nouveau quand on remonte, ce qui est assez déroutant
    Cela dit, je découvre oiiotool, et c’est vraiment très chouette