toruのブログ

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

OpenColorIO を利用して Photoshop や Affinity Photo 2 で静止画の HDR表示(HDR10) を試したが失敗に終わった

1. 背景

  • 2022年12月に Adobe Camera Raw が HDR Output に対応し、Windows および macOS で 静止画の HDR表示が可能になった[1]
    • ただし Technology Preview のため正式な機能ではない
  • 加えて PhotoshopHDR表示に対応した[1]。(ただし macOS のみの対応で Windows は非対応)
  • 筆者は Photoshop を使った HDR表示を試したかったのだが、残念なことに自宅に macOS のマシンが無かった
  • 悔しかったので Windows マシンで OpenColorIO (以後 OCIO と略す) を使った 静止画の HDR表示を試すことにした

2. 目的

以下の制作ツール上で OCIO を使った色変換を行い Windows 環境で静止画の HDR表示を試す。

  • Photoshop
  • Affinity Photo 2 (※1)
  • Krita (※1)

具体的には以下の図0 の処理を上記ツールで行う。Input Transform, Output Transform は OCIO を使って行い、Color Correct の処理は上記のツールで行う。

図0. 今回の検証環境における色処理と OCIO の関係

※1 これらのツールは OCIO を使わずとも標準で HDR10 の表示をサポートしているが、今回はその確認は行わない

3. 結論

図0 に示す処理内容で HDR表示をすることは非常に困難ということが分かった。残念ながらどの制作ツールでも意図通りの表示はできなかった。

今回の検証で得られた教訓は以下の通りである。

  • 全ての色変換処理を OCIO のみで完結させるのは困難
    • どこかの工程で制作ツール側の色変換処理が適用されてしまい想定通りの結果が得られなかった
  • 画像ファイルには OpenEXR など 32-bit の float 型で保存できるフォーマットを使うべき
    • 最初、筆者は 16-bit int型のファイルを使って検証していたが、失敗が続く結果となった
    • 制作ツール内部で 16-bit int --> 32-bit float に変換すると、制作ツール内部で自動的に EOTF が適用されてしまった (※2, ※3)
    • OCIO のみで色変換処理を完結させるためには、この EOTF をキャンセル必要がある
  • その一方で残念ながら 32-bit float 型の画像ファイルを使っても、ツール内部で自動的に OETF が適用される傾向にあった (※2, ※3)
    • 表示デバイスへの出力用に Linear to Non-linear の OETF が自動的に適用されてしまう
    • OCIO のみで色変換処理を完結させるためには、この OETF をキャンセルする必要がある

※2 ツール側で自動的に EOTF/OETF を適用するのは、一般的な色処理のフローを考えると理に適っている。今回は筆者が無理矢理に OCIO を使ったリニアワークフローおよび HDR表示を試そうとしたため不都合が生じた
※3 筆者の推測する、制作ツール内部での Non-Linear to Linear (EOTF) と Linear to Non-Linear (OETF) 変換の様子を図1 に示す。

