2 điểm bởi GN⁺ 2025-06-06 | 1 bình luận | Chia sẻ qua WhatsApp
  • Từ năm 2017, iPhone đã lưu kèm Depth Map trong ảnh chụp bằng LiDAR, 3D time-of-flight và quét 3D bằng ánh sáng cấu trúc; cũng có thể trích xuất phần này từ tệp HEIC của iPhone 15 Pro
  • Container HEIC/HEIF có thể chứa không chỉ ảnh gốc mà còn HDR gain map, Depth Map và lượng lớn metadata, nên có nhiều thông tin để phân tích hơn JPEG đơn giản
  • HEIC Shenanigans của Finn Jaeger là một bộ script Python để tách ảnh và metadata bên trong HEIC rồi chuyển đổi sang EXR; tại thời điểm viết, dự án có quy mô 374 dòng
  • Từ tệp HEIC ví dụ 1,57MB, tạo ra base TIFF 71MB, HDR gain map TIFF 5,9MB, depth TIFF 433KB và metadata JSON 14KB; độ phân giải của Depth Map là 768×576, thấp hơn ảnh gốc 5712×4284
  • Quá trình chuyển đổi OpenEXR đi qua OpenImageIO, OpenColorIO và cấu hình ACES để kết hợp các kênh SDR, HDR gain map và Depth Map; tệp EXR cuối cùng tăng tới 468MB

Cách lưu Depth Map trong ảnh iPhone

  • Từ năm 2017, Apple đã hỗ trợ Depth Map trong ảnh chụp bằng iPhone
    • Các phương thức hỗ trợ bao gồm máy quét LiDAR, LIDAR không cần scanner dựa trên 3D time-of-flight, và quét 3D bằng structured-light
  • Depth Map và các ảnh khác được lưu cùng nhau trong tệp container HEIF
    • HEIF có thể chứa nhiều ảnh và nhiều metadata
    • Định dạng này được thiết kế trong giai đoạn 2013~2015, và Apple đã áp dụng biến thể HEIC vào năm 2017
  • Ảnh chụp bằng iPhone từ đó về sau mặc định được lưu trong container HEIC
    • Nếu không cần Depth Map và HDR, cũng có thể dùng định dạng JPEG

Tách ảnh bên trong bằng HEIC Shenanigans

  • Finn Jaeger đã đăng ảnh chụp màn hình cho thấy iPhone tạo ra nhiều Depth Map
  • HEIC Shenanigans cung cấp các script để tách ảnh và metadata khỏi container HEIC, rồi chuyển đổi thành tệp EXR
    • Tại thời điểm viết, dự án có 374 dòng Python
  • Ví dụ này sử dụng một ảnh HEIC chụp bằng iPhone 15 Pro và đi theo codebase của Finn

Môi trường chạy và công cụ cần chuẩn bị

  • Để chạy cần Python 3.12.3 và nhiều công cụ CLI
    • jq
    • openexr
    • libimage-exiftool-perl
    • libopenexr-dev
    • python3-pip
    • python3.12-venv
  • Gói libimage-exiftool-perl cài đặt exiftool 12.76+dfsg-1
    • Phiên bản này được phát hành vào cuối tháng 1/2024
    • Sau đó đã có ít nhất 10 bản phát hành có sửa lỗi hoặc cải thiện hỗ trợ HEIC
    • Phiên bản này đủ cho các bước trong ví dụ, nhưng nếu gặp vấn đề về sau thì có thể đã được giải quyết trong exiftool mới nhất
  • JSON Convert jc được dùng để chuyển output của nhiều công cụ CLI sang JSON
  • Ảnh EXR được kiểm tra bằng DJV v2.0.8

