明暗の度合いでもマスクできるのでこれを応用して一つの映像に複数のフィルタを使い分ける方法。特定色ならcolorkeyフィルタを使ってマスクすることもできる。一般的には映像をシャープにするほど容量は大きく、ぼかすほど容量は小さくなるので、シャープとぼかしを使い分けて高画質配信を目指す。

colorkey の使い方:ffmpeg でクロマキー合成

なぜぼかしも併用するかと言えばビットレートの節約になるのも正しいが、ニコ生のようなビットレート制限が厳しいところでは、低解像度で暗くて見えにくい部分にビットレートをたくさん割り当てる必要はないからである。

明るい部分にフィルタを当てる

輝度160 以上にフィルタを当てる。効果がわかりやすいようにlutyuvフィルタで白くしている。原理は 160 から 255 までを 1 にするが、ifで 0, 1 を反転して *255 している。結果として 160 から 255 までは 0、159 以下は 255 になり [1] のフィルタが当たらない。暗い部分にフィルタを当てる場合は [0] の最後に追加する。
ffplay -i input -vf split[0][1];[0]format=yuva420p,shuffleplanes=0:1:2:0,lutyuv=val:val:val:if(between(val\,160\,255)\,0\,1)*255[0a];[1]lutyuv=255:128:128[1a];[1a][0a]overlay

暗い部分にフィルタを当てる

輝度65 以下にフィルタを当てる。効果がわかりやすいようにlutyuvフィルタで白くしている。原理は 66 から 255 までマスクして [1] のフィルタが当たらない。明るい部分にフィルタを当てる場合は [0] の最後に追加する。
ffplay -i input -vf split[0][1];[0]format=yuva420p,shuffleplanes=0:1:2:0,lutyuv=val:val:val:between(val\,66\,255)*255[0a];[1]lutyuv=255:128:128[1a];[1a][0a]overlay

フィルタの聞き具合を調べるグレースケール画像サンプル

「grayscale」で画像検索すればたくさん画像が見つかる。

条件に使える書式:ffmpeg で使える評価式
公式ドキュメント:FFmpeg Utilities Documentation :: Expression Evaluation

関連フィルタ

追記
わかりやすいように書き直した。2016年10月9日
shuffleplanesを使う方法に書き換えた。2016年10月15日
2020年5月14日のメンテナンスからエスケープの\が除去されてたのをつけ直した。2023年1月6日

2 thoughts on “明るいところ、暗いところにフィルタを当てる

  • 匿名

    動画の全てのフレームで明るい輝度値が200以上の255以下場合に、その輝度値を200にするコマンドが知りたいです。
    私は以下のようにやってみましたが、上手くいきませんでした。
    コマンド
    ffplay -i input.mp4 -vf lutyuv=”if(between(val,200,255),200,val):val:val”
    結果
    No such filter: ‘200’

    • admin

      https://nico-lab.net/about-ffmpeg/
      ここの記事の冒頭にも書いてましたが、エスケープの\が消えていたのでつけ直しました。
      ffplay -i input.mp4 -vf lutyuv=”if(between(val\,200\,255)\,200\,val):val:val”
      こちらでいけると思います。

コメントを残す

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

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