HoudiniでLUT(.cube)ファイルを作る

# はじめに
カラーグレーディングでLUT(Look Up Table)というものがあります。
インターネット上で配布・販売されているLUTにもいくつか種類がありますが、その中でも3DLUTと呼ばれ.cubeというファイルで共有されるものがあります。
今回はこの.cubeファイルをHoudiniで作成し、他ソフトでは作れないようなカラグレ用LUTを作っていきます。

※この記事は、「へー、こんなこともできるんだ」くらいの温度感で見ていただければと思います。
※**実用性は一切ありません。**

# 今回の目的
1. Houdiniをつかってカラグレ用LUTをつくる
2. .cubeファイルとしてLUTを書き出す   

# 事前知識
### LUTについて
ひとくちにLUTといってもいくつか種類があることはご存じではないでしょうか。
キャリブレーション用、色空間変換、モニター用、フィルムっぽくする、などなど。
ざっくり言うとこれらはテクニカルLUTとクリエイティブLUTに分けられ、上記で言えば最初の三つはテクニカル用、最後の一つはクリエイティブ用となります。

テクニカルLUTではモニターの色をそろえたり、logで撮影した素材をrec709で見たり、ACEScgをsRGBで見たりといった、正しく色を見るためのものです。
一方でクリエイティブLUTでは、フィルムっぽい雰囲気をだしたり、画像や映像のスタイルを決めるのに使ったりするものだと言えます。

そして、今回の記事ではクリエイティブLUTを作ることを想定しています。

### .cubeファイルについて
LUTのフォーマットも **.lut**と **.cube** の２種類あります。
.lut(.blut)は１次元のLUTであり、１つの値について変換することができます。
これを３つ組み合わせてRGBの３次元のLUTをつくることもできますが、これには少し制約があります。
その制約を改善したものが.cubeであり、.lutよりも柔軟に色を調整することができます。
詳しくは参考文献のページをどうぞ。

### HoudiniでLUTを作る意義
クリエイティブLUTを自分でつくる場合、ガンマやコントラスト、彩度や色調をパラメータやグラフで調整することがほとんどかと思います。
しかし、これだけだと出しにくい色が存在し、またアーティファクトがでてしまうことが珍しくありません。

そこでHoudiniを使い直接３次元的にLUTを調整することで、よりなめらかでアーティファクトのできにくいLUTをつくることができます。


#### LUTや色に関する参考文献
自分はコンポジターでもカラリストでもない門外漢なので上記の色やLUTに関する記述は大いに間違いを含む可能性があります。
コメントでの指摘修正大歓迎です。
https://www.studiobinder.com/blog/what-is-lut/
https://mononodes.com/creative-luts/
https://www.vegascreativesoftware.com/ca/video-editing/what-are-and-how-use-luts-in-color-grading/
https://lightillusion.com/what_are_luts.html
https://www.sidefx.com/docs/hdk/_h_d_k__i_o__l_u_t.html

# 作業
### .cubeファイルをのぞいてみる
自分で作る前に既存の.cubeファイルがどうなってるのか見てみます。
一先ずメモ帳などで開いてみるとこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/efebd86a-45f8-471f-2991-93b6f50cc6a4.png)
最初に設定用の変数があり、以下ＲＢＧの順で各点の情報が並んでいるだけです。
LUT_3D_SIZE 33とあることから各軸33頂点、33x33x33の全35937頂点の情報が入っているので、これをHoudini上で見てみようと思います。


こうなりました。
![viewLUT.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/619160e7-325e-b75f-ba71-46c8ecb1a2c8.gif)




下図のようにノードを組んでみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/444ff8d5-0631-1056-550b-57465bf8c286.png)


Pythonノードでパスを指定して外部ファイルを読み込み、各座標に点を生成。
その後＠ptnumから初期位置の座標を計算し、それで色づけ。


