にわとり遊び
PC関連とエンコードの覚書き
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

差分合成関数 OverDiff5

function OverDiff5 (clip clip1,clip clip2,int "mode",int "top",int "bottom",int "left",int "right",int "smask",int "lmask",clip "c1",clip "c2",int "margin",bool "show") {
mode=default(mode,0)
top=default(top,0)
bottom=default(bottom,0)
left=default(left,0)
right=default(right,0)
smask=default(smask,40)
lmask=default(lmask,20)
margin=default(margin,0)
show=default(show,false)
c1=default(c1,clip1.crop(left,top,-right,-bottom).blur(0,1))
c2=default(c2,clip2.crop(left,top,-right,-bottom).blur(0,1))

check_diff=mt_lutxy(c1,c2,"x y - abs",chroma="process").mt_binarize(5).mt_inpand.mt_inpand.mt_inpand
over_mask=BlankClip(clip1,color=$ffffff).Letterbox(top,bottom,left,right).mt_binarize()
masked_1=mt_merge(clip1,clip2,over_mask,luma=true)
show_mask=Overlay(BlankClip(clip1),check_diff).Grayscale()
show_merge=merge(clip1,clip2)

clip_0=masked_1
clip_0=(show) ? merge(show_merge,over_mask) : clip_0
clip_1=ConditionalFilter(check_diff,clip1,masked_1,"AverageLuma","<","1.0",show=show)
clip_1_show=ConditionalFilter(check_diff,show_merge,show_merge,"AverageLuma","<","1.0",show=show)
clip_1=(show) ? StackVertical(merge(clip_1_show,over_mask),show_mask) : clip_1

c1=clip1.blur(0,1).Letterbox(top,bottom,left,right)
c2=clip2.blur(0,1).Letterbox(top,bottom,left,right)
small=mt_lutxy(c1,c2,"x y - abs",chroma="process").letterbox(0,0,2,2).mt_binarize(smask)
small_u=mt_lutxy(c1.UToY,c2.UToY,"x y - abs",chroma="process")
small_v=mt_lutxy(c1.VToY,c2.VToY,"x y - abs",chroma="process")
small_uv=mt_logic(small_u,small_v,mode="or").PointResize(c1.width,c1.height).letterbox(0,0,2,2).mt_binarize(smask)
small=(mode>=3) ? mt_logic(small,small_uv,mode="or") : small
small_e=mt_lutxy(c1,c2,"x y - abs",chroma="process").letterbox(2,2,2,2).mt_edge
small_e=(mode==4) ? small_e.mt_inpand : small_e
small=mt_logic(small_e,small,mode="or")
small=(margin==0) ? small : mt_logic(small,mt_logic(small.Loop(0,0,margin-1),small.Loop(margin+1,0,0),mode="or"),mode="or")
small=(mode>=4) ? small : small.mt_inpand

big=mt_lutxy(c1,c2,"x y - abs 1.5 ^",chroma="process")
big_u=mt_lutxy(c1.UToY,c2.UToY,"x y - abs 1.5 ^",chroma="process")
big_v=mt_lutxy(c1.VToY,c2.VToY,"x y - abs 1.5 ^",chroma="process")
big_uv=mt_logic(big_u,big_v,mode="or").PointResize(c1.width,c1.height)
big=(mode>3) ? mt_logic(big,big_uv,mode="or") : big
big=big.mt_binarize(lmask)

diff_mask=mt_hysteresis(small,big).mt_expand.mt_expand.mt_expand.mt_expand.mt_expand.mt_expand.mt_expand
masked_2=mt_merge(clip1,clip2,diff_mask,luma=true)
clip_2=ConditionalFilter(check_diff,clip1,masked_2,"averageluma","=","0",show=show)
clip_2_show=ConditionalFilter(check_diff,show_merge,show_merge,"averageluma","=","0",show=show)
clip_2=(show) ? StackVertical(merge(clip_2_show,diff_mask.Grayscale()),show_mask) : clip_2
return select(mode,clip_0,clip_1,clip_2,clip_2,clip_2)
}

clip1 : 元となるクリップ
clip2 : clip1に上書きする為のクリップ
mode : mode=0 無条件で上書きを行う。 / mode=1 clip1とclip2にある程度の差分が認められた場合に上書きを行う。 / mode=2 clip1とclip2の差分にマスクを作成し、その部分のみ上書きを行う。 / mode=3 mode=2に色差を追加する。 / mode=4 mode=2のマスクを拡大する。
top , bottom , left , right : 上下左右の差分を除外する。
smask : 基本となる差分マスク。smaskの範囲をlmaskで拡大し、最終的なマスクが作成される。
lmask : smaskを拡大する為のマスク。
c1 , c2 : clip1とclip2に差分があるかどうかを判定するための入力クリップ。OverlayやBlur等で加工したクリップを判定に使用できる。
margin : 前後フレームの差分マスクを重ねる。
show : 差分マスクの確認を行う。


