ffmpeg のフィルタで容量を減らすと言えばたいていの場合デノイズしてのっぺりさせてきたが、今回はデノイズではなくてYチャンネル(輝度)の階調を間引いて容量を減らしてみた。この方法のデメリットはのっぺりしたりぼやけたりはしないが階調が単純化されるのでグラデーションがきれいではなくなる(バンディングがのる)のと、処理が遅いのでリアルタイムエンコード(配信)向きである。

任意で階調を調整できるのでバンディングが目立つところを間引かずに他の所を間引くことで目立たないところで容量を減らすことができる。階調の調整は映像の内容によって変えた方がきれいに見える。

追記 2015年11月6日 0時21分
可逆圧縮(utvideo)の時は確かに容量は減るのだが、不可逆圧縮(libx264)のときはかえって容量は増えて SSIM も悪くなる傾向にあるのでもう少し調べてみる。

追記 2015年11月11日
paletteuse ではなくて lutyuv でも間引くことができるがわずかな効果しかない。Yチャンネルは修正しない方が無難かもしれない。

追記 2017年3月31日
見た目の変化がわかりにくい青色、YUV の U をデノイズした方がよい結果になるかも。使うフィルタは removegrain を使う。

奇数の値を+1繰り上げる。繰り下げる場合は-1。偶数はそのまま。
lutyuv=y="if(mod(val\,2)\,val\,val+1)":u="if(mod(val\,2)\,val\,val+1)":v="if(mod(val\,2)\,val\,val+1)"

その他に removegrain でそれぞれのチャンネルに個別にデノイズ処理する方法もある。

Windows の ffmpeg で生放送する方法 :: グレイン除去

追記ここまで

基本コマンド

zscale が使える場合は spline16 を使い unsharp は輝度だけ調整する
ffmpeg -i video -i img.png -filter_complex [0:0]scale=iw/2:-1,format=yuv420p,extractplanes=y+u+v[y0][u][v];[y0]unsharp=3:3:0.5[y1];[y1][1:0]paletteuse=dither=none:bayer_scale=5,format=yuv420p[y2];[y2][u][v]mergeplanes=0x001020:yuv420p out

1/2リサイズ限定。上よりかなり処理が遅くなるが上の zscale よりほんの少し容量が減る。unsharp は輝度だけ調整する
ffmpeg -i video -i img.png -filter_complex [0:0]extractplanes=y+u+v[y0][u][v];[y0]zscale=iw/2:-1:f=spline16,unsharp=3:3:0.5[y1];[y1][1:0]paletteuse=dither=none:bayer_scale=5,format=yuv420p[y2];[y2][u][v]mergeplanes=0x001020:yuv444p,format=yuv420p out

フィルタ内容

  1. extractplanes で Yチャンネルを取り出す
  2. パレット画像に paletteuse を適応して Yチャンネルで使う色を間引く
  3. 間引いた Yチャンネルを mergeplanes で合わせる

パレット画像

普段使っている画像編集ツールでもよいが、ドット単位の編集には PictBear がおすすめ。画像は 16×16 の 256色使うことができ、基本となる画像の色は 0 から 255 までのグレースケールと透過の 256パターンである。適宜間引く場合は黒で塗りつぶす。右クリックから保存する。

何も間引いていないパレット画像(これを基本とする)

均等に半分間引いたパレット画像

暗い部分を中心に間引いたパレット画像

間引く色を調べる

Yチャンネルはグレースケールなのでそのまま出力することで、グラデーションを残したい部分を修正できる。色を調べるのに SpotColor を使っている。

1枚画像の場合
ffmpeg -i input -vf extractplanes=y -an -vframes 1 output.png

動画出力の場合(適宜開始と終了時間を指定する)
ffmpeg -ss 0 -i input -t 10 -vf extractplanes=y -an -vcodec utvideo output.mkv

関連記事

コメントを残す

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

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