toruのブログ

月1くらいで記事書きたい。

BT.2446 Method C (HDR to SDR 変換) を実装してみた

1. 背景

以前から個人でお手軽に使える HDR to SDR 変換の 3DLUT を作りたいと思っていた。2019年に Report ITU-R BT.2446[1] として 3種類の Tone mapping が公開されたので実装することにした。

今回は Method C の NHK が提案した方式を実装した。理由としては 技研公開2019 で説明員の方に BT.2446 について聞いたところ「Methoc C は実装が簡単なのでオススメですよ」と教えてもらったからである。

2. 目的

  • Report ITU-R BT.2446 Methoc C の Tone mapping を実装する。なお筆者の独自拡張として以下2点の変更を加える。
    • BT.2446 Methoc C が想定している HDR の特性は HLG だが、今回作るものは PQカーブ(ST2084)を想定したものとする
    • BT.2446 Methoc C が想定している SDR の範囲は over-white 領域を含む 0~109% だが、筆者は over-white 領域が苦手なので 0~100% を対象とする。
  • 先日に作成した Report ITU-R BT.2407 Annex 2 の Gamut mapping と組み合わせて HDR10 to BT.709 の HDR to SDR 変換 3DLUT を作る。

3. 結論

3.1. 結論1

  • Report ITU-R BT.2446 Methoc C の Tone mapping 実装に成功した
    • SDRレンジ優先の 1000 cd/m2 用と 高輝度レンジ優先の 4000 cd/m2 用の2種類を作成した。特性を図1と図2 に示す。
f:id:takuver4:20200730151854p:plain f:id:takuver4:20200730151911p:plain
図1. 1000 cd/m2 コンテンツ用の Tone mapping の特性 図2. 4000 cd/m2 コンテンツ用の Tone mapping の特性

3.2. 結論2

  • BT.2446 Method C と BT.2407 Annex 2 を組み合わせた HDR10 to BT.709 変換の 3DLUT の作成に成功した
    • 1000 cd/m2 用と 4000 cd/m2 用の2種類を作成した。テスト用のソース画像に適用した結果のまとめを図3 に示す。
1000 cd/m2 用の 3DLUT を適用 4000 cd/m2 用の 3DLUT を適用 輝度マップ情報
f:id:takuver4:20200730152251p:plain f:id:takuver4:20200730152301p:plain f:id:takuver4:20200730152316p:plain

※2
f:id:takuver4:20200730152347p:plain f:id:takuver4:20200730152410p:plain f:id:takuver4:20200730152507p:plain

※3
f:id:takuver4:20200730152527p:plain f:id:takuver4:20200730152545p:plain f:id:takuver4:20200730152609p:plain

※2
f:id:takuver4:20200730153036p:plain f:id:takuver4:20200730153112p:plain f:id:takuver4:20200730153125p:plain
図3. HDR to SDR 変換の結果

①テストパターン、②暗い画(※2)、③スキントーンを含む画(※3)、④明るい画(※2)

※2 画像は "Mark Fairchild's HDR Photographic Survey"[2] より借用
※3 画像は "HdM-HDR-2014"[3] の Showgirl 1 より借用

作成した 3DLUT は以下に置いた。なお、今回作成したものは後述する通り幾つかの欠点がある。もしも利用したい方がいる場合は考察の図7 に示した欠点を事前に参照して頂きたい。

drive.google.com

4. 理論

4.1. 処理の大まかな流れ

Report ITU-R BT.2446[1] より引用した Block Diagram を図4に示す。BT.2446 Method C には以下の特徴がある。

  • Tone mapping は Linear 空間で行う(BT.2390 の Display Mapping[4] は Non Linear空間で行っているが それとは異なる)
  • Tone mapping は xyY色空間の Y に対して行う
  • Crosstalk matrix を使って高輝度かつ彩度の高い色の色ズレを防いでいる(※3)
  • Chroma correction を使って Reference White より高い輝度の色を自然に白飛びさせることが出来る(※3)

※3 Crosstalk matrix, Chroma correction に関しては筆者の理解が浅いため本記事では解説しない。できれば理解を深めた後に別記事で解説したいと思っている。2020.08.30 追記:別記事を書きました。

trev16.hatenablog.com

f:id:takuver4:20200730160158p:plain
図4. BT.2446 Methoc C の Block Diagram

4.2. 詳細

具体的な計算式の説明は Report ITU-R BT.2446[1] にキッチリと書かれている。よって、ここでは Tone mapping の設計時に変更可能なパラメータと、そのパラメータが Tone mapping にどう影響するかを解説することにする。

まず 数式の変数(パラメータ)と Tone mapping の特性の対応関係を整理しておく。以下の数式および図5 を参照してほしい。

f:id:takuver4:20200730173709p:plain
BT.2446 Method C の数式

f:id:takuver4:20200730173725p:plain
図5. 数式の変数と Tone mapping の特性の対応関係

数式および図5 から分かるように Tone mapping は Knee point までは直線、その先は Logカーブという特性になっている。この特性のうち Tone mapping 設計者が制御可能なのは以下の3点である。それぞれについて簡単に解説する。

  • Y_SDR,ip の値
  • Y_HDR,ip の値
  • Logカーブを使った高輝度領域の圧縮具合

