
みなさん、こんにちは。大西です。
映像の色を変えるときに、よく”ラット(LUT)をあてる“と言います。
普段仕事で使うので、なんとなく分かっているようで正しくは分かっていないような”ラット(LUT)“という言葉。
このページでは、今後LUTに関連する解説をします。
みなさまが本ページを読むことで、”なんとなく分かっているもやもや感“が少しでもクリアになると嬉しいです。
- 第一回 LUTの基本
- 第二回 3次元LUTとは?
- 第三回 補間の必要性とLUTの精度について
- 第四回 計算式とLUTの関係
- 第五回 画像の色変換におけるLUTの役割とは?
- 第六回 では実際にLUTはどうやって活用すれば良いの?
※講座の内容は変更になる可能性があります。
まず初回の前回は、LUTの概念を1次元LUTで説明しました。そして、最後に1次元LUTでは表現できない色変換があることをお伝えしました。そこで今回は、現場でよく耳にする「階調を硬くする」「彩度を上げる」ということを題材に、3次元LUTについて解説していきたいと思います。
みなさんは現場で「階調を硬くすると彩度も上がってしまう」という話を聞いたことがあると思います。実はこれ、1次元LUTを使って階調を硬くした場合の典型的な現象なのです。
図①が階調を硬くした場合のグレーのグラデーション画像です。
グレーグラデーション画像を硬く(硬調に)すると、
"白はより白く、黒はより黒く"変換されることがわかります。
ちなみにこの逆は、「階調を軟らかく(軟調に)する」といいます。

では、図①の変換を実現する1次元LUTの例(図②)とそれをグラフ化したもの(図③)を見てみましょう。
図②を見ると、入力RGB=(140, 140, 140)(●A)が出力RGB=(240, 240, 240)、すなわち"白がより白く"
同様に、入力RGB=(80, 80, 80)(●B)が出力RGB=(50, 50, 50)へ、"黒がより黒く"なっていることが分かります。


それでは階調を硬調にする図②の1次元LUTを使って、
図④の薄緑 入力RGB=(120, 140, 120)を変換してみましょう。
入力RGB=(120, 140, 120)を図②の1次元LUTを使って変換すると
出力RGB=(120, 240, 120)に変換されます。
このとき"RGBの平均値に比べて、強調したい要素
(この場合Gの値)が大きくなっている"ことがわかります。
これが彩度があがったという数値的な意味です。
ちなみに、彩度が下がればその逆になり、RとGとBの値が
RGBの平均値に近づきます。その最たるものが、
RGB=(120, 120, 120)のように、RとGとBの値がRGBの平均値と
一致している場合で、この場合は無彩色(グレー)になります。

階調を硬調にするためにグレーの入力RGB=(80, 80, 80)、入力RGB=(120, 120, 120)、入力RGB=(140, 140, 140)の3点を
出力RGB=(50, 50, 50)、出力RGB=(120, 120, 120)、出力RGB=(240, 240, 240)に変換する1次元LUTを使うと、必然的に
薄緑の入力RGB=(120, 140, 120)は、出力RGB=(120,240,120)に変換されて彩度があがってしまいました。
このことから階調を硬調に変換する1次元LUTを使うと同時に彩度も上がってしまうことが数値的にもおわかりいただけたかと
思います。
では、グレー階調は硬調にしたいが、彩度は変えたくない場合はどうしたらよいでしょうか?
つまり、グレーの入力RGB=(140, 140, 140)は出力RGB=(240, 240, 240)に変換しながら、薄緑の入力RGB=(120, 140, 120)は
出力RGB(120, 140, 120)のままにしたい場合はどうしたらよいでしょう?
まず思いつくのは、G用の1次元LUTの入力値=140→出力値=240を入力値=140→出力値=140に書き換えることです。
しかし、そうすると薄緑の入力RGB=(120, 140, 120)は出力RGB=(120, 140, 120)になりますが、グレー階調の
入力RGB=(140, 140, 140)は出力RGB=(240,140, 240)(マゼンタ色)になってしまいます。図⑤

つまり、入力RGB=(140, 140, 140)→出力RGB=(240, 240, 240)を実現し、
同時に入力RGB=(120, 140, 120)→出力RGB=(120, 140, 120)を実現するのは1次元LUTでは不可能であることがわかります。
では一体どうすればいいのでしょうか?
単純な方法ですが、
入力RGB=(140, 140, 140)→出力RGB=(240, 240, 240) と、
入力RGB=(120, 140, 120)→出力RGB=(120, 140, 120)の
組み合わせを対応表として保持しておけばよいのです。
つまり、"1つの入力値"に対して"1つの出力値"を参照する
LUTではなく、RとGとBの"3つの入力値の組み合わせ"に対して
"RとGとBの出力値の組み合わせ"を参照するLUTを用意すれば
よいのです。
このように"3つの値の組み合わせ"で参照するLUTを、『3次元LUT』
と呼びます。

RGBが8bitの場合の全てのRとGとBの組み合わせに対する
3次元LUTの例を図⑥に示します。この3次元LUTを使えば、
入力RGB=(120, 140, 120)→出力RGB=(120, 140, 120)
入力RGB=(140, 140, 140)→出力RGB=(240, 240, 240)
上記2つの変換を同時に実現できることが分かります。
これにより、例えば図⑦の画像のグレー階調を硬くしたい場合、1次元LUTを使うと図⑧のように彩度も上がってしまいますが、
3次元LUTを使えば図⑨のように彩度を抑えつつグレー階調を硬くすることが可能です。



さて、お気づきの方も多いと思いますが、図⑥の3次元LUTを保持しておくには大量のメモリーが必要になります。
8bitの1次元LUTでは256x3=768組のデータですみましたが、3次元LUTでは、256^3=16,777,216(1677万)組のデータが
必要になります。