toruのブログ

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

DaVinci Resolve の Rec.709-A の特性をプロットした

背景

  • 先日、某所で「Rec.709 と Rec.709-A の違いを説明して欲しい」と聞かれたのだが即答できなかった
  • 思い返すと一度も特性を確認したことが無かったのでプロットすることにした

目的

  • DaVinci Resolve の Rec.709-A の特性をプロットする
  • プロット結果から Rec.709-A の数式を推測する

結論

  • DaVinci Resolve の RCM *1 を使い Rec.709-A の EOTF/OETF をプロットした様子を図1~図4 に示す。
    • 比較用に Rec.709(無印)と Gamma 2.2 もプロットしてある
  • Rec.709-A の特性は Gamma 1.961( y = x^{1.961})である
    • そのため ITU-R BT.709 で定義されているカメラ用の OETF とは特性が異なっている
Rec.709-A の EOTF
図1. Rec.709-A の EOTF(緑の線) 図2. 低輝度領域を拡大表示したもの
Rec.709-A の OETF
図3. Rec.709-A の OETF(緑の線) 図4. 低輝度領域を拡大表示したもの
検証環境

今回は以下の環境で検証を行った。

項目
OS Windows 11 24H2
DaVinci Resolve VERSION 19.0.3 BUILD 5

詳細

以下で結論に至るまでの経緯を書いていく。 検証に使用した Resolve *2 のプロジェクトファイルやソースコードは最後にまとめて紹介する。

EOTF の特性確認

Blackmagic Design のドキュメントを読んでも Rec.709-A の特性については特に言及がなかったため、 Resolve の RCM を利用して特性を確認した。

具体的には図5 に示す 0 CV ~ 1023 CV の単調増加テストパターンに対して、 図6 に示す RCMでの変換と図7 に示すOpenEXR 形式での出力を行って確認することにした。

図5. EOTF の確認に使用した 0 CV ~ 1023 CV の単調増加パターン

図6. Resolve の RCM の設定 図7. Resolve の Deliver ページの設定

図6、図7 を見れば分かるように全体の処理は以下の流れとなっている。

  • ① 図5 の画像に Rec.709-A の EOTF を適用して Linear にする
  • ② Linear に変換された画像を OpenEXR で保存する

こうすることで、OpenEXR の画像データ自体が Rec.709-A の EOTF を示すものになる。

従って Rec.709-A の特性をプロットするには、保存した画像データから適当に 1 line を抽出してプロットするだけで良い。 プロットした結果が冒頭の 図1、図2 である。

OETF の特性確認

EOTF の確認と同じく Resolve の RCM を利用して特性を確認した(EOTF と似ている箇所が多いので、重要な差分に関しては赤文字にしておく)。

具体的には 図8 に示す 0.00003 ~ 1.0 の log2 スケールでの Rampパターン画像に対して、 図9に示す RCMでの変換と図10 に示す TIFF 形式での出力を行って確認することにした。

log2 スケールに関しては過去記事の DaVinci Resolve を使って Apple Log の特性を調べてみた を参照して頂きたい。

図8. OETF の確認に使用した 0.00003 ~ 1.0 と増加する Rampパターン

図9. Resolve の RCM の設定 図10. Resolve の Deliver ページの設定

図9、図10 を見れば分かるように全体の処理は以下の流れとなっている。

  • ① 図8 の画像の Rec.709-A の OETF を適用して Non-linear にする
  • ② Non-linear に変換された画像を TIFF で保存する

こうすることで、TIFF の画像データ自体が Rec.709-A の OETF を示すものになる。

従って Rec.709-A の特性をプロットするには、保存した画像データから適当に 1 line を抽出してプロットするだけで良い。 プロットした結果が冒頭の 図3、図4 である。

Rec.709-A の Gamma 値の確認

Rec.709-A の EOTF の特性は図1に示す通り得ることができたが、具体的な Gamma 値を得るにはもうひと手間必要である。 そのため以下のことを行った。

まず、EOTF の Gamma カーブは以下の数式で表現できる。

 \displaystyle
\begin{aligned}
y &= x ^ \gamma
\end{aligned}

そのため  \gamma は以下の数式で計算可能である。

 \displaystyle
\begin{aligned}
\gamma &= \log_x y
\end{aligned}

今回、画像ファイルとして得られている Rec.709-A の EOTFデータは合計 1023 点ある。 そのため、開始点と終了点を除く 1021点については Gamma値の計算が可能である*3

ということで 1021点について Gamma値を計算した上で各種統計データを確認したところ以下の結果となった。

項目
平均 1.9609994
標準偏差 0.0000052
最小値 1.9608580
最大値 1.9610026

標準偏差が極めて小さいことから Rec.709-A は単純な Gamma カーブ (power 関数) であることが分かる。 グラフでの目視確認の内容も踏まえて、筆者は Rec.709-A の Gamma値は 1.961 であると結論付けた。

再現実験用のデータ&ソースコード

筆者の行った検証を第三者が後から確認できるようにデータとソースコードを添付しておく。
(ただし、ソースコードは筆者の開発環境でないと動かない可能性が高いです。参考程度に…)

Resolve のプロジェクトファイル

検証に使用したプロジェクトファイルを添付しておく。

drive.google.com

Resolve 制御用の Pythonスクリプト

今回は Pythonスクリプトを使って Resolve の制御を行ったので、そのコードも参考情報として添付しておく。

github.com

グラフのプロットを行ったコード

EOTF/OETF のグラフのプロットを参考情報として添付しておく。

github.com

Gamma値算出のコードを参考情報として添付しておく。

github.com

感想

久しぶりに Python から Resolve を制御するコードを書けて満足した。

*1:Resolve Color Management の略

*2:以後は DaVinci Resolve のことを Resolve と略す

*3:開始点と終了点は nan になってしまう