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
関連記事
- たたみ込み演算による画像処理
- Convolution Matrix
- Kernel (image processing) – Wikipedia, the free encyclopedia
- Sobel operator – Wikipedia, the free encyclopedia
- gimp.org(web.archive.org) : 8.2. Convolution Matrix
オプション
:で区切ってチャンネル毎に指定する。カーネルが大きくなるほど負荷が高くなる。カーネルが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