ここで、.cubeファイルそのまま読み込む方法がわからなかったので、.cubeファイルを.txtにして最初の設定の変数を消して頂点情報だけにして読み込みました。
Pyrhonで全部できたらよかったですが、今回一回限りなのでまあ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/8c24832d-c047-f628-7ae6-f5363849f619.png)


下の図のようにしてみるとLUTがやっていることがわかりやすいです。
![viewLUT2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/e9e58b5e-2bd1-5d89-a1ce-372c7763ab57.gif)


これを点の番号(＠ptnum)に気を付けつつ、まねて作ってみればうまくいくはず。

### LUTをつくる
まずは変形前の状態を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/0d89ff3b-1f71-221c-7d7c-8042b57afd02.png)
Boundノードで格子点を作成。
読み込んだLUTと同じくなるように＠ptnumをソート。
ソートの方法はもっと良い方法がありそうですが、今回だけなのでまあ。
ポイント番号がXYZの順になるようにしました。
(＠ptnumを下図のような順番にソート)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/1e3bb0af-1a58-717b-ec35-5094d5e85d36.png)

変形前の状態が作れたのでこれで遊んでいきます。
LatticeやSoftTransform、PointDeformあたりなどが良さそうです。
下図ではLatticeを使って赤とシアンを動かしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/baa525ee-16ce-24dc-5f1b-444ab864f656.png)

### Pythonで書き出す
オリジナルのLUTが完成したので、最後にPythonを使って.cubeファイルを書き出します。
今回はボタンを押して.cubeファイルを書き出せるようにしてみます。


はじめに中身NullだけのHDAを作成し、ボタンとファイルパスのパラメータを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/e9b13839-2f86-86a8-c86e-ffa003bebbf0.png)


次にHDAのTypePropertiesでパラメータの設定をします。
ボタン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/17bdd7cd-7bf9-6828-50b9-bb200fe018d2.png)
ファイルパス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/c4f2fdab-1350-e716-70de-5e303bb78f9f.png)

そしてScriptsタブのEvent HaandlerからPython Moduleを選択すると、空っぽだったScripts欄にPythonModuleが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/7e02a743-62fa-3f0a-2525-67ca46e58f66.png)

その後Pythonスクリプトを書きます
Pythonあまり知らないのでなんとなくでやってますが、動くのでOKとしてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/fb4641a4-37f4-814c-091b-92c47a765e1c.png)

これであとはHDAを保存して完了です。
試しに書き出してみるとこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/adc1eec4-e259-7229-2833-454c837d0de8.png)





# 結論と考察
### Fusionで読み込んでみる
無料で使えるFusionで読み込んでみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/4e7bc4ae-2a75-3f14-7e77-ca16c4762020.png)
座標軸の関係でHoudiniとは鏡映対称になってしまっていますが、同じ形になっていることは確認できました。
Houdini上で動かしたように赤がへこんでシアンが動かされています。

テスト画像に適用するとこうなりました。
Before
![Before.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/f8c6dad4-7668-52f8-ee4f-026a7e678fb3.jpeg)
After
![After.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/20f567e4-c280-28ff-e447-d4e2ad4a76cd.jpeg)

![viewLUT3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186607/131f86f5-b0ae-5d6c-da90-2ddba39a7643.gif)

赤とシアンのあたりで変化が出ていることが見えると思います。
今回はHoudiniであまり変形させなかったので色の変化も小さいですが、きちんと.cubeファイルを書き出せていることは確認できました！

### 課題
今回の方法の問題点としてHoudiniでLUTを調整しているときに、色の変化をリアルタイムで確認できないのが残念ポイントです。
どこをどういじるとどんな色になるかがわからない状態です。
Copernicsに直接持って行って、色の変化を確認しながらLUTの調整できたら結構面白いかもと思いました。

**まあ、こんな適当なLUTは仕事でも自主制作でも使うことはないですが。**

## 追記
現状Houdiniで.cubeファイルを読み込むことはできないようです。
Copernicsでそのうち対応してくれると嬉しいですね。
なんなら自分で実装できると楽しそうですね。