背景
- 前回 に引き続き Color Space の勉強をしている
- 筆者は 過去の記事 で CIELAB Color Space を使い Hue-Chroma パターンを作成した。今回はこれを Color Space を使って作ろうと考えた
目的
過去の記事で作成した CIELAB Color Space の Hue-Chroma パターンを Color Space で作り直す。 は HDR に対応しているため、ピーク輝度を変化させて以下の 3パターンを作成する。
Luminance | Transfer Characteristics | Gamut | White Point |
---|---|---|---|
100 nits | 2.4 | BT.2020 | D65 |
1000 nits | ST 2084 | BT.2020 | D65 |
10000 nits | ST 2084 | BT.2020 | D65 |
結論
Color Space を使用して以下の3種類のテストパターンを作成した。結果を以下に示す。
(誰も欲しがらないと思うが)生成した画像は このリンク からダウンロードできる。 再配布をしなければ自由に使ってもらって構わない。
Luminance | Transfer Characteristics | Image without metadata (PNG) | Image with metadata (AVIF) |
---|---|---|---|
100 nits | 2.4 | ||
1000 nits | ST 2084 | ||
10000 nits | ST 2084 |
一番右側のメタデータ付きの画像は AVIF形式で CICP として 9-16-9 (※1) を埋め込んである。 Windows OS で HDRを有効にした後で HDR対応の Webブラウザで本ページを開くと HDRとして表示が行われる。
※1 Color primaries: BT.2020, Transfer characteristics: ST 2084, Matrix coefficients: BT.2020
CICP を埋め込んだ AVIF の作成については以下の記事を参照して頂きたい。
理論
Color Space は HDRに対応しており、0~10000 nits の範囲で任意のピーク輝度の Color Space を作成することが可能である。 今回は 100nits, 1000nits, 10000nits のテストパターンを作成する。
任意のピーク輝度の Color Space の作成方法を説明する。 まずは to 変換のおさらいおする。変換の数式は以下の通りである[1]。
ここで (8)式の X_D65, Y_D65, Z_D65 に注目する。SDR の D65 は 100 nits をピーク輝度とするため[2]、D65 の xy色度を (0.3127, 0.3290)
とすると X_D65, Y_D65, Z_D65 は (95.046, 100.00, 108.91)
となる。
同様に HDR の 1000 nits, 10000 nits に対して X_D65, Y_D65, Z_D65 を計算すると以下となる。
Peak Luminance | X_D65 | Y_D65 | Z_D65 |
---|---|---|---|
100 nits | 95.046 | 100.00 | 108.91 |
1000 nits | 950.46 | 1000.0 | 1089.1 |
10000 nits | 9504.6 | 10000 | 10891 |
100 nits, 1000 nits, 10000 nits がピーク輝度の Color Space を作成には、上の表に示した X_D65, Y_D65, Z_D65 を最大値とする Color Space を考えれば良い。
それでは各ピーク輝度での Color Space の作成方法を説明する。今回の場合では Color Space を作成するには Gamut Boundary を計算する必要があるため、以後は各ピーク輝度での Gamut Boundary の計算方法について述べる。
今回も前回に引き続き以下の方針で計算をした。
- 空間において Hue を 4096個に分割し、4096枚の 平面を用意する
- 各 平面で を 1024個に分割する
- 各 ついて を変化させて to 変換した結果が 0.0~1.0 の範囲に収まる最大の 値を計算し、それを Gamut Boundary とする。
(CIELAB空間ではあるが)図で雰囲気を確認できるものが以下の記事の 図5~図11 にある。必要に応じて参照して頂きたい。
BT.2020 色域確認用の Hue-Chroma テストパターンの改善 - toruのブログ
概要は上記の通りであるが、手順 3. の to 変換 の際にピーク輝度を考慮する必要がある。続いてこの点について説明する。
to RGB 変換 の具体例を下図 の Chroma - Lightness 平面(Hue = 0°)で説明する。図には の 4点がプロットしてある。
この 4点を 10000 nits, 1000 nits, 100 nits のピーク輝度で to 変換 すると以下の表の通りになる。 ここで1列目の の はそれぞれ 点Pのインデックス、各チャネルのインデックスを意味している。 例えば XYZ の列の は、ポイント の を XYZ に変換した後の Z チャネルの値を意味している。
さて、ここでのポイントは XYZ to RGB 変換後に RGB値を対象のピーク輝度で除算していることである。 この処理により任意の輝度レンジで が Color Space の内側か外側かを判断することができる。
上の表で対象の RGB値が 0.0~1.0 をオーバーする箇所を赤色で塗りつぶした。1つでも赤色が含まれている 点 は Color Space の外側の点と判断できる。 この性質を使用して Gamut Boundary の計算を行った。
100 nits, 1000 nits, 10000 nits の Gamut Boundary を計算した後は、以前の記事と同様 に Focal Point を求めた。その後に冒頭に示したテストパターンを作成した。
おまけ1
デバッグ用に Gamut Boundary および Focal Point をプロットした様子を以下の動画に示す。
おまけ2
自宅の BRAVIA で作成したテストパターンを確認していたのだが、TV の BT.2020色域カバー率が低く、BT.2020 Cups 付近では色はズレが発生しているように見えた。 そこで、対象の色域を DCI-P3 としたバージョンのテストパターンを作成した。参考までに添付しておく。
Luminance | Transfer Characteristics | Image without metadata (PNG) | Image with metadata (AVIF) |
---|---|---|---|
100 nits | 2.4 | ||
1000 nits | ST 2084 | ||
10000 nits | ST 2084 |
DCI-P3 の Gamut Boundary および Focal Point をプロットした様子も以下の動画に示す。
感想
記事を書くのに想定以上に時間がかかってしまった。記事では触れなかったが以下の3点で時間を消費した。
- BT.2020 Cups 付近で急激に Code Value が変化する原因の調査(ST 2084 の特性であり、そもそも疑問視する必要性が無かった)
- Hue が 252°~260° の範囲で BT.709 の Gamut Boundary の計算に失敗する問題の対応(暫定アルゴリズムを組んだが 計算に17時間必要&計算精度も低い。次の記事までに改善する予定)
- Python の Multiprocessing で思うように性能が出ない(解決できず…)
この手の計算には慣れてきたつもりだったが、まだまだ勉強が足りていないと感じた1ヶ月であった。引き続き継続的に勉強を続けていきたい。
参考資料
[1] Muhammad Safdar, Guihua Cui, Youn Jin Kim, Ming Ronnier Luo, "Perceptually uniform color space for image signals including high dynamic range and wide gamut", Opt. Express, 25(13):15131, June 2017.
[2] Report ITU-R BT.2408-4, "Guidance for operational practices in HDR television production", https://www.itu.int/dms_pub/itu-r/opb/rep/R-REP-BT.2408-4-2021-PDF-E.pdf
[3] toruのブログ, "BT.2020 色域確認用の Hue-Chroma テストパターンの改善", https://trev16.hatenablog.com/entry/2021/05/29/095614