スポンサーサイト

 --, -- --:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

多少映像に違いがあっても問題なくブレンドするには?

 12, 2015 00:05
この記事は DTV Advent Calendar 2015 に登録させて頂きました。


えがき

前回の記事 でご紹介したブレンド技術は、 2 つのクリップの間に 1 フレームの映像の違いも許されないという縛りがありました。
今日はそのあたりを上手く回避して、テロップの違いや作画修正などが認められる場合でもブレンドする方法をご紹介したいと思います。
一例ですので、無理にこの方法に拘る必要はありません。





例によって AviSynth が使える事を前提に進めさせて頂きます。
必須プラグインは Masktools v2 です。



うやるの?

映像の違いがある部分のみマスキングを施し、それ以外の部分のみブレンドしたクリップを表示します。
以下 code と preview で順を追って説明します。

■ ソースの読み込み
a=ImageSource("ClipA.bmp", start=0, end=0).ConvertToYV12(matrix="Rec709")
b=ImageSource("ClipB.bmp", start=0, end=0).ConvertToYV12(matrix="Rec709")

ClipA.png ClipB.png
今回はとりあえず画像で説明します。
違いが分かり易いように、あえて全く違う図形を用意しました。




■ 差分マスク生成
ab=mt_makediff(a,b,U=-128,V=-128)
ba=mt_makediff(b,a,U=-128,V=-128)

ab.png ba.png
a-b 間の、差異がある部分のマスクを生成します。
順序を変えると別のマスクが出来上がるので、両方とも作っておきます。




■ 差分マスクを合成
mask=mt_logic(ab,ba,mode="or")

mask_ab+ba.png
2 つのマスクを合成。
mode パラメータで論理演算を or に設定して、すべての領域をマージします。




■ とりあえずブレンドクリップを作成
clip=FlexibleMerge(a,b)

clip_ab+ba.png
この時点では、○と△を無理やりブレンドしているので、乱れた映像になります。



■ ブレンドしたクリップをベースに、マスキング領域を b に置き換える
mt_merge(clip,b,mask,luma=true)

result.png
無理やりブレンドしたクリップの内、マスク領域のみ b に置き換えます。
第 2 引数を a にすることで○のクリップにすることも可能です。
これで、とりあえず目標達成です。




用編

作成したマスクは、意図したマスク外領域にアルファ値(透過率)を含んでいますので、輝度に閾値を設けて階調化します。
こうすれば一々 mt_makediff を二通り生成する必要もありません。
別途 yRangeMask を使用します。

■ マスクのアルファ領域をコントロールする関数定義
function trans_control(clip c, int "padding_range", int "fade_range") {
padding_range=default(padding_range,0)
fade_range=default(fade_range,0)
return mt_merge(BlankClip(c,color=$004D00),BlankClip(c,color=$00FF00),c.yrangemask(128-(padding_range+fade_range),fade_range,128+(padding_range+fade_range),fade_range).mt_invert(),luma=true)
}

■ 使用例
a=ImageSource("ClipA.bmp", start=0, end=0).ConvertToYV12(matrix="Rec709")
b=ImageSource("ClipB.bmp", start=0, end=0).ConvertToYV12(matrix="Rec709")
diff=mt_makediff(a, b, U=-128, V=-128)
trans_control(diff)
return last

mask_trans_control.png



総括として、簡単な差分マスク関数を書きます。

■ 差分マスク関数定義
function get_diffmask(clip a, clip b, int "padding_range", int "fade_range", int "deflate") {
padding_range=default(padding_range,0)
fade_range=default(fade_range,0)
deflate=default(deflate,2)
trans_control(mt_lutxy(a,b,"x y - 128 +",U=-128,V=-128),padding_range=padding_range,fade_range=fade_range)
return add_deflates(mt_binarize(U=-0, V=0), deflate)
}

function add_deflates(clip clip, int limit, int "cnt") {
cnt=default(cnt,0)
cnt=cnt+1
clip=limit==cnt?clip:clip.mt_deflate()
return limit==cnt?clip:add_deflates(clip, limit, cnt)
}

function trans_control(clip c, int "padding_range", int "fade_range") {
padding_range=default(padding_range,0)
fade_range=default(fade_range,0)
return mt_merge(BlankClip(c,color=$004D00),BlankClip(c,color=$00FF00),c.yrangemask(128-(padding_range+fade_range),fade_range,128+(padding_range+fade_range),fade_range).mt_invert(),luma=true)
}


■ 使用例
a=ImageSource("ClipA.bmp", start=0, end=0).ConvertToYV12(matrix="Rec709")
b=ImageSource("ClipB.bmp", start=0, end=0).ConvertToYV12(matrix="Rec709")
mask=get_diffmask(a, b)
clip=FlexibleMerge(a, b)
mt_merge(clip, b, mask, luma=true)
return last



わりに

以上の方法を活用することで、ED など映像に差異があるクリップ同士でも、可能な限りの範囲をブレンドすることが出来ます。
OP でも、油断をしていると作画修正を見逃してミスエンコードしてしまうので、細心の注意を払ってチェックし、修正箇所を見つけたら今回の手法でブレンドしてみてください。



それでは、良いエンコライフをー





出典
にわとり遊び - 2つのソースからノイズの無い部分を選んでブレンドする (FlexibleMerge) その2
メモ置き場 - yの範囲を指定してマスク


関連記事
一部のエンコオタクの間で流行っているブレンドエンコードとは?


スポンサーサイト

Tag:DTV AviSynth FlexibleMerge ブレンド エンコード

COMMENT - 0



WHAT'S NEW?

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。