2 puntos por GN⁺ 2025-06-06 | 1 comentarios | Compartir por WhatsApp
  • Desde 2017, el iPhone guarda junto con las imágenes capturadas un Depth Map usando LiDAR, 3D time-of-flight y escaneo 3D de luz estructurada, y también se puede extraer de los archivos HEIC del iPhone 15 Pro
  • El contenedor HEIC/HEIF puede incluir no solo la imagen original, sino también un HDR gain map, un Depth Map y una gran cantidad de metadatos, por lo que ofrece más información para analizar que un JPEG simple
  • HEIC Shenanigans de Finn Jaeger es una colección de scripts en Python para separar las imágenes internas y los metadatos dentro de un HEIC y convertirlos a EXR; al momento de escribirse, tiene 374 líneas
  • A partir de un HEIC de ejemplo de 1.57MB, se generaron un TIFF base de 71MB, un HDR gain map TIFF de 5.9MB, un depth TIFF de 433KB y un JSON de metadatos de 14KB; la resolución del Depth Map es 768×576, menor que la original de 5712×4284
  • La conversión a OpenEXR combina los canales SDR, HDR gain map y Depth Map mediante OpenImageIO, OpenColorIO y configuración ACES, y el archivo EXR final llega a crecer hasta 468MB

Cómo se guarda el Depth Map dentro de una foto de iPhone

  • Apple admite Depth Map en las imágenes capturadas con iPhone desde 2017
  • El Depth Map y otras imágenes se guardan juntos dentro del contenedor HEIF
    • HEIF puede almacenar varias imágenes y una gran cantidad de metadatos
    • El formato fue diseñado entre 2013 y 2015, y Apple adoptó su variante HEIC en 2017
  • Desde entonces, las imágenes tomadas con iPhone se guardan por defecto en el contenedor HEIC
    • Si no se necesitan Depth Map ni HDR, también puede usarse el formato JPEG

Separar imágenes internas con HEIC Shenanigans

  • Finn Jaeger publicó capturas de pantalla que muestran cómo el iPhone genera varios Depth Map
  • HEIC Shenanigans ofrece scripts para separar imágenes y metadatos del contenedor HEIC y convertirlos a archivos EXR
    • Al momento de escribirse, el proyecto tiene 374 líneas de código Python
  • El ejemplo sigue el código de Finn usando una imagen HEIC tomada con un iPhone 15 Pro

Entorno de ejecución y herramientas necesarias

  • Para ejecutarlo se requieren Python 3.12.3 y varias herramientas CLI
    • jq
    • openexr
    • libimage-exiftool-perl
    • libopenexr-dev
    • python3-pip
    • python3.12-venv
  • El paquete libimage-exiftool-perl instala exiftool 12.76+dfsg-1
    • Esa versión se lanzó a finales de enero de 2024
    • Después hubo al menos 10 lanzamientos con correcciones o mejoras relacionadas con el soporte de HEIC
    • Para los pasos del ejemplo esa versión es suficiente, pero si luego surge algún problema, es posible que ya se haya resuelto en una versión más reciente de exiftool
  • JSON Convert jc se usa para convertir a JSON la salida de varias herramientas CLI
  • Las imágenes EXR se revisaron con DJV v2.0.8

Extraer Gain Map y Depth Map desde HEIC

  • El archivo HEIC de ejemplo tiene un tamaño de 1.57MB
  • Al ejecutar gain_map_extract.py se generan los siguientes archivos
    • IMG_E2153_metadata.json: 14KB
    • IMG_E2153_depth_0.tiff: 433KB
    • IMG_E2153_hdrgainmap_48.tiff: 5.9MB
    • IMG_E2153_base.tiff: 71MB
  • Los metadatos EXIF del TIFF base tienen las siguientes características
    • Formato de archivo: TIFF
    • Compresión: Uncompressed
    • Color: RGB
    • Tamaño de imagen: 5712×4284
    • Megapíxeles: 24.5
    • Bits Per Sample: 8 8 8
  • El HDR Gain Map y el Depth Map tienen una resolución menor que la imagen original
    • Imagen original: 5712×4284
    • HDR Gain Map: 2856×2142
    • Depth Map: 768×576
  • Los metadatos JSON incluyen aux, nclx_profile, primary, xmp y otros
    • La entrada urn:com:apple:photo:2020:aux:hdrgainmap tiene el valor [48]
    • El tamaño de primary aparece como [5712, 4284]
  • Se abrieron 3 issues en GitHub pidiendo decodificar valores codificados en base64 a un formato legible para humanos

