3 x 3、5 x 5または7 x 7(ffmpeg 4.0 以降)のカーネルが指定できるconvolution(畳み込み)フィルタの使い方。数学的な話はここでは説明しない。

基本コマンド

3 x 3のカーネル。基本コマンドは何も変化しない。
ffplay -i input -vf convolution="0 0 0 0 1 0 0 0 0:0 0 0 0 1 0 0 0 0:0 0 0 0 1 0 0 0 0:0 0 0 0 1 0 0 0 0:1:1:1:1:0:0:0:0"

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

関連記事

オプション

:で区切ってチャンネル毎に指定する。カーネルが大きくなるほど負荷が高くなる。カーネルが3 x 3、5 x 5または7 x 7(ffmpeg 4.0 以降)で指定値の数が9、25または49と変わる。

  • 0m, 1m, 2m, 3m
    最初の指定値。チャンネル毎にカーネルを指定する。3 x 3なら9。5 x 5なら25の値を指定する。基本的にはYUV 映像ならYUVAの順番。RGB映像ならGBRPにフォーマット変換してGBRAの順番になる。アルファチャンネルの設定はチャンネルがなければ不要
    3 x 3の既定値:0 0 0 0 1 0 0 0 0
    5 x 5の既定値:0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
    7 x 7の既定値:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  • 0rdiv, 1rdiv, 2rdiv, 3rdiv
    チャンネル毎の指定カーネルに倍率をかける
    既定値:1[float]
  • 0bias, 1bias, 2bias, 3bias
    チャンネル毎の指定カーネルに加算。明るくしたり暗くしたりするのに便利
    既定値:0[float]
  • 0mode, 1mode, 2mode, 3mode
    チャンネル毎のマトリクスモードの指定
    • 0, square。縦x横。既定値
    • 1, row。single row matrix:横、行だけ
    • 2, column。single column matrix:縦、列だけ

コマンド例

  • シャープ
    ffplay -i input -vf convolution="0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0"
  • ボックスブラー
    ffplay -i input -vf convolution="1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1/9:1/9:1/9:1/9"
  • 5 x 5のガウシアンブラー
    ffplay -i input -vf convolution="2 4 5 4 2 4 9 12 9 4 5 12 15 12 5 4 9 12 9 4 2 4 5 4 2:2 4 5 4 2 4 9 12 9 4 5 12 15 12 5 4 9 12 9 4 2 4 5 4 2:2 4 5 4 2 4 9 12 9 4 5 12 15 12 5 4 9 12 9 4 2 4 5 4 2:2 4 5 4 2 4 9 12 9 4 5 12 15 12 5 4 9 12 9 4 2 4 5 4 2:1/159:1/159:1/159:0"
  • エッジ検出
    エッジ検出は標準フィルタにedgedetectがある。単純にエッジ検出するのならconvolutionフィルタの方が負荷が低い。
    ffplay -i input -vf convolution="0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:5:1:1:1:0:128:128:128"
    ffplay -i input -vf convolution="0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:5:5:5:1:0:128:128:128"
  • エンボス
    ffplay -i input -vf convolution="-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2"
  • ソーベル。単体フィルタにsobelがある。
    ffplay -i input -vf convolution="-1 -2 -1 0 0 0 1 2 1:-1 -2 -1 0 0 0 1 2 1:-1 -2 -1 0 0 0 1 2 1:-1 -2 -1 0 0 0 1 2 1:1:1:1:0:0:128:128:0"
    ffplay -i input -vf convolution="-1 0 1 -2 0 2 -1 0 1:-1 0 1 -2 0 2 -1 0 1:-1 0 1 -2 0 2 -1 0 1:-1 0 1 -2 0 2 -1 0 1:1:1:1:0:0:128:128:0"
    ffplay -i input -vf convolution="3 10 3 0 0 0 -3 -10 -3:3 10 3 0 0 0 -3 -10 -3:3 10 3 0 0 0 -3 -10 -3:3 10 3 0 0 0 -3 -10 -3:1:1:1:0:0:128:128:0"
    ffplay -i input -vf convolution="3 0 -3 10 0 -10 3 0 -3:3 0 -3 10 0 -10 3 0 -3:3 0 -3 10 0 -10 3 0 -3:3 0 -3 10 0 -10 3 0 -3:1:1:1:0:0:128:128:0"
  • 7 x 7のガウシアンブラー。最後に4096で割る
    "1 6 15 20 15 6 1 6 36 90 120 90 36 6 15 90 225 300 225 90 15 20 120 300 400 300 120 20 15 90 225 300 225 90 15 6 36 90 120 90 36 6 1 6 15 20 15 6 1"

convolution_opencl

opencl を使ってconvolution_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,convolution_opencl output

通常のフィルタに切り替えるにはhwdownload,format=yuv420pフィルタを挟む。
ffmpeg -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwupload,convolution_opencl,hwdownload,format=yuv420p,lutyuv=val:128:128 output

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

コメントを残す

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

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