HDR トーンマッピングの種類と選び方 - グローバルからローカルまで徹底比較
HDR とトーンマッピングの基礎 - なぜ必要なのか
HDR (High Dynamic Range) 画像は、現実世界の広大な輝度範囲 (太陽光の 10^9 cd/m² から星明かりの 10^-3 cd/m² まで) を記録できる画像形式です。しかし、一般的なディスプレイは 0-255 (8bit) の限られたダイナミックレンジしか表示できないため、HDR 画像をそのまま表示すると大部分が白飛びまたは黒潰れします。
トーンマッピングの役割: トーンマッピングオペレータ (TMO) は、HDR 画像の広いダイナミックレンジを LDR (Low Dynamic Range) ディスプレイの表示範囲に圧縮する処理です。単純な線形スケーリングではコントラストが失われるため、人間の視覚特性を考慮した非線形な圧縮が必要です。
HDR 画像の取得方法:
- 露出ブラケット撮影: 異なる露出で複数枚撮影し、Debevec 法や Robertson 法で合成。最も一般的な手法
- RAW 現像: 14bit RAW データから擬似 HDR を生成。ダイナミックレンジは約 12-14EV
- HDR センサー: Sony IMX490 など、1 回の撮影で 130dB 以上のダイナミックレンジを記録
- CG レンダリング: 物理ベースレンダラーが出力する浮動小数点画像は本質的に HDR
トーンマッピングの分類: TMO は大きくグローバル (画像全体に同一の変換を適用) とローカル (ピクセルの周辺情報を考慮して変換) に分類されます。グローバル TMO は高速で安定ですがコントラスト圧縮に限界があり、ローカル TMO は高品質ですがハロー (光輪) アーティファクトのリスクがあります。
グローバルトーンマッピング - Reinhard と対数圧縮
グローバルトーンマッピングは、画像内の全ピクセルに同一の変換関数を適用します。計算が高速で実装が容易ですが、局所的なコントラスト強調はできません。
Reinhard グローバル TMO (2002): 写真のゾーンシステムに着想を得た手法で、最も広く使用されるグローバル TMO です。まず画像の対数平均輝度 (キー値) を計算し、中間調を 0.18 (18% グレー) にマッピングします。
L_scaled = (a / L_avg) × L_world
L_display = L_scaled / (1 + L_scaled)
パラメータ a (キー値、デフォルト 0.18) で全体の明るさを制御し、L_white (白色点) で最大輝度のクリッピングを制御します。a を大きくすると明るい仕上がり、小さくすると暗い仕上がりになります。
Drago 対数 TMO (2003): 対数関数の底を輝度に応じて適応的に変化させる手法です。暗部では底が小さく (圧縮が弱い)、明部では底が大きく (圧縮が強い) なるため、暗部のディテールを保持しながら明部を効果的に圧縮します。バイアスパラメータ b (デフォルト 0.85) で圧縮の強さを制御します。
Filmic TMO: 映画のフィルム特性を模倣した S 字カーブで、ゲーム業界で広く採用されています。Uncharted 2 の John Hable が提案した実装が有名で、トーシャドウ、リニア部分、ショルダーの 3 区間で構成されます。ACES (Academy Color Encoding System) のフィルミックカーブは映画業界の標準です。
OpenCV では cv2.createTonemapReinhard()、cv2.createTonemapDrago() で簡単に利用可能です。
ローカルトーンマッピング - Reinhard ローカルと Durand
ローカルトーンマッピングは、各ピクセルの周辺情報を考慮して変換パラメータを適応的に決定します。局所的なコントラストを保持できるため、グローバル TMO より自然で詳細な結果が得られますが、計算コストが高くハローアーティファクトのリスクがあります。
Reinhard ローカル TMO (2002): 各ピクセルの周辺輝度を複数スケールのガウシアンフィルタで計算し、最適なスケールを自動選択します。大きなスケールほど強い圧縮が可能ですが、エッジを跨ぐとハローが発生するため、エッジを検出してスケールを制限します。
Durand-Dorsey バイラテラルフィルタ TMO (2002): 画像をベースレイヤー (大域的な輝度変動) とディテールレイヤー (局所的なテクスチャ) に分離し、ベースレイヤーのみを圧縮してディテールを保持します。
- 対数輝度画像にバイラテラルフィルタを適用してベースレイヤーを抽出する
- ディテールレイヤー = 対数輝度 - ベースレイヤー
- ベースレイヤーのコントラストを圧縮する (線形スケーリング)
- 圧縮されたベースレイヤーにディテールレイヤーを加算して再合成する
バイラテラルフィルタのパラメータ: σ_spatial = 画像幅の 2%、σ_range = 0.4 が推奨値です。σ_range が小さすぎるとハローが発生し、大きすぎるとディテールが失われます。
ガイデッドフィルタ TMO: バイラテラルフィルタの代わりにガイデッドフィルタを使用する手法です。O(N) の計算量で高速処理が可能で、バイラテラルフィルタのグラデーション反転問題を回避できます。ε パラメータで分離の閾値を制御し、0.01-0.1 の範囲で調整します。
知覚ベースの TMO - Mantiuk と iCAM
知覚ベースのトーンマッピングは、人間の視覚システム (HVS: Human Visual System) の特性を明示的にモデル化し、知覚的に最適な結果を生成します。コントラスト感度関数 (CSF) や明順応モデルを組み込んだ高度な手法です。
Mantiuk TMO (2006/2008): 人間のコントラスト知覚モデルに基づき、知覚的なコントラスト損失を最小化するように最適化します。HDR 画像のコントラストを周波数帯域ごとに分解し、各帯域で CSF に基づく可視性閾値を考慮してコントラストを圧縮します。
- ラプラシアンピラミッドで多スケール分解する
- 各スケールのコントラストを CSF で重み付けする
- 知覚的コントラスト損失を最小化する最適化問題を解く
- 結果を再合成して LDR 画像を生成する
Mantiuk '08 は彩度補正も組み込み、トーンマッピング後の色の不自然さを軽減しています。pfstools の pfstmo_mantiuk08 コマンドで利用可能です。
iCAM06 (Image Color Appearance Model): CIECAM02 色の見えモデルを画像処理に拡張した手法です。明順応、色順応、空間周波数適応を統合的にモデル化し、異なる観察条件下での色の見えを予測します。HDR 画像の各領域の適応輝度を推定し、それに基づいてトーンマッピングを行うため、人間が実際にシーンを見たときの印象に近い結果が得られます。
Display Adaptive TMO: 出力デバイスの特性 (最大輝度、コントラスト比、ガンマ) を考慮してトーンマッピングを最適化する手法です。HDR ディスプレイ (1000nit 以上) と SDR ディスプレイ (300nit) で異なるマッピングを適用し、各デバイスの表示能力を最大限に活用します。
深層学習による HDR 処理 - 単一画像 HDR と学習ベース TMO
深層学習は HDR 画像処理の 2 つの側面で革新をもたらしています。1 つは単一の LDR 画像から HDR を推定する逆トーンマッピング、もう 1 つは学習ベースのトーンマッピングオペレータです。
単一画像 HDR 推定 (Inverse Tone Mapping): 通常の 8bit 画像から HDR 画像を推定する技術です。白飛び領域の情報復元が最大の課題で、深層学習により大幅な品質向上が実現されています。
- ExpandNet (2018): マルチスケールのエンコーダで局所・中域・大域の情報を統合し、HDR 輝度を推定。PSNR 28.5dB (HDR-VDP-2 で評価)
- SingleHDR (2020): カメラのレスポンス関数を同時推定し、物理的に正確な HDR 復元を実現
- HDRUNet (2021): U-Net ベースで空間的注意機構を導入。白飛び領域の復元精度が大幅に向上
学習ベース TMO: 人間の好みを学習データとして、知覚的に好ましいトーンマッピングを自動的に学習します。
- Deep Tone Mapping (2020): プロの写真家がレタッチした画像ペアで学習し、芸術的なトーンマッピングを実現
- Adaptive TMO (2022): シーンの内容 (風景、人物、夜景など) を認識し、シーンに最適な TMO パラメータを自動選択
リアルタイム HDR 処理: モバイルデバイスやゲームエンジンでは、軽量な深層学習モデルによるリアルタイム HDR 処理が実用化されています。Apple の Smart HDR、Google の HDR+ は複数フレームの情報を統合し、計算写真学 (Computational Photography) の代表例です。処理時間は 12MP で約 100ms (モバイル GPU) です。
用途別 TMO 選択ガイドと実装のポイント
トーンマッピングの選択は用途、品質要件、処理速度の制約によって決まります。具体的なユースケースごとの推奨と、実装時の注意点を示します。
用途別推奨 TMO:
- 写真作品 (高品質): Mantiuk '08 または Durand バイラテラル。知覚的な自然さを最優先
- 不動産・建築写真: Reinhard ローカル。室内の暗部と窓外の明部を両立させる
- ゲームエンジン (リアルタイム): ACES Filmic または Reinhard グローバル。GPU で 1ms 以下の処理
- 映画 VFX: ACES ワークフロー + カスタム LUT。色管理の一貫性を重視
- 科学・医療画像: 対数圧縮または Drago。データの正確性を保持
実装時の注意点:
- 色の保持: 輝度チャネルのみにトーンマッピングを適用し、色相と彩度を保持する。RGB に直接適用すると色ずれが発生する
- ガンマ補正: トーンマッピング後に sRGB ガンマ (2.2) を適用することを忘れない
- ハロー対策: ローカル TMO ではフィルタのパラメータを慎重に調整し、エッジ付近のハローを抑制する
- 彩度補正: トーンマッピングで彩度が低下するため、s = 0.5-0.8 の彩度補正係数を適用する
OpenCV での実装例: cv2.createTonemapReinhard(gamma=2.2, intensity=0, light_adapt=0.8, color_adapt=0) で Reinhard TMO を作成し、tonemap.process(hdr_image) で適用します。結果は 0-1 の浮動小数点なので、255 を掛けて 8bit に変換します。処理時間は 4K 画像で約 50ms (CPU) です。