2 pontos por GN⁺ 2025-06-06 | 1 comentários | Compartilhar no WhatsApp
  • Desde 2017, o iPhone vem salvando junto às imagens capturadas um Depth Map, usando LiDAR, 3D time-of-flight e varredura 3D por luz estruturada, e isso também pode ser extraído dos arquivos HEIC do iPhone 15 Pro
  • O contêiner HEIC/HEIF pode armazenar não só a imagem original, mas também HDR gain map, Depth Map e uma grande quantidade de metadados, oferecendo muito mais informação para análise do que um JPEG simples
  • O HEIC Shenanigans, de Finn Jaeger, é uma coleção de scripts em Python para separar imagens internas e metadados do HEIC e convertê-los para EXR; no momento da escrita, o projeto tinha 374 linhas
  • Em um HEIC de exemplo de 1,57 MB, foram gerados um TIFF base de 71 MB, um TIFF de HDR gain map de 5,9 MB, um TIFF de depth de 433 KB e um JSON de metadados de 14 KB; a resolução do Depth Map é 768×576, menor que a original de 5712×4284
  • A conversão para OpenEXR passa por OpenImageIO, OpenColorIO e configuração ACES para combinar os canais de SDR, HDR gain map e Depth Map, e o arquivo EXR final chega a 468 MB

Como o Depth Map é armazenado dentro das fotos do iPhone

  • A Apple oferece suporte a Depth Map nas imagens capturadas pelo iPhone desde 2017
  • O Depth Map e outras imagens são armazenados juntos em um arquivo contêiner HEIF
    • O HEIF pode conter várias imagens e muitos metadados
    • O formato foi projetado entre 2013 e 2015, e a Apple adotou a variação HEIC em 2017
  • Desde então, as imagens capturadas no iPhone são salvas por padrão em um contêiner HEIC
    • Se não houver necessidade de Depth Map e HDR, também é possível usar o formato JPEG

Separando as imagens internas com HEIC Shenanigans

  • Finn Jaeger publicou capturas de tela mostrando o iPhone gerando vários Depth Maps
  • O HEIC Shenanigans fornece scripts para separar imagens e metadados do contêiner HEIC e convertê-los em arquivos EXR
    • No momento da escrita, o projeto tinha 374 linhas de código Python
  • O exemplo segue o codebase de Finn usando uma imagem HEIC fotografada com um iPhone 15 Pro

Ambiente de execução e ferramentas necessárias

  • A execução exige Python 3.12.3 e várias ferramentas de linha de comando
    • jq
    • openexr
    • libimage-exiftool-perl
    • libopenexr-dev
    • python3-pip
    • python3.12-venv
  • O pacote libimage-exiftool-perl instala o exiftool 12.76+dfsg-1
    • Essa versão foi lançada no fim de janeiro de 2024
    • Depois disso, houve pelo menos 10 releases com correções ou melhorias relacionadas ao suporte a HEIC
    • Para as etapas do exemplo essa versão basta, mas, se surgir algum problema depois, ele pode já ter sido resolvido no exiftool mais recente
  • O JSON Convert jc é usado para transformar a saída de várias ferramentas CLI em JSON
  • As imagens EXR foram verificadas com o DJV v2.0.8

Extraindo Gain Map e Depth Map do HEIC

  • O arquivo HEIC de exemplo tem 1,57 MB
  • Ao executar gain_map_extract.py, os seguintes arquivos são gerados
    • 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
  • Os metadados EXIF do TIFF base têm as seguintes características
    • Formato do arquivo: TIFF
    • Compressão: Uncompressed
    • Cor: RGB
    • Tamanho da imagem: 5712×4284
    • Megapixels: 24.5
    • Bits Per Sample: 8 8 8
  • O HDR Gain Map e o Depth Map têm resolução menor que a da imagem original
    • Imagem original: 5712×4284
    • HDR Gain Map: 2856×2142
    • Depth Map: 768×576
  • Os metadados JSON incluem aux, nclx_profile, primary, xmp e outros
    • O item urn:com:apple:photo:2020:aux:hdrgainmap tem o valor [48]
    • O tamanho de primary aparece como [5712, 4284]
  • Foram registrados três issues no GitHub pedindo a decodificação, em formato legível por humanos, dos valores codificados em base64

