2011-04-03

gamma,gain,lift など・・・

コンプをしてるとお客さんや監督などから「もっと明るく」とか「もう少し暗く」とか要望を受けることがあります。
で、nukeで「明るく」したり「暗く」するためのnodeやパラメーターは色々とあります。nodeでは、Grade、ColorLookUp、Histogram、ColorCorrection、Gammaなど。ただ、どれも機能的には被るので、ココではGradeを中心に見ていき、ColorLookUpと照らし合わせてみます。
まず、確認用にConstantとRampを使って、シモテからカミテへ黒から白のリニアのグラデーションを作りました。このとき、エクスプレッションを仕込んで、画の両端(全黒と全白)と真ん中(rgb=0.5,0.5,0.5)でその時のr値(明度)がテキストとして表示されるようにしています。


 Gradeノードには「blackpoint」、 「whitepoint」、 「lift」、「gain」、「nultiply」、「offset」、「gamma」とそれぞれパラメーターがあります。
で計算式は・・・

A = multiply * (gain - lift)/(whitepoint - blackpoint)
B = offset + lift - (A * blackpoint)
output = pow((A * input) + B), 1/gamma)

となります。
powってのは乗数でpow(a, b)で、aのb乗倍 という具合です。
これではわかり辛いので、一個ずつの要素でColorLookUpと共に確認していきます。

まず、whitepointとblackpointですが、たとえば、デフォルト値0のblackpoint=0.2とすると・・・ 
となります。Gradeノードはデフォルトでblackclampにチェックが入ってるんですが、ここではそれをオフにしてます。黒の領域が広がって中央に向かってそれに伴い中間値も落ちたって感じです。ただ、白は変わらない。



でこれをColorLookUpで再現してみると・・・



となります。blackpoint=0.2というのは、LUTで元々(x,y)=(0,0)のポイントが(x,y)=(0.2,0)になった時と同様の結果ということが分かります。要するに暗部が攻めてきてグラデの幅が縮まりそれに伴い中間値も0.5よりも小さい値になります。硬いというか、コントラストはあるけど幅が狭い感じです。
whitepointはこの逆です。LUTで言うところの元々x=1のポイントを操作したのと等しくなります。ココでは例としてwhitepoint=0.8でみてみます。


同様にColorLookUp


今度はハイが攻めてきたって感じですね。(x,y)=(1,1)のポイントが(x,y)=(0.8,1)となりハイ部分が強くなりコントラストがあるけど、幅は狭まります。

で次に、liftとgainをみてみます。lift=0.2はこうです。



暗部が持ち上げられてそれに伴い中間値もあがってます。でも、blackpointを変更したのと同様に白の値は変わりません。ただ、コントラストが弱まり、明暗の差は薄くなる傾向ですね。眠い(柔らかい)かんじでしょうか。
これをColorLookUpで再現すると、


  こんな感じ。要するに(x,y)=(0,0)のポイントが (x,y)=(0,0.2)となり、要するに暗部が持ち上げられ、それに伴い中間値があがっているのがLUTで確認できます。アウトプットの明暗差の幅が狭くなっていますね。アウトプットのコントラストは弱まっています。また、liftのみ変化だとすると考えると

output = input + ((1 - input)*lift) 


が成り立ちます。input=1(要するに(x,y)=(1,1)の部分)だとliftに0を掛けることになるので、lift値は関係なくなります。なので白部分は変化がありません。
同様に、gain=0.8とすると


 ハイが沈んでコントラストが弱まってます。
同様にColorLookUp



(x,y)=(1,1)のポイントが (x,y)=(1,0.8)で同様の結果を得ます。gainのみで考えると

output = input*gain 

が成り立ちます。
whitepoint、blackpointはいわゆる「画をしめる」という感じで、 lift、gainは持ち上げるとか沈ませるという印象でしょうか・・・


次に、multiplyですが、これは少しややこしいのですが、lift、gainの値で決まるLUTにかかる係数のようなものです。lift、gainがデフォルト値のままだと、gainだけを変更した場合と結果は同じです。


次に、offsetだけど、これは単純にその値を足し引きしてるだけでLUTで言えば上下にシフトしているって感じです。










で最後にgammaだけど、gamma単体だと

output = pow(input, 1/gamma)

が成り立ち、要するにインプットをgammaの値の逆数で乗数倍した結果になります。乗数って言われてもナカナカピンとこないですよね。対数カーブになるんですが、
たとえば、gamma=2なら0.5で乗数倍となり、グラフとしては、


こんな感じです。(x,y)=(0,0)、(x,y)=(1,1)の部分では変化が無いんですが、中間値が持ち上がります。
結果は

です。全体的に明るくなるけど、中間値が曲線的に持ち上がっているだけ黒、白に変化はないです。
同じくgamma=0.5なら2乗倍となり、グラフとしては、 


こんな感じです。同じく(x,y)=(0,0)、(x,y)=(1,1)の部分では変化が無いんですが、中間値が沈みます。結果は



です。全体的に暗くなるけど、中間値が曲線的に沈んでいるだけ黒、白に変化はないです。

といった感じですが、適用する画によってそのレンジが違ったりするので、その画がLUTでどのエリアを占めているかを想定しながら使用する方が、闇雲にやるよりは効果的だと思います。
また、clampしないとマイナスの値や1よりも大きい値をもったピクセルが生まれてしまい、merge operation(overだとかplusだとか)によっては、その計算式により、エッジがとても目立ってしまったり、黒ずんだりするので、注意が必要ですね。



補足:
なんだじゃあ全部ColorLookUpでやればいいんでは? って感じですが、ColorLookUpはカーブを扱うのに対して、Gradeの各パラメーターは数値なので、何かと分かりやすいですし、エクスプレッション等も組めるので、ボクは割りとGrade使っています。ただしOpenExrのscanlineでなくtileで収録されたデーターを扱うとGradeはなぜだか鈍くなります・・・

No comments:

Post a Comment