■LUTとは?
LUTは複雑さの異なる 1D LUTまたは 3D LUTをオプションとする変換行列です。
一例として、1D LUTは以下のようになります:
メモ:
厳密には、これは各色 (R,G,B)が 1D LUTなので 3x 1D LUTです。
R, G, B
3, 0, 0
5, 2, 1
7, 5, 3
9, 9, 9
つまり:
R, G, Bの各入力値が0のとき、 出力値は R=3, G=0, B=0 となります。
R, G, Bの各入力値が1のとき、 出力値は R=5, G=2, B=1 となります。
R, G, Bの各入力値が2のとき、 出力値は R=7, G=5, B=3 となります。
R, G, Bの各入力値が3のとき、 出力値は R=9, G=9, B=9となります。
おかしなLUTですが、所定のR, G, または B 入力値に対し、R, G, Bの出力値が決まるということです。
ですから、ピクセルのRGB入力値が 3, 1, 0 の場合、出力ピクセルは 9, 2, 0となります。
Rの入力値が 2に変わり、G とBはそのままなら、R出力値のみ変化し、出力ピクセルは7, 2, 0となります。
1D LUT と 3X3行列
1D LUTの限界を克服するため3x3 行列を用いるとカラースペースをフルに使ってリニアスケーリングにより色の彩度と輝度をコントロールすることができます。基本的に、行列は内部のコンテンツではなく、色域の形を表すシンプルな数式としてみることができます。
R x x x R
G = x x x = G
B x x x B
このアプローチを使うと '許容範囲の' キャリブレーション結果を得ることができますが、ディスプレイのノンリニアリティ属性については補正が行われません。
3D LUT
1D LUTとマトリクスの組み合わせはカラーコントロール機能に限界があるので、カラースペースの量的コントロールをフルに行うことのできる3D LUTが好まれます。
3D LUTはもう少し複雑で、R,G,Bそれぞれの入力値に基づいてR,G,B出力値を変化させることのできる3次元キューブをベースとしています。
下のような図にするとわかりやすいでしょう:
3つのカラープレーンが交差するポイント(ある入力値に対するLUT出力ポイント)を見てみると、入力色をひとつ変えると3つの出力値がすべて変わります。1つの色を変えると他の色も相互に変化します。
色の値によって、各座標軸の方向にカラー 'プレーン' が元のポイント (0, 0, 0) から離れて対応する色の値を示す位置に移動することがおわかりいただけたでしょうか。
3D LUTはボリュメトリックカラースペース全体のすべてのカラーポイントについて正確に動作を記述するので、ディスプレイのどんなノンリニアリティ属性も扱うことができ、現在多くのディスプレイが悩まされている突発的な色の分離などを正確に処理することができます。
3D LUTは単純なガンマや色域、トラッキングエラーから複雑なノンリニアティ属性、カラークロストーク(色の分離)、色相、彩度、輝度に至るまで、ディスプレイキャリブレーションのあらゆる問題に対処することができるため、 正確なキャリブレーションに適しています。基本的に、あらゆるディスプレイキャリブレーションエラーに対応可能です。
高いレベルの色の制御を行うことができるため、3D LUTはクリエイティブルック管理やグレーディング等にも使われます。
けれども、異なるカラースペース(Rec709, P3, sRGB等)の変換などのもっとシンプルな色変換には、行列(マトリクス)を使うのが一般的です。もっとも、その場合もクリエイティブシステムで直接行列を扱うものはあまりないため、3D LUTフォームが使われます。
それなら、3D LUTは1Dよりも優れた方法ということでしょうか?
このページの 1D vs. 3D比較をみると、そう思われたでしょう?
それは、LUTの要求内容とアプリケーションによります。
1D LUTは通常すべての入力から出力に値を持ちますので、 1Dに限定した変換では非常に正確です。
もし 3D LUTに入力と出力の組み合わせすべてに値を持たせると、LUTデータは非常に大きくなってしまいます – 重たすぎて、実用的ではないでしょう。10ビットイメージワークフローについて入力から出力毎の値を3D LUTに持たせると 1024ポイントLUTとなり、1,073,741,824 ポイント (1024^3)の計算になります。
したがって、ほとんどの 3D LUTは17^3 から 64^3の範囲のキューブを用います。 17^3 LUT は、各軸について、17の入出力ポイントがあり、これらのポイント間の値は間引かれるという意味で、システムによってこの間引きの精度が異なるため、2つの異なるシステムで扱われる3D LUTは予測に基づき、若干異なる結果になります。
LUTサイズが非常に大きい場合を除き、2つのシステムで同じ3D LUTを使って、まったく同じ結果を得ることはまれですので、使用される補間の量に限定されます。
3D LUTが記述される方法についても紛らわしい部分があります。
R, G, Bの3つの数列があるのはかわりませんが、通常、青の変化が一番速く、次に緑、最後に赤の順番です。
以下は、 'default bypass' 17^3 3D LUT の最初の数行です- 出力は入力と同じです:
R, G, B
0, 0, 0
0, 0, 64
0, 0, 128
0, 0, 192
0, 0, 256
0, 0, 320
0, 0, 384
0, 0, 448
0, 0, 512
0, 0, 576
0, 0, 640
0, 0, 704
0, 0, 768
0, 0, 832
0, 0, 896
0, 0, 960
0, 0, 1023
0, 64, 0
0, 64, 64
0, 64, 128
0, 64, 192
0, 64, 256
0, 64, 320
0, 64, 384
0, 64, 448
0, 64, 512
0, 64, 576
0, 64, 640
0, 64, 704
0, 64, 768
0, 64, 832
0, 64, 896
0, 64, 960
0, 64, 1023
0, 128, 0
0, 128, 64
0, 128, 128
0, 128, 192
0, 128, 256
0, 128, 320
0, 128, 384
..., ..., ..,
ここでみられるのは、青は17ポイントサイクルを素早く動き、緑は青のサイクル1回ごとに自身のサイクルを更新、赤はLUTの長さ全体で一度だけ更新、つまり緑の17サイクル分が1サイクルになります。
この42行の続きで全体としては4913行になります。..
上の 「キューブ」図で、赤のプレーンは17ポイント(位置)の最初から始まります。
緑のプレーンも最初のポイントにあります。青も同様です。
この位置の出力値は、LUTの最初の行として記録されます (0, 0, 0)。
赤のプレーンと緑のプレーンはその場にとどまりますが、青は2番目の位置に移動します。
この位置の出力値はLUTの2行目として記録されます (0, 0, 64)。
青について、これが17ポイント(位置)すべてについて継続します。
そして緑が2番目のポイントに移動し、青は再び17ポイント移動します。
緑が17ポイントすべてに移動し終えると、赤が2番目のポイントに移動し、再び移動サイクルが始まります。
これでわかりましたか?
ですから、バイパスではないLUTについては、各プレーンの位置は17ポイントそれぞれについて変化し、目的の出力値を生成します。
したがって本当の「キャリブレーション3D LUT」の行は以下のように始まります:
R, G, B
0, 0, 0
0, 0, 36
0, 0, 112
0, 0, 188
0, 0, 261
0, 0, 341
0, 0, 425
0, 0, 509
0, 0, 594
0, 0, 682
0, 0, 771
0, 0, 859
0, 0, 955
0, 0, 1023
0, 0, 1023
0, 0, 1023
0, 0, 1023
0, 32, 0
0, 28, 28
0, 28, 96
0, 24, 172
0, 24, 252
0, 20, 333
0, 20, 417
0, 12, 501
0, 12, 586
0, 8, 674
0, 4, 762
0, 4, 851
0, 0, 943
0, 0, 1023
0, 0, 1023
0, 0, 1023
0, 0, 1023
0, 92, 0
0, 88, 20
0, 88, 88
0, 88, 164
0, 84, 244
0, 84, 321
0, 80, 405
..., ..., ...,
したがって、本質的に3D LUTが行うのは、入力値をとって、RGBトリプレットそれぞれについて新しい出力値を生成することです。
一般的に(そして、先述した3D LUTと1Dの精度の比較を完全に無視すると) 1D LUTにも使い道がありますが、3D LUTは実世界での適用においてずっと精度が高いということになります。
次の Marcyの画像は、1D LUT と 3D LUTの違いを表しています。
上の画像は1D LUT、下が3D LUTの結果です。 どちらのLUTもまったく同じデータに基づくものです。
ご覧のとおり、主な違いは彩度レベルで、1D LUTは彩度を輝度と別々に変えることができません。
LUTサイズ
LUTサイズについては、適正なサイズとは、など多くの混乱があります。
LUTについては3つの主要部分があります。
あるLUTのサイズは、まずはそれが使われるDIシステムまたはLUTボックスが使用できるサイズによって決まります。一般的なサイズは5^3 から 64^3 です。
あるシステムにおけるLUTサイズは、そのシステムがリアルタイムで扱えるサイズを基準にしていますので、一般論として、よりハイエンドなシステムでは大きなサイズのLUTを扱うことができます。ですから、LUTサイズの問題をシステムから切り離して議論するのは間違っています。DIシステム(またはLUTボックス)が扱えるサイズによるのです。
2つめ、そしてより重要かもしれないことは、ディスプレイのキャリブレートにLUTを使うには、プロファイルデータからLUTを作成するということです。
LUTプロファイルデータの生成には時間がかかります。あるディスプレイについて正確な結果を得るには、非常に正確なプロファイルを作成する必要があります。同じことがフィルムについても同じで、フィルム現像用のプロファイルデータを生成するには、フィルムのネガとフィルムプリントストックの密度を正確に測定してプロファイルを作成する必要があります。
テクニカルLUT(キャリブレーションLUTではない)は、ディスプレイのプロファイリングを行う必要がないので 簡単に生成することができます。したがって、どんなサイズでも思いのままです。単に数式により行列またはLUTを生成すればよいのですから。
「クリエイティブLUT」についても同じことがいえ、 グレードからLUTを必要なサイズに応じてRIPします。
キャリブレーションLUTを作成するには、できるだけ多くのポイントをプロファイルするべきです(一部のキャリブレーションシステムでは、少ないポイントから「予測」することによって省略しようとしているようですが)。ですから、問題はプロファイリングにかかる時間です。
3つめのポイントは、小さいプロファイルからいかにして大きなLUTを生成するかということです。これにはLUT生成中に優れた内部カラーエンジン処理が必要で、これが LightSpace CMS が他のキャリブレーションシステムと比較して圧倒的に優れている点です。
一部のDIシステムやLUTボックスも内部的にとても優れたLUT補間を行い、17ポイントLUTを使ってすばらしい結果を得ることができます。ほかのものは違います!補間システムが悪い場合は自身で適切な補間を行うことができないため、より大きなLUTが必要になります。
キャリブレーション VS. テクニカル VS. クリエイティブルック LUT
LUTはいろいろな場面や方法で使うことができますが、主な用途はキャリブレーション、テクニカル、クリエイティブの3つの分野です。
キャリブレーションLUTは、ディスプレイの不正確さを「補正」するために使います。キャリブレートされたディスプレイではすべての画像がディスプレイの機能や制限の許す限り、できるだけ正しく表示されるようにします。これらの生成には非常に高い精度が求められるので、いちばん重要なLUTといえるでしょう。さもないと、「キャリブレート済みの」ディスプレイが不正確で、ワークフローチェーンに悪影響を与えてしまいます。
このことが、LightSpace CMSが他のキャリブレーションシステムの追従を許さずデファクトスタンダードとなっている理由です。
テクニカルLUTはひとつのカラースペースから別のカラースペースへの返還など、異なる「スタンダード」へ変換するために使われ、簡単に正確なLUTを生成することができるはずです。
驚くことに、多くのテクニカルLUTがまるで正確ではなく、異なるスタンダード間の変換をしようとして深刻な問題を起こしてしまう場合があります。
クリエイティブLUTはよく「ルックLUT」と呼ばれます。オンセットで撮影の間、DoPでルックを設定する際や、特定の伝統的なフィルムストックなどの特定のルックに似せたりするのに使われるからです。