HDR 画像の仕組みと処理方法 - ハイダイナミックレンジの原理と実践
ダイナミックレンジとは - 明暗の表現幅を理解する
ダイナミックレンジとは、画像が表現できる最も暗い部分と最も明るい部分の比率です。人間の目は約 20 段 (EV) のダイナミックレンジを持ち、暗い室内から明るい屋外まで幅広い明暗を同時に知覚できます。一方、従来の SDR (Standard Dynamic Range) 画像は約 6-8 段のダイナミックレンジしか表現できません。
この制約により、逆光のシーンでは空が白飛びするか、人物が黒つぶれするかのどちらかを選ばざるを得ませんでした。HDR (High Dynamic Range) 画像は、この制約を打破し、明るい部分と暗い部分の両方のディテールを 1 枚の画像に収める技術です。
ダイナミックレンジの数値的理解:
- SDR (8 ビット): 0-255 の 256 段階。約 6-8 EV のダイナミックレンジ。コントラスト比で表すと約 100:1 から 256:1
- HDR (10 ビット): 0-1023 の 1024 段階。約 10-12 EV のダイナミックレンジ。コントラスト比で約 1000:1
- HDR (浮動小数点): 理論上無限のダイナミックレンジ。EXR 形式では 30 EV 以上を格納可能
HDR 画像の本質は「現実世界の光の強さをより忠実に記録する」ことにあります。太陽の直射光は室内の照明の数万倍の明るさですが、HDR 画像ならこの差を数値として正確に保持できます。この情報があることで、後処理での露出調整やトーンマッピングの自由度が格段に向上します。
HDR 画像のファイルフォーマット - 用途別の選択肢
HDR 画像を格納するファイルフォーマットは複数存在し、それぞれ異なる特性と用途を持っています。プロジェクトの要件に応じて適切なフォーマットを選択することが重要です。
OpenEXR (.exr):
ILM (Industrial Light & Magic) が開発した映画・ VFX 業界の標準フォーマットです。16 ビットまたは 32 ビット浮動小数点で各チャンネルを格納し、理論上無限のダイナミックレンジを表現できます。マルチレイヤー (深度、法線、アルベドなどを 1 ファイルに格納)、タイル構造 (部分読み込み対応)、多様な圧縮方式 (ZIP、PIZ、DWAA) をサポートします。ファイルサイズは大きいですが、品質の妥協がない点が最大の強みです。
Radiance HDR (.hdr):
Greg Ward が開発した歴史あるフォーマットです。RGBE (Red, Green, Blue, Exponent) エンコーディングで各ピクセルを 4 バイトに格納します。EXR ほどの精度はありませんが、ファイルサイズが小さく、環境マップ (IBL: Image-Based Lighting) の配布に広く使用されています。Web 上の 3D レンダリング (Three.js、Babylon.js) でも環境光源として頻繁に利用されます。
AVIF (HDR 対応):
AV1 コーデックベースの画像フォーマットで、10 ビット・ 12 ビットの HDR コンテンツをサポートします。PQ (Perceptual Quantizer) や HLG (Hybrid Log-Gamma) の伝達関数に対応し、HDR ディスプレイでの表示に適しています。Web ブラウザでの対応が進んでおり、Web 上での HDR 画像配信の有力候補です。
JPEG XL (.jxl):
次世代画像フォーマットとして設計され、HDR コンテンツのネイティブサポートを含みます。既存の JPEG からのロスレス変換 (再圧縮) が可能で、HDR と SDR の両方を 1 ファイルに格納できる Gain Map 機能を持ちます。ブラウザ対応は限定的ですが、技術的には最も先進的なフォーマットです。
トーンマッピング - HDR を SDR ディスプレイで表示する技術
HDR 画像のダイナミックレンジは通常のディスプレイ (SDR) の表示能力を超えているため、そのまま表示すると白飛びや黒つぶれが発生します。トーンマッピングは、HDR の広いダイナミックレンジを SDR ディスプレイの限られた範囲に圧縮する処理です。
グローバルトーンマッピング:
画像全体に同一の変換関数を適用する方法です。計算が高速で実装が簡単ですが、局所的なコントラストが失われやすい欠点があります。代表的なオペレーターとして以下があります。
- Reinhard オペレーター:
L_out = L_in / (1 + L_in)のシンプルな式で、明るい部分を圧縮しつつ暗い部分のディテールを保持します。パラメータが少なく調整が容易です。 - Filmic トーンマッピング: 映画フィルムの特性曲線 (S カーブ) を模倣します。ハイライトの滑らかなロールオフとシャドウの持ち上げにより、映画的な質感が得られます。Uncharted 2 で使用された John Hable の実装が有名です。
- ACES (Academy Color Encoding System): 映画業界標準のカラーマネジメントシステム。ACES トーンマッピングカーブは、広い色域と高いダイナミックレンジを美しく SDR に変換します。
ローカルトーンマッピング:
画像の局所的な明るさに応じて変換パラメータを変える方法です。暗い領域は明るく、明るい領域は暗く調整することで、局所コントラストを維持しながらダイナミックレンジを圧縮します。人間の目の順応メカニズムに近い処理ですが、計算コストが高く、不自然なハロー (光の滲み) が発生しやすい欠点があります。
HDR 撮影テクニック - ブラケット撮影とマージ処理
カメラのセンサーが 1 回の露出で捉えられるダイナミックレンジには限界があります。HDR 画像を作成する最も一般的な方法は、異なる露出で複数枚撮影し、ソフトウェアで合成する「ブラケット撮影 + マージ」です。
ブラケット撮影の基本:
同じ構図で露出を変えて 3-7 枚撮影します。通常は 2EV 間隔で、アンダー露出 (暗い部分のディテール用)、適正露出、オーバー露出 (明るい部分のディテール用) の最低 3 枚が必要です。三脚を使用してカメラを固定し、絞り (被写界深度) は固定してシャッタースピードのみを変えます。絞りを変えると被写界深度が変わり、合成時にボケの不一致が発生するためです。
HDR マージアルゴリズム:
複数の露出画像から HDR 画像を生成するアルゴリズムは、各ピクセルについて最も信頼性の高い露出の値を選択・合成します。代表的な手法として、Debevec & Malik (1997) のカメラ応答関数推定法があります。各露出画像のピクセル値からカメラの応答曲線を逆算し、真の放射輝度 (radiance) を復元します。
ゴースト除去 (Deghosting):
ブラケット撮影中に被写体が動いた場合、合成画像にゴースト (半透明の残像) が発生します。これを防ぐために、動き検出アルゴリズムで動いた領域を特定し、その領域は 1 枚の露出のみから情報を取得します。Adobe Lightroom や Photomatix Pro などのソフトウェアには自動ゴースト除去機能が搭載されています。
シングルショット HDR:
最新のスマートフォンやミラーレスカメラは、1 回のシャッターで HDR 画像を生成する機能を持っています。センサーの各ピクセルに異なる露出時間を割り当てる技術 (Quad Bayer、Dual Gain) や、高速連写した複数フレームをリアルタイムで合成する計算写真学 (Computational Photography) の技術が使われています。Google の HDR+ や Apple の Smart HDR がこの代表例です。
Web での HDR 画像表示 - ブラウザと CSS の対応状況
HDR ディスプレイの普及に伴い、Web ブラウザでも HDR コンテンツの表示が可能になりつつあります。ただし、対応状況はまだ発展途上であり、フォールバック戦略が重要です。
HDR ディスプレイの普及状況:
2026 年時点で、MacBook Pro (Liquid Retina XDR)、iPhone (Super Retina XDR)、多くの OLED テレビ、一部の Windows ノート PC が HDR 表示に対応しています。ピーク輝度 1000nit 以上のディスプレイが HDR コンテンツの恩恵を最大限に受けられます。SDR ディスプレイのピーク輝度は通常 300-400nit 程度です。
CSS の color-gamut と dynamic-range メディアクエリ:
@media (dynamic-range: high) で HDR 対応ディスプレイを検出し、HDR コンテンツを条件付きで配信できます。また、@media (color-gamut: p3) で Display P3 色域対応を検出し、より鮮やかな色を表示できます。これらのメディアクエリを組み合わせることで、デバイスの能力に応じた最適な画像を配信するプログレッシブエンハンスメントが実現できます。
Gain Map HDR:
Apple が提唱し Google も採用した Gain Map 方式は、SDR 画像に HDR 情報を追加データとして埋め込む技術です。SDR 対応デバイスでは通常の SDR 画像として表示され、HDR 対応デバイスでは Gain Map を適用して HDR 表示されます。JPEG と AVIF の両方で利用可能で、後方互換性を維持しながら HDR 体験を提供できる実用的なアプローチです。
Canvas API での HDR レンダリング:
Canvas API の getContext('2d', { colorSpace: 'display-p3' }) で広色域レンダリングが可能です。WebGL/WebGPU では浮動小数点テクスチャを使用して HDR レンダリングを実現し、最終出力時にトーンマッピングを適用します。ゲームや 3D ビジュアライゼーションでの活用が進んでいます。
HDR 画像処理の実践 - ツールとワークフロー
HDR 画像を実際のプロジェクトで扱う際の具体的なツールとワークフローを紹介します。撮影から最終出力まで、一貫した HDR ワークフローを構築することが品質の鍵です。
デスクトップツール:
- Adobe Lightroom: HDR マージ機能でブラケット撮影画像を合成し、非破壊編集で仕上げます。2023 年以降は HDR 出力 (Gain Map JPEG) にも対応し、HDR ディスプレイでの表示を前提とした編集が可能です。
- Photomatix Pro: HDR 処理に特化したソフトウェア。多彩なトーンマッピングプリセットと細かいパラメータ調整が可能です。バッチ処理にも対応し、大量の HDR 画像を効率的に処理できます。
- Luminance HDR: オープンソースの HDR 処理ソフト。Mantiuk、Fattal、Drago など複数のトーンマッピングオペレーターを搭載し、学術的な用途にも適しています。
プログラミングでの HDR 処理:
Python の OpenCV では cv2.createMergeDebevec() で HDR マージ、cv2.createTonemap() でトーンマッピングが可能です。Node.js では sharp ライブラリが HEIF (HDR) の読み書きに対応しています。C++ では OpenEXR ライブラリが業界標準です。
Web 配信のワークフロー:
Web で HDR 画像を配信する場合の推奨ワークフローは以下の通りです。マスター画像を EXR または 16 ビット TIFF で保持します。SDR 版を JPEG/WebP で生成し、HDR 版を AVIF (10 ビット、PQ) または Gain Map JPEG で生成します。<picture> 要素と media 属性で HDR/SDR を出し分けます。HDR 非対応環境では自動的に SDR 版が表示されるフォールバック構成にします。
パフォーマンスの考慮:
HDR 画像は SDR 画像よりファイルサイズが大きくなる傾向があります (10 ビットは 8 ビットの約 1.25 倍)。CDN でのキャッシュ戦略、遅延読み込み、適切な圧縮設定により、パフォーマンスへの影響を最小限に抑えます。Gain Map 方式は SDR 画像に数 KB の追加データを付加するだけなので、ファイルサイズの増加が最も小さい選択肢です。