- iPhone은 2017년부터 LiDAR, 3D time-of-flight, 구조광 3D 스캔으로 촬영 이미지 안에 Depth Map을 함께 저장해 왔고, iPhone 15 Pro의 HEIC 파일에서도 이를 꺼내 볼 수 있음
- HEIC/HEIF 컨테이너는 원본 이미지뿐 아니라 HDR gain map, Depth Map, 대량의 메타데이터를 함께 담을 수 있어 단순 JPEG보다 분석할 정보가 많음
- Finn Jaeger의 HEIC Shenanigans는 HEIC 내부 이미지와 메타데이터를 분리하고 EXR로 변환하는 Python 스크립트 모음이며, 작성 시점 기준 374줄 규모임
- 예제 HEIC 1.57MB에서 base TIFF 71MB, HDR gain map TIFF 5.9MB, depth TIFF 433KB, metadata JSON 14KB가 생성됐고, Depth Map 해상도는 원본 5712×4284보다 낮은 768×576임
- OpenEXR 변환은 OpenImageIO, OpenColorIO, ACES 설정을 거쳐 SDR, HDR gain map, Depth Map 채널을 조합하며, 최종 EXR 파일은 468MB까지 커짐
iPhone 사진 안의 Depth Map 저장 방식
- Apple은 2017년부터 iPhone 촬영 이미지에 Depth Map을 지원함
- 지원 방식에는 LiDAR 스캐너, 3D time-of-flight scanner-less LIDAR, structured-light 3D 스캔이 포함됨
- Depth Map과 다른 이미지는 HEIF 컨테이너 파일에 함께 저장됨
- HEIF는 여러 이미지와 많은 메타데이터를 담을 수 있음
- 형식은 2013~2015년에 설계됐고, Apple은 2017년에 HEIC 변형을 채택함
- iPhone 촬영 이미지는 이후 기본적으로 HEIC 컨테이너에 저장됨
- Depth Map과 HDR이 필요 없다면 JPEG 형식도 사용할 수 있음
HEIC Shenanigans로 내부 이미지 분리
- Finn Jaeger는 iPhone이 여러 Depth Map을 생성하는 모습을 보여주는 스크린샷을 게시함
- HEIC Shenanigans는 HEIC 컨테이너에서 이미지와 메타데이터를 분리하고 EXR 파일로 변환하는 스크립트를 제공함
- 작성 시점 기준 프로젝트에는 374줄의 Python 코드가 있음
- 예제는 iPhone 15 Pro에서 촬영한 HEIC 이미지를 사용해 Finn의 코드베이스를 따라가는 방식임
실행 환경과 준비 도구
- 실행에는 Python 3.12.3과 여러 CLI 도구가 필요함
jqopenexrlibimage-exiftool-perllibopenexr-devpython3-pippython3.12-venv
libimage-exiftool-perl패키지는 exiftool 12.76+dfsg-1을 설치함- 이 버전은 2024년 1월 말 릴리스됨
- 이후 HEIC 지원 문제 수정 또는 개선을 포함한 릴리스가 최소 10개 있었음
- 예제 단계에는 해당 버전으로 충분하지만, 이후 문제가 생기면 최신 exiftool에서 해결됐을 수 있음
- JSON Convert
jc는 여러 CLI 도구 출력을 JSON으로 바꾸는 데 사용됨 - EXR 이미지는 DJV v2.0.8로 확인함
HEIC에서 Gain Map과 Depth Map 추출
- 예제 HEIC 파일 크기는 1.57MB임
gain_map_extract.py를 실행하면 다음 파일들이 생성됨IMG_E2153_metadata.json: 14KBIMG_E2153_depth_0.tiff: 433KBIMG_E2153_hdrgainmap_48.tiff: 5.9MBIMG_E2153_base.tiff: 71MB
- base TIFF의 EXIF 메타데이터는 다음 특성을 가짐
- 파일 형식: TIFF
- 압축: Uncompressed
- 색상: RGB
- 이미지 크기: 5712×4284
- 메가픽셀: 24.5
- Bits Per Sample: 8 8 8
- HDR Gain Map과 Depth Map은 원본보다 낮은 해상도임
- 원본 이미지: 5712×4284
- HDR Gain Map: 2856×2142
- Depth Map: 768×576
- JSON 메타데이터에는
aux,nclx_profile,primary,xmp등이 포함됨urn:com:apple:photo:2020:aux:hdrgainmap항목은[48]값을 가짐primary크기는[5712, 4284]로 표시됨
- base64로 인코딩된 값을 사람이 읽을 수 있는 형태로 디코딩해 달라는 GitHub 이슈 3개가 등록됨
HEIC를 OpenEXR로 변환하는 흐름
- Academy Software Foundation은 영화, TV, 창작 산업에서 쓰이는 오픈소스 프로젝트와 표준을 후원함
- 회원에는 Academy of Motion Picture Arts and Sciences, Disney, Nvidia, Netflix 등이 포함됨
- OpenEXR는 HDR 이미지 파일 형식임
- 1999년 Industrial Light and Magic이 처음 개발함
- 2003년에 오픈소스로 공개됨
- 시각효과와 3D 렌더링 제작에 사용됨
heic_to_exr.py를 실행하면 iPhone 15 Pro HEIC 이미지가 OpenEXR 파일로 변환됨- 결과 파일 크기는 468MB임
- 변환 스크립트는 OpenImageIO의 이미지 처리 도구인
oiiotool을 여러 차례 호출함
EXR 생성 단계의 채널 구성
- 먼저
oiiotool --info로 소스 이미지의 크기를 확인함 - base 이미지는 RGB 채널을
sdr.R,sdr.G,sdr.B로 이름 붙이고 색 공간을 변환함- sRGB 곡선에서 Linear Rec.709를 거침
- Linear P3-D65에서 ACEScg로 변환함
- 색상 변환에는 OpenColorIO 설정 파일이 사용됨
- 사용된 OCIO 파일은
studio-config-v1.0.0_aces-v1.3_ocio-v2.1.ocio - 해당 파일은 텍스트 기반이며 1,242줄로 구성됨
- 설명에는
Academy Color Encoding System - Studio Config [COLORSPACES v1.0.0] [ACES v1.3] [OCIO v2.1]가 포함됨
- 사용된 OCIO 파일은
- HDR gain map은 TIFF의 Y 채널을 사용해 EXR로 생성됨
gainmap.Y채널로 이름 붙임- 크기는 4032×3024로 리사이즈함
- Rec.709 곡선에서 Linear로 변환함
- gain map은 Y 채널을 세 번 복제해 RGB로 바뀜
gainmap.Rgainmap.Ggainmap.B
exiftool로HDRGainMapHeadroom값을 추출한 뒤, gain map은 해당 headroom 값의 역수를 사용해 스케일링됨- HDR base 이미지는 base 이미지와 스케일된 gain map을 곱해 생성됨
- Depth Map은 TIFF의 Y 채널로 EXR 형식의
depth.Y채널을 생성함- 크기는 4032×3024로 리사이즈함
- 최종 EXR 파일은 여러 채널을 순서대로 추가해 구성됨
- HDR base의
R,G,B - SDR base의
sdr.R,sdr.G,sdr.B - gain map의
gainmap.R,gainmap.G,gainmap.B - Depth Map의
depth.Y
- HDR base의
- 소스 이미지에 matte가 있었다면 해당 단계에서 matte 레이어도 처리되고 추가됨
- 최종
final.exr파일은 소스 이미지 옆에<prefix>_acesCG.exr이름으로 이동됨