Trích xuất Gain Map và Depth Map từ HEIC

  • Kích thước tệp HEIC ví dụ là 1,57MB
  • Khi chạy gain_map_extract.py, các tệp sau được tạo ra
    • IMG_E2153_metadata.json: 14KB
    • IMG_E2153_depth_0.tiff: 433KB
    • IMG_E2153_hdrgainmap_48.tiff: 5,9MB
    • IMG_E2153_base.tiff: 71MB
  • Metadata EXIF của base TIFF có các đặc điểm sau
    • Định dạng tệp: TIFF
    • Nén: Uncompressed
    • Màu sắc: RGB
    • Kích thước ảnh: 5712×4284
    • Megapixel: 24,5
    • Bits Per Sample: 8 8 8
  • HDR Gain Map và Depth Map có độ phân giải thấp hơn ảnh gốc
    • Ảnh gốc: 5712×4284
    • HDR Gain Map: 2856×2142
    • Depth Map: 768×576
  • Metadata JSON bao gồm aux, nclx_profile, primary, xmp, v.v.
    • Mục urn:com:apple:photo:2020:aux:hdrgainmap có giá trị [48]
    • Kích thước primary được hiển thị là [5712, 4284]
  • Có 3 GitHub issue yêu cầu giải mã các giá trị được mã hóa base64 sang dạng con người đọc được

Luồng chuyển đổi HEIC sang OpenEXR

  • Academy Software Foundation tài trợ các dự án và tiêu chuẩn nguồn mở dùng trong ngành điện ảnh, truyền hình và sáng tạo
    • Thành viên bao gồm Academy of Motion Picture Arts and Sciences, Disney, Nvidia, Netflix, v.v.
  • OpenEXR là định dạng tệp ảnh HDR
    • Ban đầu được Industrial Light and Magic phát triển vào năm 1999
    • Được phát hành dưới dạng nguồn mở vào năm 2003
    • Được dùng trong sản xuất hiệu ứng hình ảnh và render 3D
  • Khi chạy heic_to_exr.py, ảnh HEIC của iPhone 15 Pro được chuyển đổi thành tệp OpenEXR
    • Kích thước tệp kết quả là 468MB
  • Script chuyển đổi gọi nhiều lần oiiotool, công cụ xử lý ảnh của OpenImageIO

Cấu hình kênh trong bước tạo EXR

  • Trước hết dùng oiiotool --info để kiểm tra kích thước của ảnh nguồn
  • Ảnh base đặt tên các kênh RGB là sdr.R, sdr.G, sdr.B và chuyển đổi không gian màu
    • Từ đường cong sRGB qua Linear Rec.709
    • Từ Linear P3-D65 sang ACEScg
  • Việc chuyển đổi màu dùng tệp cấu hình OpenColorIO
    • Tệp OCIO được dùng là studio-config-v1.0.0_aces-v1.3_ocio-v2.1.ocio
    • Tệp này dạng văn bản và gồm 1.242 dòng
    • Phần mô tả có chứa Academy Color Encoding System - Studio Config [COLORSPACES v1.0.0] [ACES v1.3] [OCIO v2.1]
  • HDR gain map được tạo thành EXR bằng cách dùng kênh Y của TIFF
    • Được đặt tên là kênh gainmap.Y
    • Resize về kích thước 4032×3024
    • Chuyển đổi từ đường cong Rec.709 sang Linear
  • Gain map được đổi thành RGB bằng cách sao chép kênh Y ba lần
    • gainmap.R
    • gainmap.G
    • gainmap.B
  • Sau khi trích xuất giá trị HDRGainMapHeadroom bằng exiftool, gain map được scale bằng nghịch đảo của giá trị headroom đó
  • Ảnh HDR base được tạo bằng cách nhân ảnh base với gain map đã scale
  • Depth Map tạo kênh depth.Y ở định dạng EXR từ kênh Y của TIFF
    • Resize về kích thước 4032×3024
  • Tệp EXR cuối cùng được cấu thành bằng cách thêm lần lượt nhiều kênh
    • R, G, B của HDR base
    • sdr.R, sdr.G, sdr.B của SDR base
    • gainmap.R, gainmap.G, gainmap.B của gain map
    • depth.Y của Depth Map
  • Nếu ảnh nguồn có matte, lớp matte cũng được xử lý và thêm vào ở bước đó
  • Tệp final.exr cuối cùng được di chuyển sang cạnh ảnh nguồn với tên <prefix>_acesCG.exr

