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

crop して nlmeans し super2xsai で2倍に拡大

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

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

3 thoughts on “非局所平均のデノイザ nlmeans

  • 通りすがり

    これはどうも静止画向きのフィルタのようですね。
    少し試してみましたが waifu2x で除けられない類のノイズ(少しYやCがずれてるのが斑状に広がっているようなの)が潰せるのがいいです。

  • 匿名

    >p[int]
    >輝度(Y)のパッチサイズの指定。r よりも小さい値を指定する
    r よりも小さい値を指定する、は必須ですか?
    ドキュメントのnote部分を読むと、rはパッチの中心エリアを決めるものなので必須ではないと思いますが、どうなんでしょう?
    dirk farin氏やhandbrakeは大きい値が使われているようです。

    • admin

      必須ではないですが、値を大きくするほど ssim を見る限り元映像に近づく(デノイズがあまり効かずファイルサイズが大きくなる)ようです。p, r の値の大小関係が逆転する前後で大きく変化上がるものでもありませんでした。ということで記事を修正しました。

コメントを残す

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

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