マスクして2入力を合わせる maskedmerge


3入力目をマスクにして、1入力目の映像と2入力目の映像をマスクに合わせて出力する。マスクをどの程度指定するかで1入力目と2入力目の割合を指定できる。バージョンは3.0 以降から使える。アルファチャンネルを追加する alphamerge と負荷は変わらない。

別ファイルの情報から元映像を透過させる alphamerge

マスクの各チャンネル(YUVA, RGBA など)の値から1,2入力に対応したチャンネルがブレンド、またはスルーされる。0 ならば1入力目を、255(8bit)ならば2入力目を反映させる。既定値は1, 2入力がブレンドされる。アルファチャンネルは 0 が完全透過になる。出力フォーマットは1入力と同じになる。マスクをフルレンジに対応させるには1入力がフルレンジ(yuvj420p, gray など)に対応しておかなければならない。途中フルレンジで出力がリミテッドレンジならば最後に format=yuv420p をつけてレンジを直す。

マスクの指定には別ファイルを使う方法と、フィルタを当てて各コンポーネントを調整する方法とがある。各コンポーネントを調整には lut が使いやすい。別ファイルを使う場合にはモノクロ映像を使うことでその部分にだけフィルタを当てるのが手軽になる。

Windows の ffmpeg で生放送する方法 : LUT(ルックアップテーブル)

基本コマンド

ffmpeg -f lavfi -i color,format=rgba,split=3[0][1][2];[0]lutrgb=255:255:255:255[0a];[1]lutrgb=0:0:0:0[1a];[2]lutrgb=255:200:150:100[2a];[0a][1a][2a]maskedmerge=0x0 output

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

オプション

オプションにはマスクに使うチャンネルが 0 から f までの16通り 2^4 つまり4チャンネルのオンオフが指定できる。オンオフで1入力をそのまま出力するのか、1入力と2入力をブレンドするのか指定できる。既定値は f で全てのチャンネルがブレンドされる。

効果を調べるのに使ったコマンド例
ffmpeg -f lavfi -i color,format=rgba,split=3[0][1][2];[0]lutrgb=255:255:255:255[0a];[1]lutrgb=0:0:0:0[1a];[2]lutrgb=255:200:150:100[2a];[0a][1a][2a]maskedmerge=0x0 -vframes 1 0.png

merge がマスクに該当するチャンネル番号、through が1入力がそのまま出力されるチャンネル番号、a以外は1入力で出力されるa以外のチャンネル番号。yuv420p なら yuva, rgb24 なら rgba の順番にチャンネル番号が振られる。

opt merge through a以外
0 1234 123
1 2 134 13
2 3 124 12
3 23 14 1
4 1 234 23
5 12 34 3
6 13 24 2
7 123 4
8 4 123 123
9 24 13 13
a 34 12 12
b 234 1 1
c 14 23 23
d 124 3 3
e 134 2 2
f 1234

コマンド例

以下は全て YUV 動画を元とし、効果がわかりやすいようにノイズフィルタをかけている。マスク部分の lutyuv の UV は、0:0 にすると Y に応じて UV にフィルタを当てる。255:255 にすると UV は2入力だけ反映させる。

暗いところだけノイズ

輝度60以下にノイズ、60より大きいのを255にしてマスクしている
ffplay -i input -vf split=3[0][1][2];[0]noise=alls=100:allf=t+u,format=yuvj420p[0a];[2]lutyuv=y="if(val\, if(gt(val\,65)\,255\)\,0)":u=255:v=255[2a];[0a][1][2a]maskedmerge,format=yuv420p

明るいところだけノイズ

輝度180以上にノイズ、180より小さいのを255にしてマスクしている
ffplay -i input -vf split=3[0][1][2];[0]noise=alls=100:allf=t+u,format=yuvj420p[0a];[2]lutyuv=y="if(val\, if(lt(val\,160)\,255\)\,0)":u=255:v=255[2a];[0a][1][2a]maskedmerge,format=yuv420p

公式ドキュメント:FFmpeg Filters Documentation : lut, lutrgb, lutyuv

その他の方法

以下方法が手軽に低負荷で出来るようになったが、今回の方法でもチャンネルを指定することで2つのフィルタを使いわけることができる。

明るいところ、暗いところにフィルタを当てる
各映像チャンネルを結合する mergeplanes
別ファイルの情報から元映像を透過させる alphamerge
ffmpeg でエッジマスク

追記
フルレンジマスクに書き換え、2種類フィルタを当てる方法はきれいに使い分けていなかったので削除した。2016年10月9日

コメントを残す

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