使用例
#clip1とclip2の差分にclip2を上書きする
clip1=OverDiff5(clip1,clip2,2)

#ANIME+
checktelop=mt_lutxy(clip1,clip2,"x y - abs",chroma="process").crop(560,0,-600,-820).mt_binarize(20).mt_inpand(mode="horizontal")
clip1_ANIME=OverDiff5(clip1,clip2,1,0,820,100,1360)
clip1=ConditionalFilter(checktelop,clip1_ANIME,clip1,"averageluma","<","5")

#clip2の左右4pxをclip1に置き換える
clip2=OverDiff5(clip1,clip2,0,0,0,4,4)
※上記ではclip2の音声がclip1に入れ替わるので注意

#適用範囲を指定する
clip1=clip1.ApplyRange(0,1000,"OverDiff5",clip2,3,700,0,0,0)
※0-1000フレーム区間、上部700pxを除外
スポンサーサイト
簡易L字除去関数 LEraser
2016/04/27
関数最後のLeterboxのstart,endの指定ミスを修正


前に投稿したものがあまり上手くないようだったのでちょっと改良。

function LEraser (clip clip,float start,float end,float frames,float "top",float "bottom",float "left",float "right",int "LBtop",int "LBbottom",int "LBleft",int "LBright")
{
start=int(start*2)
end=int(end*2)
frames=int(frames*2)
top=default(top,0)
bottom=default(bottom,0)
left=default(left,0)
right=default(right,0)
t=(top/2)/frames
b=(bottom/2)/frames
l=left/frames
r=right/frames
LBtop=default(LBtop,0)
LBbottom=default(LBbottom,0)
LBleft=default(LBleft,0)
LBright=default(LBright,0)

function Lstart(clip clip,int start,float t,float b,float l,float r) {
ScriptClip(clip,"
tc=(current_frame-"+string(start)+")*"+string(t)+"
bc=(current_frame-"+string(start)+")*"+string(b)+"
lc=(current_frame-"+string(start)+")*"+string(l)+"
rc=(current_frame-"+string(start)+")*"+string(r)+"
Spline36Resize(last.width,last.height,lc,tc,last.width-lc-rc,last.height-bc-tc)
")
return last
}
function Lcrop (clip clip,int frames,float t,float b,float l,float r) {
tc=t*frames
bc=b*frames
lc=l*frames
rc=r*frames
clip.Spline36Resize(clip.width,clip.height,lc,tc,clip.width-lc-rc,clip.height-bc-tc)
return last
}
function Lend(clip clip,int end,float t,float b,float l,float r) {
ScriptClip(clip,"
tc=("+string(end)+"-current_frame)*"+string(t)+"
bc=("+string(end)+"-current_frame)*"+string(b)+"
lc=("+string(end)+"-current_frame)*"+string(l)+"
rc=("+string(end)+"-current_frame)*"+string(r)+"
Spline36Resize(last.width,last.height,lc,tc,last.width-lc-rc,last.height-bc-tc)
")
return last
}
clip.SeparateFields
ApplyRange(start,start+frames,"Lstart",start,t,b,l,r)
ApplyRange(start+frames+1,end-frames,"Lcrop",frames,t,b,l,r)
ApplyRange(end-frames+1,end,"Lend",end,t,b,l,r)
Weave()
ApplyRange(start/2,end/2,"Letterbox",LBtop,LBbottom,LBleft,LBright)
return last
}


clip : 関数を適用するクリップ
start : L字が出始めるフレーム。片フィールドの場合は 100.5 のように0.5を足して指定する。
end : L字区間が終わるフレーム。
frames : L字の出始めから完成までのフレーム数。
top , bottom , left , right : L字テロップの上下左右を指定する。
LBtop , LBbottom , LBleft , LBright : Letterboxで上部を黒くする。


使用例
#NTV
LEraser(91.5,4136.5,30,left=200,bottom=1080-930)
LEraser(4361.5,22058,30,left=200,bottom=1080-930)
LEraser(22205,41298.5,30,left=200,bottom=1080-930)

#TX
LEraser(34.5,4253,27,left=215,bottom=1080-918)
LEraser(4580.5,23343,27,left=215,bottom=1080-918)
LEraser(23366.5,43152.5,27,left=215,bottom=1080-918)





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