Fluxo de conversão de HEIC para OpenEXR

  • A Academy Software Foundation apoia projetos e padrões open source usados na indústria de cinema, TV e criação
    • Entre os membros estão Academy of Motion Picture Arts and Sciences, Disney, Nvidia, Netflix e outros
  • O OpenEXR é um formato de arquivo de imagem HDR
    • Foi desenvolvido inicialmente pela Industrial Light and Magic em 1999
    • Tornou-se open source em 2003
    • É usado na produção de efeitos visuais e renderização 3D
  • Ao executar heic_to_exr.py, a imagem HEIC do iPhone 15 Pro é convertida em um arquivo OpenEXR
    • O arquivo resultante tem 468 MB
  • O script de conversão chama várias vezes o oiiotool, ferramenta de processamento de imagem do OpenImageIO

Composição dos canais na etapa de geração do EXR

  • Primeiro, usa-se oiiotool --info para verificar o tamanho da imagem de origem
  • A imagem base renomeia os canais RGB para sdr.R, sdr.G, sdr.B e faz conversão de espaço de cor
    • Passa da curva sRGB para Linear Rec.709
    • Converte de Linear P3-D65 para ACEScg
  • A conversão de cor usa um arquivo de configuração do OpenColorIO
    • O arquivo OCIO usado é studio-config-v1.0.0_aces-v1.3_ocio-v2.1.ocio
    • Esse arquivo é baseado em texto e tem 1.242 linhas
    • A descrição inclui Academy Color Encoding System - Studio Config [COLORSPACES v1.0.0] [ACES v1.3] [OCIO v2.1]
  • O HDR gain map usa o canal Y do TIFF para gerar um EXR
    • Ele é nomeado como canal gainmap.Y
    • É redimensionado para 4032×3024
    • É convertido da curva Rec.709 para Linear
  • O gain map é transformado em RGB duplicando o canal Y três vezes
    • gainmap.R
    • gainmap.G
    • gainmap.B
  • Depois de extrair o valor HDRGainMapHeadroom com exiftool, o gain map é escalado usando o inverso desse valor de headroom
  • A imagem base HDR é criada multiplicando a imagem base pelo gain map escalado
  • O Depth Map usa o canal Y do TIFF para gerar o canal EXR depth.Y
    • Ele é redimensionado para 4032×3024
  • O arquivo EXR final é montado adicionando vários canais em sequência
    • R, G, B da base HDR
    • sdr.R, sdr.G, sdr.B da base SDR
    • gainmap.R, gainmap.G, gainmap.B do gain map
    • depth.Y do Depth Map
  • Se a imagem de origem tivesse matte, essa camada também seria processada e adicionada nessa etapa
  • O arquivo final.exr é movido ao lado da imagem de origem com o nome <prefix>_acesCG.exr

