toruのブログ

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

Linear のデータに 3DLUTを適用する際は Shaper 1DLUT が必要

目的

Linear のデータに 3DLUT を適用する際は Shaper 1DLUT が必要であることを示す。

背景

過去記事で 自分は以下の記述をした。

一般に Linear のデータに対して 3DLUT を適用する場合は、低階調の精度低下を防ぐために Shaper と呼ばれる 1DLUT を適用する。

この 低階調の精度低下 が具体的にどのようなものか、いつものテストパターンで図示したいと思っていた。なので図示する。

結論

Linear のデータに対して、とある画像処理(※)をする際に Shaper 1DLUT + 3DLUT の組み合わせで変換することで、低階調(低輝度)の精度低下を防ぐことに成功した。結果を図1に示す。

※今回の処理は色域変換(BT.2020 to BT.709)とガンマ補正(1/2.4乗)

図1は上から順に以下の変換となっている。

  • 数値計算を利用したLUTを使わない理論通りの変換(Reference画像)
  • Shaper 1DLUT + 3DLUT を用いた変換
  • 3DLUT のみを用いた変換

3DLUT のみだと低輝度で黒つぶれが発生し理論値からズレることが分かる。

説明
Reference f:id:takuver4:20191022141238p:plain
Shaper 1DLUT + 3DLUT f:id:takuver4:20191022141259p:plain
3DLUT Only f:id:takuver4:20191022141311p:plain
図1. とある画像処理の実行結果比較

理論

まず、大前提として以下2点の事実がある。

  1. 人間の知覚は低輝度領域には敏感であり、高輝度領域には鈍感である[1]
  2. (一般的な)3DLUT は低輝度も高輝度も同じ重みで均等に処理する

この事実から、単純に3DLUTのみを適用すると低輝度領域の補間処理で誤差増大してしまう。これを防ぎ、3DLUT を使いつつも低輝度領域に3DLUTの格子点を多く割り当てるのが Shaper 1DLUT である。

例を1つ挙げる。ガンマ補正は  {y = x^{1/2.4} } の計算式で表現できる。この計算式は人間の視覚特性にマッチするように、低輝度領域は変化が急峻で高輝度領域は変化が緩やかな関数となっている。

このガンマ補正を 3DLUT で行う場合に Shaper 1DLUT を利用する場合と、しない場合の格子点間の補間演算のイメージ図を図2に示す。

説明
Shaper 1DLUT + 3DLUT f:id:takuver4:20191022141342p:plain
3DLUT のみ f:id:takuver4:20191022141354p:plain
図2. Shaper 1DLUT の有無による補間計算の違い(イメージ図)

Shaper 1DLUT を利用すると、低輝度領域に格子点が密集することになり、視覚的に重要な低輝度領域の変換誤差を軽減できる。

その一方で、表現可能な最低輝度に制限が生じてしまうのだが…それは次の記事で触れる予定である。

終わりに

もやもやしていた所を書くことが出来てスッキリした。次はいよいよ本命の Shaper 1DLUT + 3DLUT を用いた ACES Output Transform の実現の検証に戻ろうと思う。

おまけ

Shaper 1DLUT と 3DLUT の生成コードは以下に置いてある。参考までに…。

github.com

参考資料

[1] コンポジゴク, "ガンマについて", http://compojigoku.blog.fc2.com/blog-entry-23.html