Nature | Photography | Music | Art -8ページ目

Nature | Photography | Music | Art

日々好奇心の趣くまま

サイト内の写真の使用ならびに無断転用を禁じます。

前回の続き。

LUTを弄ってみるといろいろな可能性がありそうなのはわかるのだが、LUTファイルそのものを眺めていてもただの数字の羅列なので、人間が眺めても適用後に何が起こるのか直感的に把握できない。
そこで(意味があるのかどうか分からないが)CUBE LUTファイルの内容を可視化できるプログラムを作ってみた。

https://github.com/delphinus1024/plot_cube

使い方はリンク先参照。

要は与えられた画像のRGB空間を表す立方体がLUTによってどう歪められるのかを三次元俯瞰で見ることができる。
そうすることで奥深い(と言われる)LUTを定性的に把握できるかもしれない。

手始めに、これを使って前回生成したLUTをいくつか読み込んでプロットしてみる。
外の黒箱が元のRGB立方体で、色の付いたものがLUT適用後のもの。

コントラスト強調



モノクロ



実の所、このあたりはLUTを持ち出さなくてもトーンカーブ類で対処できるものなのでだいたい想像どおり。
より実用的なWebで入手できる既成のLUTを見てみる。

最近流行りらしいTeal&Orange系。Rが増えるとGも増えてオレンジ系に振れるしくみ。あとBがかなり抑え気味。



Day -> Night変換系。RとGが半分ほど暗くなる上にオレンジ側に圧縮される。



あとおまけで某映画をエミュレートしたルック系2つ

 



いずれもかなり非線形な変換が施され、ここまでくるとLUTの本領が発揮されてくる。
このあたりを踏まえて、どうやってLUTを弄って遊ぶか。
もうすこし研究の時間が必要なようです。
 

前回の続きで、この本の内容にインスパイアされたもの。
 

DaVinci Resolve カラーグレーディングBOOK

 

この本の内容で最も可能性を感じたものの一つがLUT(Look Up Table)を用いたポストプロダクション。
そもそもLUTはLogやRAWで撮影されたノッペリした映像を人間の眼の特性に合うように戻すのに使われるのだが、更にそれを超えてよりアグレッシブに色目を弄るのにも使うことができる。
さらにはLUTそのものを販売するビジネスまで成り立っているほど奥が深いものらしい。

"Look Up Table"という言葉は語られる分野によって別の意味を持つが、ここで取り上げている写真・映像界隈での定義に関しては以下が詳しい。
(元々は富士フィルムのサイトにあったものだが、部門がM&AによってWOWOWに移行したみたい。)
 

https://is.wowowent.co.jp/technology/lutindex.php

 

ついでに今回は関係ないが、同じサイトにあるLOGの解説も必見。
 

https://is.wowowent.co.jp/technology/logindex.php

 

要はここでいうLUTというのはあるRGB空間から別のRGB空間への非線形写像と考えればすっきりする。

LUTの設定値はファイルとして提供され、ソフト間の互換性を持たせるためにそのフォーマットの規格がいくつか決まっている。
その中でも最もよく使われているのがCUBEといわれるフォーマットで、その仕様は以下でDLできる。
 

http://wwwimages.adobe.com/www.adobe.com/content/dam/acom/en/products/speedgrade/cc/pdfs/cube-lut-specification-1.0.pdf

 

ただし、手持ちの画像・映像ソフトで試した限りは仕様すべてをサポートしているわけではないようで、Webで拾えるCUBEファイルを一通り見たところ以下のようなフォーマットが一般的だった。例としてPanasonic謹製のVlog->V709のcubeより。
 

 


# Vlog_to_V709_forV35_ver100.cube by panasonic

LUT_3D_SIZE 33

0.015625 0.015625 0.015625
0.028320 0.011719 0.013184
0.040771 0.008057 0.010742
0.054688 0.003906 0.008301
0.072021 0.000000 0.004883
.
. (33 * 33 * 33 = 35937個のテーブル)
.
.
0.996825 1.000000 1.000000
0.998535 1.000000 1.000000
1.000000 1.000000 1.000000


 

