タグ別アーカイブ: alpha_channel

エッジ検出フィルタ sobel, prewitt

ffmpeg 3.2 でリリース予定のビデオフィルタ。エッジ検出フィルタに単体では edgedetectfrei0rsobel があり、カーネルを指定する convolution でもエッジ検出ができるが、今回のこれらのフィルタは edgedetect よりもエッジ部分の線が太く convolution よりも手軽なのでマスクするのにも便利。sobelprewittroberts はカーネルが少し異なるがオプションは同じである。

ffmpeg でエッジ検出をする edgedetect
エッジ検出フィルタ roberts
ffmpeg で使える frei0r フィルタの使い方
先鋭化やぼかし、エンボス処理などができる convolution
ffmpeg でエッジマスク

基本コマンド

既定値のオプションを当てる
ffmpeg -i input -vf sobel=planes=15:scale=1:delta=0 output
ffmpeg -i input -vf sobel=15:1:0 output
ffplay -i input -vf sobel=15:1:0

公式ドキュメント:FFmpeg Filters Documentation : sobel
公式ドキュメント:FFmpeg Filters Documentation : prewitt
続きを読む エッジ検出フィルタ sobel, prewitt

ウェーブレットデノイザ vaguedenoiser

ffmpeg 3.2 でリリース予定のビデオフィルタ。Cohen-Daubechies-Feauveau(CDF) 9/7 のウェーブレットデノイザ。フィルタを当てるチャンネルを指定できる。

基本コマンド

ffmpeg -i input -vf vaguedenoiser=threshold=2:method=2:nsteps=6:percent=85:planes=15 output
ffmpeg -i input -vf vaguedenoiser=2:2:6:85:15 output
ffplay -i input -vf vaguedenoiser=2:2:6:85:15

公式ドキュメント:FFmpeg Filters Documentation : vaguedenoiser
続きを読む ウェーブレットデノイザ vaguedenoiser

2入力の LUT を手軽に入れ替えられる lut2

ffmpeg 3.2 でリリース予定のビデオフィルタ。映像の YUV や RGB を別の映像と入れ換えるときに今までは extractplanes で対象チャンネルを取り出して、mergeplanes で合わせていたのが lut2 だけで入れ換えることができる。ただし複数入力するビデオフィルタでは同じ解像度と SAR でないとエラーが出る。

ffmpeg 3.4 でリリース予定に同じオプションで tlut2 フィルタも追加される。こちらは1入力1出力になり、前後フレームの LUT を入れ換える。いわゆる tblend フィルタの LUT 版になる。

各映像チャンネルを分離する extractplanes
各映像チャンネルを結合する mergeplanes

また1入力で各チャンネルを入れ換えるには shuffleplanes や、swapuv フィルタがある。

plane を入れ替え、コピーする shuffleplanes

基本コマンド

1入力の Y(または R)をそのままに、1入力の UV(またはGB)を2入力の UV(またはGB)と入れ換える
ffmpeg -i input1 -i input2 -filter_complex lut2=c0=x:c1=y:c2=y output
ffmpeg -i input1 -i input2 -filter_complex lut2=x:y:y output
ffmpeg -re -i input1 -i input2 -filter_complex lut2=x:y:y -f sdl -

公式ドキュメント:FFmpeg Filters Documentation : lut2, tlut2
続きを読む 2入力の LUT を手軽に入れ替えられる lut2

映像の差分を加算する maskedclamp

ffmpeg 3.2 でリリース予定のビデオフィルタ。映像を3入力し、1入力を基本の映像として、1入力と比較して2入力は差分の値がプラスのときに、1入力と比較して3入力は差分の値がマイナスのときに、その差分だけ1入力と入れ換える maskedclamp フィルタの使い方。同じようなことが blend フィルタでもできるが、こちらは3入力できるところが特徴である。

基本コマンド

同じ映像を3入力しても出力映像は変わらない
ffmpeg -i input -vf split=3[0][1][2];[0][1][2]maskedclamp=undershoot=0:overshoot=0:planes=15 output
ffmpeg -i input -vf split=3[0][1][2];[0][1][2]maskedclamp=0:0:15 output
ffplay -i input -vf split=3[0][1][2];[0][1][2]maskedclamp=0:0:15

公式ドキュメント:FFmpeg Filters Documentation : maskedclamp
続きを読む 映像の差分を加算する maskedclamp

アルファチャンネルをグレースケールで出力する alphaextract

映像にアルファチャンネルがあるときに alphaextract を使えばグレースケールで取り出すことができる。同時にフォーマットもグレースケール YUV に変換される。同じ効果のフィルタに extractplanes=a があり、これもグレースケールで出力する。透過部分の値は小さく、透過しない部分の値は大きくなる。

各映像チャンネルを分離する extractplanes

基本コマンド

0000bf(青)の透過した部分を黒で、透過しない部分を白の alphaextract.png で出力する。設定するオプションはない。
ffmpeg -f lavfi -i smptebars=d=1 -vf colorkey=0x0000bf:.01:.1,alphaextract -vframes 1 alphaextract.png

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

別ファイルの情報から元映像を透過させる alphamerge

alphamerge は2番目の入力のグレースケール(グレースケールでなければ変換される)の白黒具合に応じて1番目の入力に透過情報を加える。透過具合については黒が透過し、白に近いほど透過しなくなり、出力は YUVA または ARGB, RGBA になる。アルファチャンネルを含む映像になるのでそれに対応したコーデックで出力しないとアルファチャンネルが消えてしまうのに注意。YUVA なら ffv1。RGBA なら utvideo または ffv1 で出力する。同じ機能のフィルタに mergeplanes があるがこちらの方が負荷が少し軽く、アルファチャンネルを追加する maskedmerge と負荷は変わらない。