1 comentários

 
GN⁺ 2025-06-06
Opiniões no Hacker News
  • Como outros comentários apontaram corretamente, a resolução do LIDAR é baixa demais para ser usada como principal dado do mapa de profundidade
    Pelo que sei, o iPhone obtém dados de profundidade de aproximadamente quatro maneiras, dependendo do modelo e da câmera. Antes, esses mapas de profundidade eram salvos apenas no modo Retrato, mas os iPhones recentes parecem salvá-los também em fotos comuns

    1. Desde o iPhone 7 Plus, as duas câmeras traseiras fotografam simultaneamente e criam um mapa de profundidade por paralaxe, como a visão humana. Naturalmente, ele fica limitado ao campo de visão da lente mais estreita
    2. Em modelos com apenas uma câmera traseira, como o iPhone XR, a profundidade aproximada é estimada pelos pixels de foco do sensor, e o dado bruto de baixa resolução e impreciso é corrigido com aprendizado de máquina: https://www.lux.camera/iphone-xr-a-deep-dive-into-depth/
    3. No iPhone SE, que nem tinha pixels de foco, o mapa de profundidade era criado apenas com aprendizado de máquina; tinha a menor correlação com a realidade e podia até ser enganado por uma foto de uma foto: https://www.lux.camera/iphone-se-the-one-eyed-king/
    4. Selfies em iPhones com FaceID criam o mapa de profundidade com o escaneamento 3D da câmera TrueDepth. Na selfie do artigo, isso também parece mais borrado e de menor resolução
      As imagens auxiliares mostradas no artigo, que marcam pessoas, óculos, cabelo e pele em branco, são chamadas pela Apple de portrait effects mattes e são geradas por aprendizado de máquina
      Antigamente, criei um app que usava mapas de profundidade e portrait effects mattes de fotos em modo Retrato para fazer filtros criativos, e foi bem divertido, mas ele já saiu do ar. Há muitas novas possibilidades artísticas nos mapas de profundidade
    • iPhones recentes salvam mapas de profundidade até no modo de foto padrão quando há pessoas ou animais de estimação na cena
      Fiquei curioso para saber qual era o nome desse app e se ainda existe algum vídeo. Eu também fiz uma pequena ferramenta chamada Matte Viewer, como parte de uma série de ferramentas de fotografia; ela não tem efeitos, só visualização e exportação: https://apps.apple.com/us/app/matte-viewer/id6476831058
    • https://lookingglassfactory.com é um porta-retratos holográfico capaz de mostrar em 3D real fotos do iPhone que contêm mapas de profundidade
    • O artigo sobre o método 3 é de 5 anos atrás, então hoje também vale olhar o ml-depth-pro da Apple: https://github.com/apple/ml-depth-pro?tab=readme-ov-file
    • O LIDAR é otimizado principalmente para foco automático rápido e foco em baixa luz, mais do que para criar mapas de profundidade em resolução total
    • Fico curioso se o método 4 poderia ser usado em apps de segurança para detecção de vivacidade
  • Artigo interessante. Esses mapas de profundidade parecem ser usados no desfoque de fundo por profundidade de campo do modo “Retrato”, ou seja, no bokeh falso
    Sempre achei interessante poder mudar o foco depois de tirar a foto e ajustar a profundidade de campo pela “abertura”, mas o formato do bokeh falso é ruim. Sempre parece um Photoshop malfeito
    Parece haver um erro de digitação na indicação do formato do arquivo: “HEIC” 14 vezes, “HIEC” 3 vezes

    • Acho que parece falso porque a óptica real e a matemática da abertura foram implementadas de forma errada, usando uma aproximação muito ruim que, do ponto de vista de produto, satisfaz 80% das pessoas
      Parece possível criar um app de câmera melhor com a matemática correta da abertura, mas fico me perguntando se as pessoas pagariam por isso ou se usuários de celular nem perceberiam a diferença nem se importariam
    • O erro de digitação foi corrigido
    • Como fotógrafo, acho o bokeh falso difícil de suportar. Não tem nada a ver com o bokeh de uma boa lente e é terrivelmente artificial; é surpreendente que as pessoas o considerem bonito
      Se você quer retratos bonitos, comprar ou pegar emprestada uma DSLR barata dá um resultado 100 vezes melhor
  • O Reality Composer para iOS tem um recurso dedicado para capturar objetos usando LIDAR
    Fiquei decepcionado ao descobrir que, em dispositivos Apple sem LIDAR, ele não é substituído por fotogrametria. Isso serve de referência para quem, como eu, quer trabalhar com modelagem 3D ou fotogrametria

    • Tive mais sucesso em escaneamento 3D com o Heges. O LiDAR funciona bastante bem para objetos grandes, como carros, e a câmera de profundidade do Face ID também consegue capturar objetos pequenos
      Comprei no TikTok um Creality Ferret SE por cerca de US$ 100 para escanear objetos pequenos, e ele é excelente
    • O Polycam tem um caminho alternativo
      Também ouvi boas avaliações dizendo que o Canvas exige LiDAR, enquanto no Scaniverse o LiDAR é opcional
  • Mapas de profundidade e mapas semânticos são bem divertidos de ver e, se você os colocar em programas como TouchDesigner, Blender ou Cinema 4D, dá para criar efeitos de profundidade interessantes a partir de fotos
    Eles também podem ser usados no processamento de imagens, e a própria Apple acaba usando para isso
    Antes eram salvos apenas no modo Retrato, mas iPhones recentes os salvam quase automaticamente quando detectam pessoas ou animais de estimação na cena
    Estou criando apps e ferramentas de fotografia (https://heliographe.net), e uma delas, Matte Viewer, é uma ferramenta para visualizar e exportar esses dados: https://apps.apple.com/us/app/matte-viewer/id6476831058

  • A resolução do LIDAR em si é muito menor do que a do mapa de profundidade mostrado no artigo. Ele precisa ser criado combinando dados do LIDAR e da câmera comum

    • Eu também achava que o LIDAR era usado para o foco real, e que o mapa de profundidade era calculado pela paralaxe entre várias câmeras
  • O texto trata de mapas de ganho HDR por bastante tempo, mas não entendo bem por que isso estaria relacionado ao mapa de profundidade
    Fico curioso se dá para pular o processamento relacionado ao mapa de ganho HDR e ainda manter o mapa de profundidade
    Pessoalmente, não gosto da exibição HDR do iPhone. Isso porque ela aumenta o brilho da tela acima do brilho máximo definido pelo usuário. Nas minhas fotos, tento remover o mapa de ganho HDR
    Antigamente, HDR significava tirar três fotos e combiná-las para remover áreas subexpostas e superexpostas, e a imagem resultante não carregava uma informação separada dizendo que era HDR

    • Também pensei a mesma coisa enquanto lia o texto e fiquei achando que talvez eu tivesse deixado passar algo. A visão geral do mapa de profundidade foi boa, mas, conforme avançava, a maior parte passou a tratar de mapas de ganho e vários formatos de arquivo, então achei um pouco disperso
    • Nas configurações do Fotos, é possível desativar a exibição de HDR aprimorado de tela
  • Fico curioso se dá para criar estereogramas ou SIRDS a partir do mapa de profundidade. Lembro de já ter gerado estereogramas a partir de imagens em tons de cinza muito parecidas há muito tempo

    • Isso já é possível. Só que essa UI parece existir apenas na versão para visionOS do app Fotos
      Se uma foto do álbum tiver um mapa de profundidade, ou se a resolução for alta o suficiente para uma aproximação por aprendizado de máquina funcionar bem, dá para convertê-la para “Spatial Format”
      Ele também lê o EXIF e “escala” o tamanho físico da imagem para corresponder ao ângulo de visão original da captura. Por isso, fotos grande-angulares aparecem fisicamente muito maiores no espaço de VR do que fotos tiradas com teleobjetiva
      Pessoalmente, só esse botão e essa função já justificam os 4.000 dólares que gastei no dispositivo. Ver fotos que tirei em 2007 com uma Nikon D7 em 3D completo e na escala correta trouxe de volta uma nostalgia e lembranças há muito esquecidas, e foi bem emocionante
      É um erro a Apple não apresentar isso como um dos principais argumentos de venda do Vision Pro. É realmente incrível
  • Fico curioso se a Apple usa isso no recurso “create sticker”, que permite pressionar e segurar um sujeito em uma foto para transformá-lo em figurinha ou copiá-lo para outra imagem

    • Acho que definitivamente não. Esse recurso funciona em qualquer imagem, independentemente da origem
      A informação de profundidade provavelmente também não ajudaria muito na prática. Se fosse usada assim, acabaria incluindo quase todo o chão ou a mesa onde o sujeito está
      Isso provavelmente é uma abordagem de segmentação semântica usando apenas aprendizado de máquina
    • Como funciona também em fotos que não foram tiradas com iPhone, deve ser um método que usa apenas aprendizado de máquina
  • Estou esperando o dia em que todo hardware de celular consiga, por padrão, capturar imagens 3D usando Gaussian splatting, sem sensores caros
    O custo computacional pode ser alto, mas talvez ainda seja mais barato do que adicionar sensores caros e aumentar o peso

  • O site se comporta de forma estranha no Chrome do iOS. Quando rolo a página para baixo, o tamanho da fonte aumenta; quando rolo para cima, diminui de novo, o que é bem confuso
    Ainda assim, eu não conhecia o oiiotool, e ele é muito bacana