前フレームのY差分をマスクしてフィルタを当てなくするモーションマスクの使い方。使うフィルタはtblend
フィルタで前後フレームを1入力で取り込み、maskedmerge
フィルタで1、2入力の割合を決めている。
連続フレームの差分をブレンドする tblend
マスクして2入力を合わせる maskedmerge
Y チャンネルをマスクする
前フレームと一定のY差分がある場所にYは[0v]のフィルタが当たり、なければ[1v]のフィルタが当たる。UVは[1v]のフィルタが当たる。[1v]は元映像を入力しているので適宜フィルタチェーンを変更する。
ffplay -i input -vf split=3[0v][1v][2v];[2v]tblend=c0_mode=grainextract,lutyuv='255*between(val\,119\,137)':255:255[2v];[0v]lutyuv=235:128:128[0v];[0v][1v][2v]maskedmerge=7
前フレームと一定のY差分がある場所以外にYは[0v]のフィルタが当たり、なければ[1v]のフィルタが当たる。UVは[1v]のフィルタが当たる。[1v]は元映像を入力しているので適宜フィルタチェーンを変更する。
ffplay -i input -vf split=3[0v][1v][2v];[2v]tblend=c0_mode=grainextract,lutyuv='255*if(between(val\,119\,137)\,0\,1)':255:255[2v];[0v]lutyuv=235:128:128[0v];[0v][1v][2v]maskedmerge=7
tblend フィルタの解説
前フレームと差が無ければ128を返し、プラスに差があれば128からプラスに、マイナスに差があれば128からマイナスを加算する。YUVのUVが 128 のときにYの値のグレースケールになり、今回マスクの値で 1,2入力の割合を決めるmaskedmerge
フィルタを使って使い分けている。
Yチャンネルは119から137までを255でマスクし、UVチャンネルは 124 から132までを255でマスクしている。
ffplay -i input -vf tblend=all_mode=grainextract,lutyuv='255*between(val\,119\,137):255*between(val\,124\,132):255*between(val\,124\,123)'
betweenやclipの使い方。
ffmpeg で使える評価式