簡単に解説すると。

#はコメント

デフォルトではRGBのレンジは0.0~1.0となる。モノによっては以下のようにレンジを指定しているLUTもある。

LUT_3D_INPUT_RANGE 0.092 1.0196

LUT_3D_SIZEはRGB各テーブルの分割数。要は上の場合だと0.0~1.0を(33-1)等分割してそこ場所の対応値を格納してあり、そこにピッタリ嵌らないRGB値は近隣の対応値から補間することになる。
LUT_3D_SIZEの値は33とか65とか二進数で切れのよい数字+1となっている場合が多い。例えば領域を4分割するとその端点の数は5になるのと同じ理屈だと思われる。

上の例では割愛されているが、

TITLE   HOGE

のようにLUTに名前(?)をつけてあるものもある。

CUBE形式は大きく1D LUTと3D LUTに分かれるが、上は3D LUTの例。
3D LUTの方が自由度が2次元も増えるため処理が重くなるが、色を弄れる可能性が大幅に広がる。
世の中に出回っているものも3D LUTのものが多く、今回ネタにするのも3D LUTについて。

LUTををいろいろハッキングするべく、CUBEファイルをいろいろな条件で生成できるスニペットを作ってみた。
Calc関数内部を弄ればもっと複雑なLUTも作れるはず。
Python3.4以上とNumpyが必要。
 

 


import random
import enum
import numpy as np

class LutMode(enum.Enum):
    ModeNoChange    = 1
    ModeGamma       = 2
    ModeContrast    = 3
    ModePlaneSwap0  = 4
    ModePlaneSwap1  = 5
    ModePlaneSwap2  = 6
    ModeBW          = 7
    ModeRandom      = 8

sMode           = LutMode.ModeGamma
sTitle          = "\"Generated by make_cube\""
sLut_3d_size    = 33
sVal_max        = 1.0
sVal_min        = 0.0
sGammaFactor    = 2.2
sContrastFactor = 2.0
sContrastPoint  = 0.5
sDiv            = float(sVal_max - sVal_min) / float(sLut_3d_size - 1)

def gamma(index):
    ret = (sDiv * float(index)) ** (1.0 / sGammaFactor)
    return ret
    
def contrast(x,factor,point):    
    if x < point:
        y = point*(x/point) ** factor
    else:
        y = 1. - ((1.-point)*((1.-x)/(1.-point)) ** factor)
    return y

def calc(r,g,b,r_index,g_index,b_index,mode):
    if mode == LutMode.ModeGamma:
        r_new   = r * gamma(r_index)
        g_new   = g * gamma(g_index)
        b_new   = b * gamma(b_index)
    elif mode == LutMode.ModeContrast:
        r_new   = contrast(r,sContrastFactor,sContrastPoint)
        g_new   = contrast(g,sContrastFactor,sContrastPoint)
        b_new   = contrast(b,sContrastFactor,sContrastPoint)
    elif mode == LutMode.ModePlaneSwap0:
        r_new   = g
        g_new   = b
        b_new   = r
    elif mode == LutMode.ModePlaneSwap1:
        r_new   = b
        g_new   = r
        b_new   = g
    elif mode == LutMode.ModePlaneSwap2:
        r_new   = r
        g_new   = b
        b_new   = g
    elif mode == LutMode.ModeBW:
        v = (r+g+b)/3
        r_new   = v
        g_new   = v
        b_new   = v
    elif mode == LutMode.ModeRandom:
        r_new   = random.random()
        g_new   = random.random()
        b_new   = random.random()
    else: # no change
        r_new   = r
        g_new   = g
        b_new   = b
    
    return r_new,g_new,b_new