図1. 制作ツール内部で EOTF/OETF が適用される様子(筆者の推測

4. 詳細

4.1. ツールのバージョン

使用したツールのバージョンは以下の通りである。

ツール名 バージョン 備考
Photoshop v24.1.0 プラグインとして OpenColorIO for Photoshop v2.1.1 も利用
Affinity Photo 2 v2.0.3
Krita v5.1.4

なお、OS に関しては Windows 11 Pro 22H2 OS build 22621.1105 を使用した。

4.2. 事前準備

検証を行うにあたり以下3点の事前準備を行った。それぞれ詳細を述べる。

  • OCIO の config ファイル
  • 確認用のテストパターン
  • Windows OS の Color Management

4.2.1. OCIO の config ファイル

今回の検証用に以下のリンクの config_v1.ocio を作成した。これは筆者オリジナルの config ファイルである。

drive.google.com

記載内容は必要最小限になっており、以下の Colorspace しか定義していない。

  • ACES - ACES2065-1
  • BT.709 - Gamma 2.4
  • BT.2020 - SMPTE ST2084
  • P3D65 - SMPTE ST2084

また、内部処理は全て Display referred で行っている (RRT は存在しない)。本来は ACES2065-1 を Scene referred として扱うべきなのだが、 Scene referred と Display referred の変換を config.ocio に記述するのが面倒だったので省略した。ご容赦頂きたい。

また、本記事では OCIO の色変換に関して以下の用語を定義して使用することとした。

  • Input Transform: Non-linear 空間から ACES - ACES2065-1 への変換
  • Output Transform: ACES - ACES2065-1 から Non-linear 空間への変換

4.2.2. 確認用のテストパターン

筆者が日常的に使っている P3D65 - SMPTE ST 2084 のテストパターンを使用した。 名前から分かるように以下の特性を持ったテストパターンである。

  • Gamut: BT.2020
  • Transfer Characteristic: SMPTE ST 2084
  • White point: D65

16-bit int型のテストパターン P3D65_ST2084_1920x1080.png は以下のリンクからダウンロードできる。

drive.google.com

加えて、上記の画像データを 32-bit の float型 (OpenEXR形式) に変換した P3D65_ST2084_1920x1080.exr も準備した。 こちらも以下のリンクからダウンロードできる。これらのファイルは再配布さえしなければ自由に使って貰って構わない。

drive.google.com

32-bit float型のファイルを用意した理由は 16-bit int型だと OCIO の変換を行う際に不都合があったからである。 具体的な内容は 4.3.3. および 4.4.2. を参照。

なお、大変ややこしいが P3D65_ST2084_1920x1080.exr の Transfer Characteristic は SMPTE ST 2084 である。 .exr ファイルではあるが Non-linear であることに注意して頂きたい。

4.2.3. Windows OS の Color Management

図2 の通りに sRGB IEC61966-2.1 を指定した。目的は各種ツールの色変換機能が働くリスクを最小にすることである。

筆者は以下の3つのプロファイルを全て sRGB IEC61966-2.1 に設定すればツール上の色変換が無効化できると考え、準備の1つとして図2 の設定を行った。

  • 画像のプロファイル
  • 作業スペースのプロファイル
  • ディスプレイのプロファイル

図2. Display Profile を sRGB とした様子

4.3. Photoshop

ここから各種ツールでの検証内容を述べていく。 まずは Adobe Photoshop の検証内容を報告する。

なお、冒頭で述べたとおり PhotoshopWindows版では HDR表示には非対応である。 従って Windows OS側の HDR設定を On にした場合の HDR表示は不可能である。 しかし筆者は WindowsHDR設定 が Off の状態でも強引な手を使えば HDR表示は可能であると考えていたため試すことにした。

4.3.1. 事前準備

Color Settings

メニューの Edit --> Color Settings の内容は図3 のようにした。RGB の Working Space を Monitor RGB -sRGB IEC61966-2.1 にした。 これは Photoshop 側で OCIO 以外の色変換が働くリスクを下げるためである。

図3. Color Settings の内容

OCIO

Photoshop は標準では OpenColorIO をサポートしていないため、fnord software blog にて公開されていたプラグイン[2] を導入した。 Photoshop において OpenColorIO のプラグインを利用して図0 の色処理を行うためには、事前に LUT を作成する必要がある。そのため以下の作業を行った。

  • Photoshopプラグイン用フォルダにプラグインのファイル一式を置く
  • Photoshop のメニューバーから「Filter --> OpenColorIO --> OpenColorIO」を選択する
  • ③ 図4 を参考に以下の設定を行う
    • Configuration に config_v1.ocio を指定
    • ラジオボタンで Convert を選択
    • プルダウンメニューの Input Space と Output Space をそれぞれ P3D65 - SMPTE ST2084ACES - ACES2065-1 とする
    • Export を押下し P3D65_ST2084_to_ACES2065-1.cube として保存
    • Cancel を押下してウィンドウを閉じる
  • Photoshop のメニューバーから「Filter --> OpenColorIO --> OpenColorIO」を選択する
  • ⑤ 図5 を参考に以下の設定を行う
    • Configuration に config_v1.ocio を指定
    • ラジオボタンで Convert を選択
    • プルダウンメニューの Input Space と Output Space をそれぞれ ACES - ACES2065-1BT.2020 - SMPTE ST2084 とする
    • Export を押下し ACES2065-1_to_BT2020_ST2084.cube として保存
    • Cancel を押下してウィンドウを閉じる
図4. Input Transform の設定 図5. Output Transform の設定

4.3.2. OCIO を用いた HDR 表示の検証を実施

事前準備が終わったので、いよいよ OCIO を使った色変換を試していく。

ファイルを開く
  • P3D65_ST2084_1920x1080.png を開く
  • メニューから Image --> Mode --> 32 Bits/Channel を選択
Input Transform、Output Transform、Color Correct を Layer として追加する
  • メニューから Layer --> New Adjustment Layer --> Color Lookup を選択
  • 名前を Input Transform に設定
  • Load 3D LUT のプルダウンメニューから Load 3D LUT を選択し、事前準備で作成した P3D65_ST2084_to_ACES2065-1.cube を選択


  • メニューから Layer --> New Adjustment Layer --> Color Lookup を選択
  • 名前を Output Transform に設定
  • Load 3D LUT のプルダウンメニューから Load 3D LUT を選択し、事前準備で作成した ACES2065-1_to_BT2020_ST2084.cube を選択


  • メニューから Layer --> New --> Layer を選択
  • 名前を Color Correct に設定
  • Color Correct Layer を Input Transform と Output Transform の間に配置 (図6)

図6. 各Layer を準備した様子

ブラシツールで何か書いてみる
  • Color Picker (Foreground Color, 32-bit) のウィンドウで (R, G, B) = (0.18, 0.18, 0.18) を指定 (図7 参照)
  • ブラシツールで何か描画する
  • Color Picker (Foreground Color, 32-bit) のウィンドウで (R, G, B) = (10.0, 10.0, 10.0) を指定 (図8 参照)
  • ブラシツールで何か描画する
図7. Color Picker で 0.18 を指定 図8. Color Picker で 10.0 を指定
保存する
  • メニューから File --> Export --> Export As を選択して保存する
    • Export As ダイアログボックスの Color Space の Convert to sRGBEmbed Color Profile のチェックは外す(図9)参照

図9. Export 時の Color Space 設定

4.3.3. 結果と考察

結果

Photoshop にて OCIO を利用した HDR画像の表示、および編集後の画像の保存結果は以下となった。見て分かるとおり大失敗である。

図10. モニターで見る画像の様子 図11. 保存した画像の様子
考察

筆者は失敗の原因は 2つあると考えている。

  • Photoshop 内部で 16-bit int型から 32-bit float型への変換を行った
  • ② Output Transform を 3DLUT で行った

① に関して言うと、筆者は Photoshop が float で画像処理を行うように、メニューから Image --> Mode --> 32 Bits/Channel の設定を行った。 色々と観察して分かったが、どうやらこの操作により (おそらく sRGB の) EOTF/OETF が適用されて全体の色変換に破綻が発生するようである。

若干の推測が入るが、Photoshop側の処理も含めた今回の色処理の全体像を図12 に示す。

図12. Photoshop側の処理も含めた色変換の様子(一部は想像)

それでは、最初から 32 bit のファイル (例えば OpenEXR形式) を使えばどうなるだろうか。もしかすると成功するかもしれないと考え、筆者は試してみた。 しかしこれもイマイチだった。sRGB の EOTF らしきものは回避できたが、sRGB の OETF らしきものが自動で適用されるため思ったような表示が出来なかった。

更に確認を続けたところ、メニューの View --> Proof Colors にて Monitor RGB を設定すれば、Photoshop側で自動的に適用される EOTF/OETF を無効化することができた。 が、後述の②の問題があるため、結局のところ想定通りの色変換はできなかった。

② に関しては冷静に考えれば当然の結果であった。Linear空間から任意の空間へのマッピングに 3DLUT を使う際は Shaper と呼ばれる 1DLUT も併用しないと暗部の変換精度が著しく落ちてしまう。

trev16.hatenablog.com

今回は Shaper を使っていなかったため暗部が黒つぶれする結果となってしまった。 なお、Photoshop で 1DLUT を Adjustment Layer として追加できるかは調べてみたが分からなかった…。

4.3.4. 総評

Photoshop にて OCIO を利用した HDR の表示は難しいことが分かった。OCIO を使って 32-bit の Linear 空間で作業をする場合は、Photoshop側が自動で適用する EOTF/OETF の影響を考慮する必要がある。

4.4. Affinity Photo 2

次に Affinity Photo 2 の検証内容を報告する。

Affinity Photo は Photoshopとは異なり 1.0 を超える HDRレンジの信号を表示できる[3]。そのためには 32-bit Preview panel にて Enable HDR を有効にすればよい。

しかし、いきなり Enable HDR を有効にするのではなく、まずは OCIO が想定通りに動作するか確認するため、最初は Enable HDR は無効化して検証を行った。

4.4.1. 事前準備

  • メニューから Window --> 32-bit Preview を選択して 32-bit Preview panel を表示する
  • メニューから Edit --> Preferences --> Color --> Select を選択し config_v1.ocio を指定する (図13参照)
  • その他の項目は図13 の通りにしておく

図13. Affinity Photo 2 の Color設定

4.4.2. OCIO を用いた色変換の確認 (Enable HDR Off) (1回目)

事前準備ができたので、早速 OCIO の動作確認を行う。なお1回目と書いてあることから推測できると思うが、後ほど2回目も行う。

筆者は以下の操作を行った。

  • P3D65_ST2084_1920x1080.png を開く
  • 32-bit float型に変換するためにメニューから Document --> Convert Format / ICC Profile を選択し以下の通りに設定
    • Format: RGB/32 (HDR)
    • Profile: sRGB IEC61966-2.1 (Linear)

と、ここまで行って筆者は 16-bit int型から 32-bit float 型への変換の際に sRGB の EOTF が画像に適用されることに気づいた。 なぜならば Profile として sRGB IEC61966-2.1 (Linear) を指定することになるからである (なお色変換が働かないようにプロファイルを選択することは不可能だった)。

このまま検証を進めると Photoshop の時と同じように失敗することは確実である。 そのため、この段階で 16-bit int型の画像ファイルを使うことは断念し、以後は入力画像として 32-bit float型の OpenEXR の画像ファイルを使う事にした。

4.4.3. OCIO を用いた色変換の確認 (Enable HDR Off) (2回目)

画像を開く
  • P3D65_ST2084_1920x1080.exr を開く
  • 32-bit Preview パネルにて Display Transform を Unmanaged に設定 (図14)

図14. 32-bit Preview の設定

OCIO を適用
  • Input Transform を用意
    • メニューから Layer --> New Adjustment Layer --> OCIO を選択
    • Source Color Space と Destination Color Space にそれぞれ P3D65 - SMPTE ST2084ACES - ACES2065-1 を設定 (図15)
    • Layer の名前を Input Transform にしておく
  • Output Transform を用意
    • メニューから Layer --> New Adjustment Layer --> OCIO を選択
    • Source Color Space と Destination Color Space にそれぞれ ACES - ACES2065-1BT.2020 - SMPTE ST2084 を設定 (図16)
    • Layer の名前を Output Transform にしておく
  • Layer の順番を 図17 のように整理しておく
図15. Input Transform の設定 図16. Output Transform の設定 図17. Layer の順序
ブラシツールで何か書いてみる
  • メニューから Layer --> New Layer を選択
  • Layer を Input Transform と Output Transform の間に置く
  • Color Chooser のウィンドウで (R, G, B) = (0.18, 0.18, 0.18) を指定 (図18 参照)
  • ブラシツールで何か描画する
  • Color Chooser のウィンドウで (R, G, B) = (10.0, 10.0, 10.0) を指定 (図19 参照)
  • ブラシツールで何か描画する
図18. 0.18 の色を指定 図19. 10 の色を指定
保存
  • メニューから File --> Export を選択
  • ファイル形式を EXR にして Export を実行 (図20 参照)

図20. Export の設定

結果

Affinity Photo 2 での画面表示の見た目および Exportしたファイルの見た目をそれぞれ図21、図22に示す。

想定通りの変換になっていることが分かる。0.18 と 10.0 の文字はそれぞれ 10-bit で 356 CV、769 CV となっており理論値と一致している。

図21. Affinity Photo2 上での見た目 図22. Export した結果

4.4.4. OCIO を用いた色変換の確認 (Enable HDR On)

OCIO の動作確認が済んだので、いよいよ Enable HDR を有効にして HDR10 の表示を試す。

手順

殆どの手順は先ほどの Enable HDR Off の時と同じである。差分は以下の2点のみ。

  • ① 事前に Windows の System --> Display --> Use HDR の設定を On にしておく
  • P3D65_ST2084_1920x1080.exr を開いた直後に 32-bit Preview パネルにて Enable HDR にチェックを入れる (図23)

図23. Enable HDR を有効にした様子

結果

Affinity Photo 2 にて OCIO を利用した HDR画像の表示を行った結果、および編集後の画像の保存結果は以下となった。

図24. HDRモニターに表示した様子 図25. 保存したファイルの様子

図24 を見ると分かるとおり異常に黒浮きしている。これはHDRの画像を SDRモニター向けに変換したからではなく、ST2084 をサポートしたモニターや TV で見ても黒浮きして表示された。その一方で Export した OpenEXR ファイルは想定通りの表示となった。

4.4.5. 考察

Photoshop の時と比較すると良い結果となった。ただ残念ながら HDR対応モニターや HDR対応TV で想定通りの表示を実現することは出来なかった。

色々と追加検証を行った結果、筆者は Affinity Photo 2 にて Enable HDR を有効にした場合は、以下の図26 のように Output Transform 後に意図しない SMPTE ST2084 の OETF が適用されると推測している。この OETF さえ無効化できれば OCIO を利用した静止画のHDR表示は行えそうなのだが、残念ながら無効化の方法は見つからなかった。

図26. Affinity Photo 2 で Enable HDR を有効にした場合の内部処理の推測

4.5. Krita

最後に Krita の結果を示す。

Krita に関してはそもそも OpenColorIO を使った色変換が想定通りに働かなかった。そのため細かい内容の記述は行わないでおく。

原因についても残念ながら何も推測できなかった。 例えば 図27 のように Input ColorSpace と View に同じ設定を行った場合、筆者は何も変換が行われないと想定していたのだが、なぜか変換が働いてしまった。 謎である。

図27. Krita での OpenColorIO の設定(スルー出力想定)

Krita に関しては「失敗した」という結果だけ記しておく。

5. 感想

完全に思いつきで始めた作業だったこともあり、残念ながら良い結果を出すことができなかった。 ただ、こういう作業は個人的には大好きなので没頭して作業することができた(その結果、自分が行うべき勉強をサボり続けることになったが…)。

次は After Effects で同様のことを調査してみたいと考えている。最近 OCIO に対応したようなので。

6. 参考資料

[1] Adobe, "HDR Output (Technology Preview)", https://helpx.adobe.com/camera-raw/using/hdr-output.html

[2] fnord software blog, "OpenColorIO for Photoshop", http://fnordware.blogspot.com/2017/02/opencolorio-for-photoshop.html

[3] Affinity Photo 2 Help, "32-bit Preview panel", https://affinity.help/photo2/en-US.lproj/index.html?page=pages/HDR/hdr_editing.html?title=32-bit%20HDR%20editing