Flujo para convertir HEIC a OpenEXR

  • La Academy Software Foundation patrocina proyectos y estándares open source usados en cine, TV e industrias creativas
    • Entre sus miembros están Academy of Motion Picture Arts and Sciences, Disney, Nvidia y Netflix
  • OpenEXR es un formato de archivo de imagen HDR
    • Fue desarrollado por primera vez en 1999 por Industrial Light and Magic
    • Se publicó como open source en 2003
    • Se usa en producción de efectos visuales y renderizado 3D
  • Al ejecutar heic_to_exr.py, la imagen HEIC del iPhone 15 Pro se convierte en un archivo OpenEXR
    • El archivo resultante pesa 468MB
  • El script de conversión llama varias veces a oiiotool, la herramienta de procesamiento de imágenes de OpenImageIO

Composición de canales en la generación del EXR

  • Primero se verifica el tamaño de la imagen fuente con oiiotool --info
  • A la imagen base se le asignan los canales RGB como sdr.R, sdr.G, sdr.B y se convierte el espacio de color
    • Pasa de la curva sRGB a Linear Rec.709
    • Se convierte de Linear P3-D65 a ACEScg
  • Para la conversión de color se usa un archivo de configuración de OpenColorIO
    • El archivo OCIO usado es studio-config-v1.0.0_aces-v1.3_ocio-v2.1.ocio
    • Ese archivo está basado en texto y consta de 1,242 líneas
    • Su descripción incluye Academy Color Encoding System - Studio Config [COLORSPACES v1.0.0] [ACES v1.3] [OCIO v2.1]
  • El HDR gain map se genera en EXR usando el canal Y del TIFF
    • Se nombra como canal gainmap.Y
    • Se redimensiona a 4032×3024
    • Se convierte de la curva Rec.709 a Linear
  • El gain map se transforma a RGB duplicando tres veces el canal Y
    • gainmap.R
    • gainmap.G
    • gainmap.B
  • Después de extraer con exiftool el valor HDRGainMapHeadroom, el gain map se escala usando el inverso de ese valor de headroom
  • La imagen base HDR se genera multiplicando la imagen base por el gain map escalado
  • El Depth Map genera el canal EXR depth.Y a partir del canal Y del TIFF
    • Se redimensiona a 4032×3024
  • El archivo EXR final se compone agregando varios canales en orden
    • R, G, B de la base HDR
    • sdr.R, sdr.G, sdr.B de la base SDR
    • gainmap.R, gainmap.G, gainmap.B del gain map
    • depth.Y del Depth Map
  • Si la imagen fuente tuviera matte, esa capa también se procesaría y se añadiría en esa etapa
  • El archivo final.exr se mueve junto a la imagen fuente con el nombre <prefix>_acesCG.exr