if __name__ == "__main__":
    print("TITLE ",sTitle)
    print("LUT_3D_SIZE ",sLut_3d_size)
    print("")

    r = 0.0
    g = 0.0
    b = 0.0
    
    for b_index in range(sLut_3d_size):
        g = 0.0
        for g_index in range(sLut_3d_size):
            r = 0.0
            for r_index in range(sLut_3d_size):
                r_new,g_new,b_new = calc(r,g,b,r_index,g_index,b_index,sMode)
                print("{: .6f} {: .6f} {: .6f}".format(r_new,g_new,b_new))
                r += sDiv
            g += sDiv
        b += sDiv


 

sModeの値を変えると様々な条件のLUT CUBEが生成されるので、それをPhotoShopのLUTテーブルに適用してみる。

元の画像。


Gamma補正。



コントラスト補正。

 



モノクロ。



RGBプレーン入れ替え。 



テーブルの値については0~1の間に収まっていればとりわけ制限はないみたい。
試しに0~1ランダムで生成したLUTでもエラーは出なかった。
こんなサイケな意味の無い絵になるが。



ここで取り上げたのはごく単純なサンプルにすぎず、もっと細部にこだわった調整をすればXXXの映画のYYYな質感のような高度なマニピュレーションも可能になってくる(はず)。

LUT、面白そうなので時間を見つけてもう少し掘り下げてみたいところです。
 

昨年、動画用メインカメラとして購入したPanasonic GH5。
10bit 4:2:2でLog撮影という一昔前から考えると夢のようなスペックで撮影できる。


それに従って使う側の脳味噌もアップグレードしなければ…ということで、改めて下のような本を購入して「カラーグレーディング」のお勉強をユルユルとやりはじめる。
 

 

DaVinci Resolve カラーグレーディングBOOK

 

その中でも、今まで分かったようなフリをしつつあまり活用できていなかったのが動画用の各種モニター群、「波形モニター」や「パレード」やら「ベクタースコープ」などがこの本の中でも当たり前のように使われている。

今までは静止画の延長で主にヒストグラムで調整していた人なのだが、このあたりも活用できるようにできなければと思い理解を試みる。
職業でやっておられる方々にとっては当たり前の内容なのだろうけど。

前者2つは輝度と空間の情報を二次元に展開しただけなのでまあまあ容易に理解できるのだが、「ベクタースコープ」はこれらに比べると少々複雑な上にいろいろ情報が詰め込まれていて本の説明だけでは細かいところをイマイチ理解できなかった。

更に理解を進めるべくググったところ、理論的なところを最もわかりやすく説明してくれていたのが古い記事だがこれ
 

この中で定量的な説明はほぼされているので繰り返さないが、これらのモニターは古いアナログテレビ時代の規格とその測定器のI/Fを踏襲しつつ今まで使われ続けているもので、よりきちんと理解しようと思うと大昔のカラーテレビ教科書あたりを読まなければならないようだ。

ということで、勉強と今後の研究用途に自前でベクタースコープ描画プログラムを自作してみた。
ただし、かなり大雑把かつ主要部分のみ。
インプリする言語は迷ったのだが、計算後の統計処理などが容易に追加できるよう(速度面は目をつぶって)Pythonを採用。
バックグラウンドの目盛とかは画像貼り付けでもよかったのだが、勉強のため自前計算をしており処理時間が少々長くなっている。

とりあえずはgithubに公開しました。
 

https://github.com/delphinus1024/vector_scope
 

使い方は引数にjpg,bmp,pngなど画像ファイルを与えるだけ。

こんな感じで表示される。
 

野暮用のついでに時間があったので随分久しぶりに日光方面へ。


到着後、Google Mapを眺めながらどこを攻めるかを考える。
いつもはいろは坂より上に行くことが多いので、今回はあえて表日光側にターゲットを絞る。

その中からこれまで行ってないマイナーな滝を選んでみる。
いずれもそこに至る登山道は存在しない。

まずは第一ラウンド。出発点は有名な裏見の滝。
折角なのでちょっとばかり立ち寄ってみる。



