カラールックアップテーブル(CLUT)を適用して色調補正するlut1d、lut3dフィルタの使い方。lut1dフィルタが1次元でlut3dフィルタが3次元になる。

外部ファイルを参照して色調補正するフィルタにcurvesフィルタがある。
トーンカーブで RGB の調整が出来る curves

CUBE形式の書き方

1次元、3次元のCUBE形式の書き方の仕様PDF:Cube LUTSpecificationVersion 1.0

共通の書き方。

  • 文字と文字の間のセパレータは半角スペース(0x20)とタブ文字(0x09、\t)が使える。ブログでは半角スペースとする
  • 改行は0x0A(\n)とし、文字コードはUTF-8とする
  • TITLE “text”:CUBEファイルのタイトルの指定。無指定も可能で未定義になる
  • DOMAIN_MIN rl gl bl:RGB(赤緑青)の下限の指定。0から1までの浮動小数点が一般的だが、わかりやすく8ビットの0から255までの整数でもよい。省略すると0 0 0になる
  • DOMAIN_MAX rh gh bh:RGB(赤緑青)の上限の指定。0から1までの浮動小数点が一般的だが、わかりやすく8ビットの0から255までの整数でもよい。省略すると1 1 1になる
  • 各テーブルの最初のサンプル点は下界に対応する
  • 各テーブルの最後のサンプル点は上界に対応する
  • 中間値は中間サンプル点に比例して対応する
  • テーブルは可能なすべての入力値に対してサンプル点を含む必要はない
  • テーブルに含まれない入力値について等間隔を置いた近くのサンプル点間で補間する
  • 3つのテーブル、RGBは同じサイズのNを持つことと並列に並んでいることを除いて互いに独立している
  • 一部のアプリケーションではNが2の整数乗のときに最適な性能を示す
  • 一部のアプリケーションではN=256をサポートするのに十分なメモリがない

1次元LUTの書き方。

  • テーブルは赤、緑、青の3つの1次元テーブルからなり、各テーブルは入力チャネルと1つの出力チャネルがある
  • LUT_1D_SIZE N:N個のテーブル行と3×N個の列のデータとしNは2以上65536以下の整数とする
  • テーブルの値は線形補間で正しい出力値を生成するように設定しなければならない
  • テーブルのデータの行は最初のサンプルポイントから最後のサンプルポイントまで昇順とする

3次元LUTの書き方。

  • テーブルは3次元とし、3つの入力チャネルと3つの出力チャネルを持つ
  • LUT_3D_SIZE N:各次元のサンプルポイント数をN個とすると、Nの3乗個の列のデータとしNは2以上256以下の整数とする
  • テーブルの値は四面体補間で正しい出力値を生成するように設定しなければならない
  • ファイルはNの3乗行のデータテーブルを含み、それぞれがサンプルポイントに対応する
  • データテーブルの行は1列目のインデックス(赤)が最も急速に変化し、3列目のインデックス(青)が最も急速に変化しないようにインデックスを昇順にしなければならない

lut1d

1次元のCLUTを適用するlut1dフィルタ。手書きするなら3次元よりも書きやすい。

わかりやすいサンプル例。ただし色の変化はない。

TITLE "lut1d 8bit sample"
LUT_1D_SIZE 4
DOMAIN_MIN 0 0 0
DOMAIN_MAX 255 255 255
0 0 0
85 85 85
190 190 190
255 255 255

基本コマンド

input.cubeを読み込んで、線形補間を行う。
ffmpeg -i input -vf lut1d=input.cube:interp=linear,format=yuv420p -c:a copy output
ffplay -i input -vf lut1d=input.cube:linear

挙動を調べるグラデーション画像。
ffmpeg -f lavfi -i color,geq='r=255-ceil(255*X/W):g=255-ceil(255*X/W):b=255-ceil(255*X/W)' -vframes 1 gradation.png
ffmpeg -i gradation.png -vf lut1d=1d.cube:linear output.png

上のサンプルからRの85のところを90にすると線形補間ならGBが85のところでRが90になり、2倍のGBが170のところでRが180になる。

TITLE "lut1d 8bit linear sample"
LUT_1D_SIZE 4
DOMAIN_MIN 0 0 0
DOMAIN_MAX 255 255 255
0 0 0
90 85 85
190 190 190
255 255 255

ちなみにhaldclutsrclut1dフィルタを当てて、haldclutフィルタで合わせても同じ結果になる。
ffmpeg -f lavfi -i haldclutsrc=level=6 -vf lut1d=1d.cube:linear -vframes 1 haldclutsrc.png
ffmpeg -i gradation.png -i haldclutsrc.png -filter_complex [0][1]haldclut output2.png

CLUTから色を置換するhaldclut
ffmpeg で使える映像のテストソース

公式ドキュメント:FFmpeg Filters Documentation : lut1d

オプション

  • file[string]
    1次元のLUTファイルの指定。CUBEとCSPが読み込める
  • interp[int]
    補間方法の指定
    • 0, nearest
    • 1, linear。既定値
    • 2, cubic
    • 3, cosine
    • 4, spline

lut3d

3次元のCLUTを適用するlut3dフィルタ。こちらは検索するとたくさんサンプルが見つかる。

サンプル配布先例。

公式ドキュメント:FFmpeg Filters Documentation : lut3d

基本コマンド

input.cubeを読み込んで、四面体補間を行う。
ffmpeg -i input -vf lut3d=input.cube:interp=tetrahedral,format=yuv420p -c:a copy output
ffplay -i input -vf lut3d=input.cube:tetrahedral

オプション

  • file[string]
    3次元のLUTファイルの指定。CUBE、3DL(AfterEffects)、DAT(DaVinci)、M3D(Pandora)とCSP(cineSpace)が読み込める
  • interp[int]
    補間方法の指定
    • 0, nearest
    • 1, trilinear
    • 2, tetrahedral。既定値

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)