フィルタでグレースケールを扱うには大まかに YUV の Y(輝度) を取り出す方法(フォーマットは YUV)と、グレーにフォーマット変換(フォーマットは GRAY)する方法の2通りがある。一般的に前者はリミテッドレンジになるので 16 から 235 の範囲に収まるが処理速度は速い。フルレンジの Y を取り出すにはformat=yuvj420p
でフォーマット変換を行う。一方の後者はフォーマット変換を挟むので処理は遅いが 0 から 255 までのフルレンジを扱える。
extractplanes
YUV の Y を取り出す(format=yuv)。
-vf extractplanes=y
hue
(format=yuv) で彩度を 0 にする方法。
-vf hue=s=0
YUV の Y だけそのままに UV を 128 に変換するlutyuv
(format=yuv)。
-vf lutyuv=val:128:128
グレーにフォーマット変換する。
-vf format=gray
グレースケール(format=gray)値を確認する。
-vf datascope
グレースケール(format=gray)で動画出力するにはエンコーダにffv1
を使う。
ffmpeg -i input -vf format=gray -vcodec ffv1 output.mkv
RGB からグレースケールに変換する(BT.601)。
-vf colorchannelmixer=.299:.587:.114:0:.299:.587:.114:0:.299:.587:.114:0
RGB からグレースケールに変換する(BT.709)。
-vf colorchannelmixer=.2126:.7152:.0722:0:.2126:.7152:.0722:0:.2126:.7152:.0722:0
YUV の映像に RGB から係数(BT.709)を掛けたグレースケールのマスクをつける。
-vf format=yuva420p,split[1],format=rgba,colorchannelmixer=1:0:0:0:0:1:0:0:0:0:1:0:.2126:.7152:.0722:0,[1]lut2=x:x:x:y
関連記事
- 色相を動的に変更できる hue
- LUTを手軽に入れ替えられるlut2、tlut2、swapuv
- 各映像チャンネルを分離する extractplanes
- Windows の ffmpeg で生放送する方法 : lutyuv
- 個別チャンネルの値を映像の場所毎に確認できる datascope
- RGBA の各値を別のチャンネルに混ぜ合わせる colorchannelmixer の使い方
実装についてはこちらも参照
グレースケール画像のうんちく – Qiita