ffmpeg 3.2 にリリースしたビデオフィルタ。ffmpeg のフィルタの中でかなり処理が重たい部類に入るエッジ保護のデノイザnlmeans
フィルタの使い方。なぜこれほどまでに重たいかというとデノイズする部分を映像内容によって異なる処理をするために重たくなるから。詳しい処理内容は「non-local means filter」で検索する。
処理内容の紹介記事
Non-local Means Filterによるデノイジング | OpenCV.jp
Non-local Means Filterの実装 – Qiita
該当ソースコード:FFmpeg/vf_nlmeans.c at master · FFmpeg/FFmpeg
公式ドキュメント:FFmpeg Filters Documentation : nlmeans
2019年2月2日処理が見直され 1080p で 30% ほど高速化された。
lavfi/nlmeans: improve the performance:git.videolan.org Git – ffmpeg.git/commitdiff
基本コマンド
ffplay でスムーズに再生するにはハイスペックの CPU が必要。
ffmpeg -i input -vf nlmeans=s=1:p=7:pc=0:r=15:rc=0 output
ffmpeg -i input -vf nlmeans=1:7:0:15:0 output
オプション
- s[double]
デノイズ強度の指定。大きい値ほど強くデノイズする
既定値:1
範囲:1 から 30 まで - p[int]
輝度(Y)のパッチサイズの指定。rよりも小さい値を指定する
大きな値ほど輝度のデノイズ効果は小さくなりサイズが増える。さらに輝度だけではなく彩度もデノイズ効果が小さくなる。0, 1 は無効、3以上から有効。奇数を指定する。偶数は1加算される
既定値:7
範囲:0 から 99 まで - pc[int]
彩度(UV)のパッチサイズの指定。0 は自動設定。1 は無効、3以上から有効。奇数を指定する。偶数は1加算される
既定値:0
範囲:0 から 99 まで - r[int]
輝度(Y)の探索サイズの指定。大きい値ほど負荷が重たくなる
0, 1 は無効、3以上から有効。奇数を指定する。偶数は1加算される
既定値:15
範囲:0 から 99 まで - rc[int]
彩度(UV)の探索サイズの指定。大きい値ほど負荷が重たくなる。0 は自動設定。1 は無効、3以上から有効。奇数を指定する。偶数は1加算される
既定値:0
範囲:0 から 99 まで
配信用の設定
ニコ生で使う場合の設定は重すぎると処理が追いつかないので負荷を軽くする。
ffmpeg -i input -vf nlmeans=1:3:0:7:0 output
エッジ保護をする場合は他にもエッジマスクしてから普通のデノイザを使うこともできる。
ffmpeg でエッジマスク
出力比較
個別に PNG で出力したサイズは上から 249KB、237KB、218KBcrop=256:192:60:0,super2xsai
nlmeans_opencl
opencl を使ってnlmeans_opencl
フィルタを使う。
opencl が使えれば以下のコマンドを実行すると対応 CPU、または GPU が表示される。
ffmpeg -hide_banner -v verbose -init_hw_device opencl
ポイントは opencl を使うデバイスを上の例では 0.0 から 1.1 から指定する。能力によって処理速度が大きく異なる。オプション指定は通常と同じ。
コマンド例。
ffmpeg -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwupload,nlmeans_opencl output
通常のフィルタに切り替えるにはhwdownload,format=yuv420p
フィルタを挟む。
ffmpeg -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwupload,nlmeans_opencl,hwdownload,format=yuv420p,lutyuv=val:128:128 output
これはどうも静止画向きのフィルタのようですね。
少し試してみましたが waifu2x で除けられない類のノイズ(少しYやCがずれてるのが斑状に広がっているようなの)が潰せるのがいいです。
>p[int]
>輝度(Y)のパッチサイズの指定。r よりも小さい値を指定する
r よりも小さい値を指定する、は必須ですか?
ドキュメントのnote部分を読むと、rはパッチの中心エリアを決めるものなので必須ではないと思いますが、どうなんでしょう?
dirk farin氏やhandbrakeは大きい値が使われているようです。
必須ではないですが、値を大きくするほど ssim を見る限り元映像に近づく(デノイズがあまり効かずファイルサイズが大きくなる)ようです。p, r の値の大小関係が逆転する前後で大きく変化上がるものでもありませんでした。ということで記事を修正しました。