1 bình luận

 
GN⁺ 2025-06-06
Ý kiến trên Hacker News
  • Như các bình luận khác đã chỉ ra đúng, độ phân giải LIDAR quá thấp để dùng làm dữ liệu chính cho bản đồ độ sâu
    Theo tôi biết, iPhone lấy dữ liệu độ sâu theo khoảng bốn cách, tùy mẫu máy và camera. Trước đây các bản đồ độ sâu như vậy chỉ được lưu trong chế độ chụp chân dung, nhưng các iPhone gần đây dường như cũng lưu chúng trong ảnh thường

    1. Từ iPhone 7 Plus, máy chụp đồng thời bằng hai camera sau và tạo bản đồ độ sâu bằng thị sai, tương tự cách nhìn của con người. Nó tự nhiên bị giới hạn theo góc nhìn của ống kính hẹp hơn
    2. Các mẫu chỉ có một camera sau như iPhone XR ước tính độ sâu sơ bộ bằng các pixel lấy nét trên cảm biến, rồi dùng học máy để hiệu chỉnh dữ liệu gốc độ phân giải thấp và không chính xác: https://www.lux.camera/iphone-xr-a-deep-dive-into-depth/
    3. Trên iPhone SE không có cả pixel lấy nét, bản đồ độ sâu được tạo chỉ bằng học máy, có mức tương quan với thực tế thấp nhất nên thậm chí có thể bị đánh lừa bởi một bức ảnh chụp lại ảnh: https://www.lux.camera/iphone-se-the-one-eyed-king/
    4. Ảnh selfie trên iPhone có FaceID tạo bản đồ độ sâu bằng quét 3D của camera TrueDepth. Trong ảnh selfie của bài viết, nó cũng trông mờ hơn và giống độ phân giải thấp hơn
      Các ảnh phụ trợ trong bài, hiển thị người, kính, tóc và da bằng màu trắng, được Apple gọi là portrait effects mattes và được tạo bằng học máy
      Trước đây tôi từng làm một ứng dụng dùng bản đồ độ sâu và portrait effects mattes của ảnh chân dung để tạo các bộ lọc sáng tạo, khá thú vị, nhưng hiện đã gỡ xuống. Bản đồ độ sâu có rất nhiều khả năng nghệ thuật mới
    • Các iPhone gần đây lưu bản đồ độ sâu ngay cả ở chế độ chụp ảnh mặc định nếu trong cảnh có người hoặc thú cưng
      Tôi tò mò ứng dụng đó tên gì và liệu còn video nào không. Tôi cũng làm một công cụ nhỏ tên Matte Viewer như một phần trong bộ công cụ ảnh, không có hiệu ứng, chỉ hỗ trợ xem và xuất: https://apps.apple.com/us/app/matte-viewer/id6476831058
    • https://lookingglassfactory.com là một khung ảnh holographic có thể hiển thị ảnh iPhone chứa bản đồ độ sâu dưới dạng 3D thực sự
    • Bài viết đó về phương thức thứ 3 là tài liệu từ 5 năm trước, nên hiện nay cũng nên xem ml-depth-pro của Apple: https://github.com/apple/ml-depth-pro?tab=readme-ov-file
    • LIDAR chủ yếu được tối ưu cho tự động lấy nét nhanh và lấy nét trong điều kiện thiếu sáng, hơn là để tạo bản đồ độ sâu độ phân giải đầy đủ
    • Tôi tò mò liệu phương thức thứ 4 có thể được dùng để phát hiện tính sống trong các ứng dụng bảo mật hay không
  • Bài viết thú vị. Những bản đồ độ sâu kiểu này có vẻ được dùng cho hiệu ứng làm mờ hậu cảnh theo độ sâu trường ảnh trong chế độ “chân dung”, tức bokeh giả
    Việc có thể đổi điểm lấy nét sau khi chụp và điều chỉnh độ sâu trường ảnh bằng “khẩu độ” luôn khiến tôi thấy thú vị, nhưng hình dạng của bokeh giả thì không hay. Nó lúc nào cũng trông như Photoshop vụng về
    Có vẻ có lỗi chính tả trong cách ghi định dạng tệp: “HEIC” 14 lần, “HIEC” 3 lần

    • Lý do nó trông giả có lẽ là vì họ triển khai sai quang học và toán học khẩu độ thực tế, và từ góc nhìn sản phẩm, họ dùng một phép xấp xỉ rất tệ ở mức đủ làm hài lòng 80% người dùng
      Có vẻ có thể tạo một ứng dụng camera tốt hơn với toán học khẩu độ đúng, nhưng tôi tự hỏi liệu mọi người có trả tiền cho nó không, hay người dùng điện thoại sẽ không nhận ra khác biệt và cũng không quan tâm
    • Lỗi chính tả đã được sửa
    • Với tư cách nhiếp ảnh gia, bokeh giả rất khó chịu đựng. Nó hoàn toàn khác bokeh từ ống kính tốt và trông kinh khủng một cách phi tự nhiên, nên thật ngạc nhiên khi mọi người nghĩ nó đẹp
      Nếu muốn ảnh chân dung đẹp, mua hoặc mượn một chiếc DSLR rẻ tiền sẽ cho kết quả tốt hơn gấp 100 lần
  • Reality Composer cho iOS có một tính năng riêng để chụp vật thể bằng LIDAR
    Tôi đã thất vọng khi biết rằng trên các thiết bị Apple không có LIDAR, nó không được thay thế bằng đo ảnh. Điều này hữu ích để tham khảo cho những người muốn làm mô hình 3D hoặc đo ảnh như tôi

    • Tôi thành công nhất với quét 3D bằng Heges. LiDAR khá phù hợp với các vật thể lớn như ô tô, còn camera độ sâu Face ID cũng có thể chụp các vật thể nhỏ
      Tôi đã mua Creality Ferret SE trên TikTok với giá khoảng 100 USD để quét vật thể nhỏ, và nó rất tuyệt
    • Polycam có một lộ trình thay thế
      Tôi cũng nghe đánh giá tốt rằng Canvas cần LiDAR, còn Scaniverse thì LiDAR là tùy chọn
  • Bản đồ độ sâu và bản đồ ngữ nghĩa khá thú vị để xem, và nếu đưa vào các chương trình như TouchDesigner, Blender hay Cinema 4D, có thể tạo các hiệu ứng độ sâu rất đẹp từ ảnh
    Chúng cũng có thể dùng cho xử lý ảnh, và rốt cuộc Apple cũng dùng chúng cho mục đích đó
    Trước đây chúng chỉ được lưu trong chế độ chụp chân dung, nhưng các iPhone gần đây gần như tự động lưu khi phát hiện người hoặc thú cưng trong cảnh
    Tôi đang làm các ứng dụng và công cụ ảnh (https://heliographe.net), trong đó Matte Viewer là công cụ để xem và xuất loại dữ liệu này: https://apps.apple.com/us/app/matte-viewer/id6476831058

  • Độ phân giải của bản thân LIDAR thấp hơn nhiều so với bản đồ độ sâu trong bài. Hẳn là phải được tạo bằng cách kết hợp dữ liệu LIDAR với dữ liệu camera thông thường

    • Tôi cũng nghĩ LIDAR được dùng cho việc lấy nét thực tế, còn bản đồ độ sâu được tính bằng thị sai của nhiều camera
  • Bài viết nói khá dài về HDR gain map, nhưng tôi không rõ nó liên quan gì đến bản đồ độ sâu
    Tôi thắc mắc liệu có thể bỏ qua phần xử lý liên quan đến HDR gain map mà vẫn giữ được bản đồ độ sâu không
    Cá nhân tôi không thích cách iPhone hiển thị HDR, vì nó tăng độ sáng màn hình vượt quá mức sáng tối đa do người dùng đặt. Tôi đang cố gắng loại bỏ HDR gain map khỏi ảnh của mình
    HDR trước đây có nghĩa là chụp ba tấm rồi ghép lại để loại bỏ các vùng thiếu sáng/quá sáng, và ảnh kết quả không mang theo thông tin riêng cho biết nó là HDR

    • Tôi cũng nghĩ như vậy khi đọc bài, và tự hỏi liệu mình có bỏ sót điều gì không. Phần tổng quan về bản đồ độ sâu thì hay, nhưng càng về sau bài chủ yếu nói về gain map và nhiều định dạng tệp, nên cảm thấy hơi lan man
    • Có thể tắt hiển thị HDR tăng cường cho màn hình trong cài đặt Photos
  • Tôi thắc mắc liệu có thể tạo stereogram hoặc SIRDS từ bản đồ độ sâu không. Tôi nhớ trước đây từng tạo stereogram từ một ảnh thang xám rất giống như vậy

    • Đã làm được rồi. Tuy nhiên có vẻ UI này chỉ có trong phiên bản visionOS của ứng dụng Photos
      Nếu ảnh trong album có bản đồ độ sâu, hoặc độ phân giải đủ cao để phép xấp xỉ bằng học máy hoạt động đủ tốt, nó có thể được chuyển đổi sang “Spatial Format”
      Nó cũng đọc EXIF và “scale” kích thước vật lý của ảnh theo góc nhìn lúc chụp gốc. Vì vậy ảnh góc rộng trông lớn hơn nhiều về mặt vật lý so với ảnh tele trong không gian VR
      Cá nhân tôi thấy chỉ riêng nút và tính năng này đã đủ biện minh cho 4.000 đô la bỏ ra mua thiết bị. Khi nhìn những bức ảnh chụp bằng Nikon D7 năm 2007 ở dạng 3D đầy đủ và đúng tỉ lệ, những hoài niệm và ký ức đã quên từ lâu sống lại, khiến tôi khá xúc động
      Việc Apple không đưa tính năng này thành điểm bán hàng cốt lõi của Vision Pro là một sai lầm. Nó thật sự tuyệt vời
  • Tôi thắc mắc liệu Apple có dùng thứ này cho tính năng “create sticker”, tức nhấn giữ chủ thể trong ảnh để biến thành sticker hoặc sao chép sang ảnh khác không

    • Tôi nghĩ chắc chắn là không. Tính năng đó hoạt động với mọi ảnh, bất kể nguồn gốc
      Thông tin độ sâu thực tế cũng có khả năng không giúp ích nhiều. Làm vậy thì gần như sẽ bao gồm cả sàn nhà hoặc mặt bàn nơi chủ thể đang nằm/đứng
      Đây có khả năng là cách tiếp cận phân đoạn ngữ nghĩa chỉ dùng học máy
    • Vì nó cũng hoạt động với ảnh không chụp bằng iPhone, nên chắc là cách chỉ dùng học máy
  • Tôi đang chờ đến ngày mọi phần cứng điện thoại mặc định có thể chụp ảnh 3D bằng Gaussian splatting mà không cần cảm biến đắt tiền
    Chi phí tính toán có thể lớn, nhưng có lẽ vẫn rẻ hơn việc thêm cảm biến đắt tiền và làm tăng trọng lượng

  • Trang này hoạt động kỳ lạ trên iOS Chrome. Khi cuộn trang xuống, cỡ chữ lớn lên; cuộn lên thì lại nhỏ đi, khá là khó hiểu
    Dù vậy, đây là lần đầu tôi biết đến oiiotool, và nó rất tuyệt