各映像チャンネルを結合する mergeplanes
マスクして2入力を合わせる maskedmerge

基本コマンド

YUVA 出力の場合は ffv1
ffmpeg -i yuv -i gray -filter_complex alphamerge -vcodec ffv1 output.mkv
RGBA 出力の場合は utvideo または ffv1
ffmpeg -i rgb -i gray -filter_complex alphamerge -vcodec utvideo output.mkv
mergeplanes を使う例
ffmpeg -i yuv -i gray -filter_complex mergeplanes=0x00010210:yuva420p -vcodec ffv1 output.mkv

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

plane を入れ替え、コピーする shuffleplanes

plane(YUV や RGB の個別チャンネル)を入れ替えたり、コピーしたりできる shuffleplanes フィルタの使い方。

オプション

plane の順番は一般的には YUVA, RGBA の順番になっている。このフィルタは RGB/A には対応していないが GBRP/GBRAP なら対応している。YUV420P の場合 Y と UV では解像度が違うので Y と UV を入れ替えるには YUV444P に変換する必要がある。

  • map0[int]
    第1 plane の入出力を指定する。省略すると入力と同じ映像を返す
    既定値:0
    範囲:0 から 4 まで
  • map1[int]
    第2 plane の入出力を指定する。省略すると入力と同じ映像を返す
    既定値:1
    範囲:0 から 4 まで
  • map2[int]
    第3 plane の入出力を指定する。省略すると入力と同じ映像を返す
    既定値:2
    範囲:0 から 4 まで
  • map3[int]
    第4 plane の入出力を指定する。省略すると入力と同じ映像を返す
    既定値:3
    範囲:0 から 4 まで

続きを読む plane を入れ替え、コピーする shuffleplanes

YUV RGB を比較計算する blend

2入力した映像の YUVA や RGBA を比較して結果を表示する blend の使い方。差分を調べて比較動画を作ったり、マスクした部分に別の映像を重ねたりいろいろな映像効果を作ることができる。

基本コマンド

比較動画として上に二つ並べて左下に差分(Y は 0 差分、UV は1入力)の動画を表示するコマンド例
ffplay -f lavfi "movie=left.mp4,setpts=PTS-STARTPTS,split[a1][a2];movie=right.mp4,setpts=PTS-STARTPTS,split[b1][b2];[a1][b1]blend=c0_mode=difference,pad=2*iw:ih:0:0[blend];[a2][b2]hstack[tmp];[tmp][blend]vstack"
比較動画として上に二つ並べて左下に差分(Y は 0 差分、UV は128)の動画を表示するコマンド例
ffplay -f lavfi "movie=left.mp4,setpts=PTS-STARTPTS,split[a1][a2];movie=right.mp4,setpts=PTS-STARTPTS,split[b1][b2];[a1][b1]blend=c0_mode=difference,lutyuv=val:128:128,pad=2*iw:ih:0:0[blend];[a2][b2]hstack[tmp];[tmp][blend]vstack"

間違い探しを簡単に調べるコマンド(インターネット上の画像も入力できる)
ffmpeg -i img1.jpg -i img2.jpg -filter_complex setsar=1/1[0a];[1]setsar=1/1,[0a]blend=c0_mode=grainextract,lutyuv=val:128:128 out.jpg

公式ドキュメント:FFmpeg Filters Documentation : blend, tblend
続きを読む YUV RGB を比較計算する blend

マスクして2入力を合わせる maskedmerge

3入力目をマスクにして、1入力目の映像と2入力目の映像をマスクに合わせて出力する。マスクをどの程度指定するかで1入力目と2入力目の割合を指定できる。バージョンは3.0 以降から使える。アルファチャンネルを追加する alphamerge と負荷は変わらない。

別ファイルの情報から元映像を透過させる alphamerge

マスクの各チャンネル(YUVA, RGBA など)の値から1,2入力に対応したチャンネルがブレンド、またはスルーされる。0 ならば1入力目を、255(8bit)ならば2入力目を反映させる。既定値は1, 2入力がブレンドされる。アルファチャンネルは 0 が完全透過になる。出力フォーマットは1入力と同じになる。マスクをフルレンジに対応させるには1入力がフルレンジ(yuvj420p, gray など)に対応しておかなければならない。途中フルレンジで出力がリミテッドレンジならば最後に format=yuv420p をつけてレンジを直す。

マスクの指定には別ファイルを使う方法と、フィルタを当てて各コンポーネントを調整する方法とがある。各コンポーネントを調整には lut が使いやすい。別ファイルを使う場合にはモノクロ映像を使うことでその部分にだけフィルタを当てるのが手軽になる。

Windows の ffmpeg で生放送する方法 : LUT(ルックアップテーブル)

基本コマンド

ffmpeg -f lavfi -i color,format=rgba,split=3[0][1][2];[0]lutrgb=255:255:255:255[0a];[1]lutrgb=0:0:0:0[1a];[2]lutrgb=255:200:150:100[2a];[0a][1a][2a]maskedmerge=0x0 output

公式ドキュメント:FFmpeg Filters Documentation : maskedmerge
続きを読む マスクして2入力を合わせる maskedmerge