RGBA からそれぞれのRGBAにミックスして色を変えるフィルタcolorchannelmixerフィルタの使い方。RGB24で入力した場合の出力フォーマットはRGB24になる。タイムライン編集に対応。YUV のままに RGB の色味を強くしたり弱くしたりしたい場合はeqフィルタのgamma_r, gamma_g, gamma_bを調整する。

Windows の ffmpeg で生放送する方法 : eq(明暗調整)

基本コマンド

自らのRGBAだけ1にしているので色は変わらない。
ffmpeg -i input -vf colorchannelmixer=1:0:0:0:0:1:0:0:0:0:1:0:0:0:0:1 output

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

オプション

自らの値(rr, gg, bb, aa)だけ既定値は1でそれ以外は0
指定できる範囲は -2 から 2 までの double。

引数は r, g, b, a にそれぞれの r, g, b, a を掛けて 4×4 の 16 通りある。引数の順番は以下の通りで、頭文字のアルファベットが出力チャンネルになる。

rr, rg, rb, ra, gr, gg, gb, ga, br, bg, bb, ba, ar, ag, ab, aa

RGB の計算式は R を例にすると

red=red*rr + blue*rb + green*rg + alpha*ra

pl オプションが追加され、元の色の明るさをどれだけ保持するか設定できるようになった。指定できる範囲は 0 から 1 までの double。既定値は0。
avfilter/vf_colorchannelmixer: extend pl option functionality · FFmpeg/FFmpeg@2ee2e4c

pl オプションが廃止され、パラメータ指定に変更。3つのピクセル値を保持できるようになっている。
avfilter/vf_colorchannelmixer: add extended preserve color support · FFmpeg/FFmpeg@53f8a03

  • pc[int]
    保持する色の指定。RGB3つのピクセル値を参照する
    • 0, none:既定値
    • 1, lum:luminance
    • 2, max
    • 3, avg:average
    • 4, sum
    • 5, nrm:normalize
    • 6, pwr:power
  • pa[double]
    保持する色の割合。pcで指定するときはこちらも変更する
    既定値:0
    範囲:0から1まで

コマンド例

上の計算式だけでわかればそれだけなのだが、簡単な例を示すと、RGBA(100,100,100,0)に rr=0.5, rg=0.5, rb=0.5, ra=0 とすると R の値は 0.5(100+100+100)=150 で GB は 100、A は 0 のままである。

ffmpeg -f lavfi -i color=0x646464 -vf colorchannelmixer=.5:.5:.5 -vframes 1 output.png

RGBそれぞれを抽出する。
ffmpeg -f lavfi -i testsrc -vf colorchannelmixer=1:0:0:0:0:0:0:0:0:0:0:0 -vframes 1 R_only.png
ffmpeg -f lavfi -i testsrc -vf colorchannelmixer=0:0:0:0:0:1:0:0:0:0:0:0 -vframes 1 G_only.png
ffmpeg -f lavfi -i testsrc -vf colorchannelmixer=0:0:0:0:0:0:0:0:0:0:1:0 -vframes 1 B_only.png

lutrgbフィルタでもRGBを個別に出力できる。
ffmpeg -f lavfi -i testsrc -vf lutrgb=g=0:b=0 -vframes 1 R_only.png
ffmpeg -f lavfi -i testsrc -vf lutrgb=r=0:b=0 -vframes 1 G_only.png
ffmpeg -f lavfi -i testsrc -vf lutrgb=r=0:g=0 -vframes 1 B_only.png

RGBからグレースケールに変換する(BT.601)。
ffmpeg -f lavfi -i testsrc -vf colorchannelmixer=.299:.587:.114:0:.299:.587:.114:0:.299:.587:.114:0 -vframes 1 gray-601.png
ffplay -f lavfi -i testsrc -vf colorchannelmixer=.299:.587:.114:0:.299:.587:.114:0:.299:.587:.114:0

アルファチャンネルにグレー出力。
ffmpeg -f lavfi -i testsrc -vf format=bgra,colorchannelmixer=1:0:0:0:0:1:0:0:0:0:1:0:.3:.59:.11:0 -vframes 1 gray.png
ffplay -f lavfi -i testsrc -vf format=bgra,colorchannelmixer=1:0:0:0:0:1:0:0:0:0:1:0:.3:.59:.11:0

アルファチャンネルはalphaextractフィルタで確認できる。
ffmpeg -f lavfi -i testsrc -vf format=bgra,colorchannelmixer=1:0:0:0:0:1:0:0:0:0:1:0:.3:.59:.11:0,alphaextract -vframes 1 gray-alphaextract.png
ffplay -f lavfi -i testsrc -vf format=bgra,colorchannelmixer=1:0:0:0:0:1:0:0:0:0:1:0:.3:.59:.11:0,alphaextract

RGBからグレースケールに変換する(BT.709)。
ffmpeg -f lavfi -i testsrc -vf colorchannelmixer=.2126:.7152:.0722:0:.2126:.7152:.0722:0:.2126:.7152:.0722:0 -vframes 1 gray-709.png
ffplay -f lavfi -i testsrc -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

ffmpeg でグレースケールを扱う

セピア調で出力。
ffmpeg -f lavfi -i testsrc -vf colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131:0 -vframes 1 sepia.png
ffplay -f lavfi -i testsrc -vf colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131:0

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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