まず Y_SDR,ip は SDR の Knee point の輝度を指定するパラメータである。オリジナルの BT.2446 Method C では 58.5 cd/m2 の固定値となっていたが 筆者は変更したかったので可変とした。筆者は 40~60cd/m2 あたりを想定したパラメータだと考えている。

次に Y_HDR,ip は HDRKnee point の輝度を指定するパラメータである。ここで指定した輝度までは Tone mapping の前後で歪むことが無い。理想を言えば 1000cd/m2 くらいを指定したい。しかし それをやってしまうと全体の絵が暗くなり過ぎる。本アルゴリズムでは 50~80 cd/m2 あたりの値を想定したパラメータだと考える。

最後の Logカーブはどのくらいの高輝度領域まで圧縮対象とするかを設定できる。例えば 1000 cd/m2 以上の値は圧縮しない、といった制御ができる。

実際にそれぞれのパラメータを変更させた様子を以下の動画に示す(少し長いので必要に応じて早送りをして下さい)。

5. 他の HDR to SDR 変換方式との比較

今回は YouTubeHDR to SDR 変換と比較した。結果を図6 に示す。なお、YouTubeHDR to SDR 変換は以下の記事で作成した 3DLUT によるエミュレーションである。実際に YouTube にアップロードして変換してはいないので注意して頂きたい。

trev16.hatenablog.com

1000 cd/m2 用の 3DLUT を適用 4000 cd/m2 用の 3DLUT を適用 YouTubeHDR to SDR 変換
f:id:takuver4:20200730152251p:plain f:id:takuver4:20200730152301p:plain f:id:takuver4:20200731001328p:plain

※2
f:id:takuver4:20200730152347p:plain f:id:takuver4:20200730152410p:plain f:id:takuver4:20200731001343p:plain

※3
f:id:takuver4:20200730152527p:plain f:id:takuver4:20200730152545p:plain f:id:takuver4:20200731001407p:plain

※2
f:id:takuver4:20200730153036p:plain f:id:takuver4:20200730153112p:plain f:id:takuver4:20200731001446p:plain
図6. YouTubeHDR to SDR 変換との比較した結果

①テストパターン、②暗い画、③スキントーンを含む画、④明るい画

少し意地悪なコンテンツの選び方をしたため、筆者の実装した BT.2446 Method C の方が性能が良く見える。しかし、実際はそんなことは無く 筆者の実装にも問題点は存在する。次の考察で少し述べる。

6. 考察

注意:以後の考察は筆者が決定したパラメータを適用した BT.2446 Method C に対しての考察です。パラメータの決め方によって長所・短所は変わることにご注意下さい。

今回の記事では権利関係の問題で 図6 の画像しか載せなかったが、筆者は他の HDRコンテンツ[5] でも比較を行った。その結果、筆者のパラメータを適用した BT.2446 Method C に関しては以下のような長所、短所があることが分かった。

長所

  • 高輝度領域での色シフトが少ない。例えば図6 の最下段では YouTube は空の色がシアンに色がシフトしてしまっている。
  • スキントーン付近が明るくオリジナルのHDR表示に近い。一方で YouTube は少し暗く表示される。

短所

  • Reference White よりも下の輝度から Logカーブで丸めているため以下の現象が起こる。
    • それほど輝度の高くないところでも白っぽくなる
    • 輝度の高い領域でのシャープさが失われる

短所が分かりやすい例を筆者が旅行先で撮影した以下の画像で示す。YouTube の方は陰影が維持されており画が破綻していない。一方で筆者の実装の方は陰影が潰れ気味であり、人によっては「画が破綻している」との判断が下ると考えている。

BT.2446 Method C での変換 YouTube での変換
f:id:takuver4:20200801095748p:plain f:id:takuver4:20200801095845p:plain
f:id:takuver4:20200801095806p:plain f:id:takuver4:20200801095900p:plain
f:id:takuver4:20200801095818p:plain f:id:takuver4:20200801095913p:plain
f:id:takuver4:20200801095830p:plain f:id:takuver4:20200801095925p:plain
図7. 今回使用したパラメータで見つかった短所の例

この辺りの短所についてはパラメータを変更することで改善する可能性は高い。今後の検討課題としたい。

7. 感想

BT.2407 Annex2 および BT.2446 Method C の実装を通じて Color Volume の変換がどのようなものが理解が深まった。もう少し勉強を進めて筆者オリジナルの変換方式を考案できるようになりたい。

個人的には Jzazbz 色空間で Tone mapping, Gamut mapping の双方を行うアルゴリズムを考えてみたい。

8. 参考資料

[1] Report ITU-R BT.2446-0, "Methods for conversion of high dynamic range content to standard dynamic range content and vice-versa", http://www.itu.int/pub/R-REP-BT.2446-2019

[2] Mark D. Fairchild, "Mark Fairchild's HDR Photographic Survey", http://rit-mcsl.org/fairchild//HDR.html

[3] Visual Media Lab, "HDM-HDR-2014", https://www.hdm-stuttgart.de/vmlab/hdm-hdr-2014

[4] Report ITU-R BT.2390-8, "High dynamic range television for production and international programme exchange", https://www.itu.int/pub/R-REP-BT.2390-8-2020

[5] Netflix, "OPEN SOURCE CONTENT", https://opencontent.netflix.com/