1 comentarios

 
GN⁺ 2025-06-06
Opiniones en Hacker News
  • Como señalaron correctamente otros comentarios, la resolución de LIDAR es demasiado baja para usarse como fuente principal de un mapa de profundidad.
    Tengo entendido que el iPhone obtiene datos de profundidad de unas cuatro maneras, según el modelo y la cámara. Antes estos mapas de profundidad solo se guardaban en el modo retrato, pero parece que los iPhone recientes también los guardan en fotos normales.

    1. Desde el iPhone 7 Plus, se capturan imágenes simultáneamente con las dos cámaras traseras y se crea un mapa de profundidad mediante paralaje, como en la visión humana. Naturalmente queda limitado al ángulo de visión del lente más estrecho.
    2. Los modelos con una sola cámara trasera, como el iPhone XR, estiman una profundidad aproximada con los píxeles de enfoque del sensor y corrigen con machine learning el resultado original, que es de baja resolución e impreciso: https://www.lux.camera/iphone-xr-a-deep-dive-into-depth/
    3. En el iPhone SE, que ni siquiera tiene píxeles de enfoque, el mapa de profundidad se generaba solo con machine learning, y como era el que menos correlación tenía con la realidad, incluso podía ser engañado por una foto de una foto: https://www.lux.camera/iphone-se-the-one-eyed-king/
    4. Las selfies en iPhone con FaceID generan el mapa de profundidad mediante el escaneo 3D de la cámara TrueDepth. También en la selfie del artículo se ve más borroso y como de menor resolución.
      Las imágenes auxiliares del artículo que muestran en blanco a la persona, los lentes, el cabello y la piel son lo que Apple llama portrait effects mattes, y se generan con machine learning.
      Hace tiempo hice una app que usaba los mapas de profundidad y los portrait effects mattes de las fotos en modo retrato para crear filtros creativos; fue bastante divertida, pero ya no está disponible. Los mapas de profundidad tienen muchas posibilidades artísticas nuevas.
    • Los iPhone recientes guardan mapas de profundidad incluso en el modo de foto predeterminado si hay una persona o una mascota en la escena.
      Me da curiosidad cuál era el nombre de esa app y si queda algún video. Yo también hice una herramienta pequeña llamada Matte Viewer como parte de una serie de herramientas fotográficas; no tiene efectos, solo permite ver y exportar: https://apps.apple.com/us/app/matte-viewer/id6476831058
    • https://lookingglassfactory.com es un marco holográfico de imágenes que puede mostrar en 3D real fotos de iPhone que incluyen mapas de profundidad.
    • Ese artículo sobre el método 3 es de hace 5 años, así que ahora también habría que ver ml-depth-pro de Apple: https://github.com/apple/ml-depth-pro?tab=readme-ov-file
    • LIDAR está optimizado principalmente para un enfoque automático rápido y para enfocar con poca luz, más que para crear mapas de profundidad a resolución completa.
    • Me pregunto si el método 4 podría usarse en apps de seguridad para detección de presencia de vida.
  • Es un artículo interesante. Estos mapas de profundidad parecen usarse para el desenfoque de fondo por profundidad de campo en el modo “retrato”, es decir, para el bokeh falso.
    Siempre me pareció interesante que, incluso después de tomar la foto, se pueda cambiar el foco y ajustar la profundidad de campo con la “apertura”, pero la forma del bokeh falso no me gusta. Siempre se ve como un Photoshop burdo.
    Parece haber un error tipográfico en la notación del formato de archivo: “HEIC” 14 veces, “HIEC” 3 veces.

    • Creo que se ve falso porque implementaron mal la óptica real y las matemáticas de la apertura, y porque desde una perspectiva de producto usan una aproximación muy mala que satisface al 80% de la gente.
      Creo que se podría hacer una mejor app de cámara con matemáticas de apertura correctas, pero me pregunto si la gente pagaría por eso, o si los usuarios de teléfono no notarían la diferencia ni les importaría.
    • Ya corregí el error tipográfico.
    • Como fotógrafo, el bokeh falso es difícil de soportar. No se parece en nada al bokeh de un buen lente y es terriblemente antinatural; me sorprende que la gente piense que se ve bonito.
      Si quieres un buen retrato, comprar o pedir prestada una DSLR barata dará resultados 100 veces mejores.
  • Reality Composer para iOS tiene una función dedicada para capturar objetos usando LIDAR.
    Me decepcionó enterarme de que en dispositivos Apple sin LIDAR no se reemplaza con fotogrametría. Es un dato útil para alguien como yo que quiere hacer modelado 3D o trabajos de fotogrametría.

    • Donde más éxito tuve con escaneo 3D fue con Heges. LiDAR funciona bastante bien para objetos grandes como autos, y con la cámara de profundidad de Face ID también se pueden capturar objetos pequeños.
      Para escanear objetos pequeños compré en TikTok un Creality Ferret SE por unos 100 dólares y es excelente.
    • Polycam tiene una ruta alternativa.
      También escuché buenos comentarios de que Canvas requiere LiDAR, mientras que en Scaniverse LiDAR es opcional.
  • Los mapas de profundidad y mapas semánticos son bastante divertidos de ver, y si los llevas a programas como TouchDesigner, Blender o Cinema 4D puedes crear efectos de profundidad geniales a partir de fotos.
    También pueden usarse para procesamiento de imágenes, y al final Apple también los usa con ese fin.
    Antes solo se guardaban en el modo retrato, pero los iPhone recientes los guardan casi automáticamente cuando detectan una persona o una mascota en la escena.
    Estoy creando apps y herramientas de fotografía (https://heliographe.net), y una de ellas, Matte Viewer, sirve para ver y exportar estos datos: https://apps.apple.com/us/app/matte-viewer/id6476831058

  • La resolución del LIDAR en sí es mucho más baja que la del mapa de profundidad que aparece en el artículo. Tiene que crearse fusionando datos de LIDAR y de la cámara normal.

    • Yo también pensaba que LIDAR se usaba para el enfoque real, y que el mapa de profundidad se calculaba con el paralaje de varias cámaras.
  • El texto trata bastante extensamente el mapa de ganancia HDR, pero no entiendo bien qué tiene que ver eso con el mapa de profundidad.
    Me pregunto si se puede omitir el procesamiento relacionado con el mapa de ganancia HDR y mantener el mapa de profundidad.
    Personalmente no me gusta la visualización HDR del iPhone, porque aumenta el brillo de la pantalla por encima del brillo máximo definido por el usuario. En mis fotos intento eliminar el mapa de ganancia HDR.
    Antes, HDR significaba tomar tres fotos y combinarlas para eliminar las partes subexpuestas y sobreexpuestas, y la imagen resultante no llevaba información separada que indicara que era HDR.

    • Yo también pensé lo mismo al leer el texto y me pregunté si se me estaba escapando algo. La explicación general del mapa de profundidad fue buena, pero hacia el final trataba sobre todo de mapas de ganancia y varios formatos de archivo, así que se sintió un poco disperso.
    • En la configuración de Photos se puede desactivar la visualización de HDR mejorado en pantalla.
  • Me pregunto si con un mapa de profundidad se pueden crear estereogramas o SIRDS. Recuerdo haber generado estereogramas a partir de imágenes en escala de grises muy parecidas hace tiempo.

    • Ya se puede. Aunque parece que esta UI solo está en la versión de visionOS de la app Photos.
      Si una foto del álbum tiene un mapa de profundidad, o si la resolución es lo suficientemente alta como para que la aproximación por aprendizaje automático funcione bien, se puede convertir a “Spatial Format”.
      También lee el EXIF y “escala” el tamaño físico de la imagen según el ángulo de visión original de la toma. Por eso, en un espacio de VR, una foto gran angular se ve físicamente mucho más grande que una foto con teleobjetivo.
      Personalmente, solo este botón y esta función justifican los 4,000 dólares que gasté en el dispositivo. Ver una foto tomada en 2007 con una Nikon D7 en 3D completo y con la escala correcta hizo revivir una nostalgia y recuerdos que tenía muy olvidados, y fue bastante emotivo.
      Es un error que Apple no presente esto como un punto de venta central del Vision Pro. Es realmente increíble.
  • Me pregunto si Apple usa esto para la función “create sticker”, que permite mantener presionado un sujeto en una foto para convertirlo en sticker o copiarlo a otra imagen.

    • Casi seguro que no. Esa función funciona con cualquier imagen, sin importar su origen.
      La información de profundidad probablemente tampoco sería de mucha ayuda en la práctica. Si lo hiciera así, terminaría incluyendo casi todo el piso o la mesa donde está el sujeto.
      Es más probable que sea un enfoque de segmentación semántica que usa solo aprendizaje automático.
    • Como también funciona con fotos que no fueron tomadas con un iPhone, debe ser un método que usa solo aprendizaje automático.
  • Estoy esperando el día en que todo el hardware de los teléfonos pueda tomar imágenes 3D usando Gaussian splatting por defecto, sin sensores caros.
    El costo computacional puede ser alto, pero probablemente sea más barato que agregar sensores caros y aumentar el peso.

  • El sitio se comporta raro en Chrome para iOS. Cuando desplazo la página hacia abajo, el tamaño de la fuente aumenta, y cuando desplazo hacia arriba vuelve a reducirse, lo cual resulta bastante confuso.
    Aun así, no conocía oiiotool y me pareció muy genial.