日光らしい至極壮麗な滝だが、遊歩道整備が行き届いていて観光客が次々とやってきて落ち着かないので早々に退散する。

今回最初の散策はこの裏見の滝の上流となる。
上流にはいくつかの魅力的な滝があるらしいのだが、断崖に挟まれているため総じてアプローチの難易度が高いらしくWebでの情報も限られており、現地でルートファインディングする必要がある。

さしあたって裏側を通っている林道のゲートを潜ってアプローチを試みる。
GPSで目星をつけて林道から逸れてみると薄い踏み跡があるので辿ってみる。
次第に傾斜が激しくなってきて、滑ったら終わり的な場所まで来た。
樹木が邪魔で写真だとほとんど見えないが、空撮アングルの裏見の滝。 普段こんな角度で見ることはできない。



滝上まではまだ距離も高度差もあって、単独だったのとロープなどは持参していなかったこともあり、これ以上は危険と判断してここで引き返す。
もう少し時間をかければよりよいルートが見つかったのかもしれない。

再度林道に戻って上流に辿っていく。

その後しばらくは渓流にアクセスできそうな場所はなさそうで、随分上流の観音滝のあたりで踏み跡を発見したので突っ込んでみる。
辿ってみるとさほど苦労なく観音滝の落ち口まで来ることができた。


慎重に降りれば滝壷へも行けそうだったが、沢靴も忘れたので今回逃した滝を含めて次回の楽しみに置いておこう。

さて、気を取り直して第二ラウンドはその二つ隣にある根通沢上流にある相生滝。
雄雌二つの滝が並んでいる美しい滝。登山道はないものの、地形を見る限り第一ラウンドより格段に安全そう。

まずはゲートを潜って林道をひた歩くが、平凡でつまらないし周囲の山は工事で削り取られて陰惨だし、あまり人が来ない理由が分かった。

第三堰堤で林道が沢から離れていくので、ここから沢沿いに踏み跡を辿るが、すぐに踏み跡がなくなり適当に沢を渡渉しながら登っていく。
水深は浅いところを選んでいけば脛くらいまでが浸かる程度。 沢靴がないのでクロックスで強行突破する。



踏み跡に突っ込んでから20分ほどであっけなく到着。雌滝。



そしてその奥に雄滝。美しい。

 



周囲の苔が水を蓄えてまた綺麗。



今回コンデジだけ持って突っ込んだが、きちんと一眼で撮影し直したいところ。
 

以前から心底撮ってみたいと思ってる被写体・桜島。
もちろん普通にではなく、夜間の噴火の時に火山雷を伴って…というやつ。
とはいいつつ、近くに住むか少なくとも長期滞在しない限りは難しいだろうとほぼ諦めモードでもあるのだが…

折角鹿児島まで行ったので、今回もダメモトで挑戦してみたがやはり空振り。
とりあえず機会を無駄にしないように、次回に備えて撮影場所のロケハンをしておいた。

現在活動している火口は2つ、南岳火口と昭和火口で、昨今噴火が撮影できるのは昭和火口の方。
これらの火口は鹿児島市側からは見えずに東側からしか見られない。
島の東側には一応道路は通っているのだが、停められる場所が少ない上に植生が邪魔をするために「私有地に入らず、いい角度で、落ち着いて」火口が見られる場所は非常に限られている。

道端で撮影するのは落ち着かないし、夜間だとヘッドライトの邪魔が入る。
探索してみると、ちょっと奥まった場所で落ち着いて撮影できそうな場所を見つけた。

上述の通り夜間は惨敗だったので、夕暮れの桜島の火口を180mm~400mm程度で撮影したものを何枚か。
あまりにもダイナミックレンジが大きいのでHDR処理。

 

 



手前が昭和火口で奥が南岳火口の二重構造になっていて、クローズアップした火口周りの地形や模様の美しいこと。
おそらく存命中にこの山に登れる機会はないだろうが、このリムでテントを張って一泊したらどんな景色が見られるのだろうか。夢想してしまう。