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

2つのソースからノイズの無い部分を選んでブレンドする (FlexibleMerge) その3
merge.png
FlexibleMerge3(clip1,clip2,right=6)

clip1_20150429202259bb6.pngclip2_2015042920225787e.png
左からclip1,clip2

show2.png
show=2


function FlexibleMerge3 (clip clip1,clip clip2,float "weight",float "weight2",int "top",int "bottom",int "left",int "right",float "thr",int "nexc",float "nmax",int "show") {
thr=default(thr,10)
weight=default(weight,0.5)
weight2=default(weight2,0.9)
show=default(show,0)
nexc=default(nexc,3)
nmax=default(nmax,30)

top=default(top,0)
bottom=default(bottom,0)
left=default(left,0)
right=default(right,0)

blank1=BlankClip(clip1,color=$ffffff).Letterbox(top,bottom,left,right).mt_binarize()

Mask1=CombMask(clip1, thY1 = thr, thY2 = thr)
Mask2=CombMask(clip2, thY1 = thr, thY2 = thr)
nmask1=mt_logic(blank1,mt_invert(mask2),mode="and")#clip2がきれい
nmask2=mt_logic(blank1,mt_logic(mask2,mask1,mode="andn"),mode="and")#clip1にノイズ、clip2はきれい

clip1=(show==0) ? clip1 : clip1.subtitle("clip1",size=48)
clip2=(show==0) ? clip2 : clip2.subtitle("clip2",size=48,y=50)
clip3=Merge(clip1,clip2,weight)
clip4=Merge(clip1,clip2,weight2)
clip=mt_merge(clip1,clip3,nmask1,luma=true)
clip=mt_merge(clip,clip4,nmask2,luma=true)

#nexc
global global_nmax=nmax
Mask1_Mask2=Interleave(Mask1,Mask2)
SelectClip=ConditionalFilter(Mask1_Mask2,clip1,clip2,"AverageLuma(SelectEven)","<","AverageLuma(SelectOdd)")
SelectClip=Select(nexc,clip,clip1,clip2,selectclip)
SelectClip=ConditionalFilter(Mask1_Mask2,clip,SelectClip,"Abs(AverageLuma(SelectEven)-AverageLuma(SelectOdd))","<","global_nmax")
clip=(nexc==0) ? clip : SelectClip

#show
show1=Combcheck(clip)
show2=StackHorizontal(Combcheck(clip1),Combcheck(clip2)).ReduceBy2.StackVertical(ReduceBy2(Combcheck(clip)).AddBorders(clip.width/4,0,clip.width/4,0))
show3=ConditionalFilter(Mask1_Mask2,clip,SelectClip,"Abs(AverageLuma(SelectEven)-AverageLuma(SelectOdd))","<","global_nmax",show=true)
clip=Select(show,clip,show1,show2,show3)
return clip
}


clip1 - ベースとなるクリップ
clip2 - サブクリップ
weight - [default=0.5] clip1とclip2の両方にノイズがない、または両方にノイズがある部分に merge(clip1,clip2,weight) を適用する
weigth2 - [default=0.9] clip1にノイズがあり、clip2にノイズがない部分に merge(clip1,clip2,weight2) を適用する
top,bottom,left,right - [default=0] clip2の外周にマスクをかけ、mergeから除外する
thr - [default=10] CombMaskの閾値
nexc - [default=3,0-3] clip1,clip2のノイズの量に応じて出力クリップを選択する
0.ノイズに関わりなくmergeしたクリップを返す
1.clip1,clip2のノイズ量の差がnmax以上のときclip1を返す
2.clip1,clip2のノイズ量の差がnmax以上のときclip2を返す
3.clip1,clip2のノイズ量の差がnmax以上のときノイズ量の少ないクリップを返す
nmax - [default=30] nexcの閾値
show - [default=0, 0-3] FlexibleMergeの働きを視覚化する
1.出力クリップにCombcheckを適用する
2.入力クリップと出力クリップにCombcheckを適用し並べる
3.入力クリップのノイズ差を表示する
スポンサーサイト
2つのクリップの差分にマスクをかけて上書きする - OverDiff3 (その4)

show.png
OverDiff3(clip2,clip1,margin=3,show=true)
クレジットの出だし(フェードイン)1フレーム目のマスク。
画像下半分はマスク適用を判断するためのクリップ。このクリップがAverageLuma=0でなければマスクを適用する。
マスクから漏れている箇所はmarginの値を大きくすればカバー可能。ただし、より重くなる。

showdiff.png
mt_lutxy(clip1,clip2,"x y - abs 128 +",chroma="process")
2クリップの差分

clip1.pngclip2.png
左からclip1,clip2
※clip1がファイルサイズ制限に引っかかったのでblur(0.3)かけてます。



function OverDiff3 (clip clip1,clip clip2,int "top",int "bottom",int "left",int "right",clip "c1",clip "c2",int "mode",int "margin",bool "clamp",bool "show") {
show=default(show,false)
top=default(top,0)
bottom=default(bottom,0)
left=default(left,2)
right=default(right,6)
margin=default(margin,0)
clamp=default(clamp,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))
mode=default(mode,2)

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",show=show)
clip_1_show=ConditionalFilter(check_diff,show_merge,show_merge,"AverageLuma","<","1",show=show)
clip_1=(show) ? StackVertical(merge(clip_1,over_mask),show_mask) : clip_1

c1_2=clip1.blur(0,1).Letterbox(top,bottom,left,right)
c2_2=clip2.blur(0,1).Letterbox(top,bottom,left,right)
small_0=mt_lutxy(c1_2,c2_2,"x y - abs",chroma="process").mt_binarize(40)
small=(margin==0) ? small_0 : mt_logic(small_0.Loop(0,0,margin-1),small_0.Loop(margin+1,0,0),mode="or")
small=(clamp) ? mt_logic(small_0,small,mode="or") : small
small=small.mt_inpand
big=mt_lutxy(c1_2,c2_2,"x y - abs 1.5 ^",chroma="process").mt_binarize(20)
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)
}

clip1 - 差分を上書きしたいクリップ
clip2 - 上書きに用いるクリップ
top,bottom,left,right - 指定した外周を除外し、部分的なマスクを作成する
c1,c2 - 比較に用いるクリップ。指定した場合、c1とc2の差分から判定を行う。クリップの一部分だけを比較する場合に使う。
mode - [default:2]
0:差分の有無に関わらず、指定した部分マスクで上書きをする。
1:差分が認められた場合のみ、指定した部分マスクで上書きをする。
2:差分が認められた箇所に自動的にマスクを作成し、上書きをする。
margin - [default:0] 入力数値の前後フレームを参照してマスクをかける (フェードイン・アウトに有効)
clamp - [default:false] margin利用時に前後フレームだけでなく現在のフレームを反映させる (流れるテロップ以外では不要)
show - [default:false] 適用するマスクを透過表示し、差分判定を合わせて表示する


※前回からの修正
show=trueのとき、差分適用前のclip1とclip2をmergeしたものを表示するように変更。
2つのクリップの差分にマスクをかけて上書きする - OverDiff3 (その3)
差分関連の関数を統合。

function OverDiff3 (clip clip1,clip clip2,int "top",int "bottom",int "left",int "right",clip "c1",clip "c2",int "mode",int "margin",bool "clamp",bool "show") {
show=default(show,false)
top=default(top,0)
bottom=default(bottom,0)
left=default(left,2)
right=default(right,6)
margin=default(margin,0)
clamp=default(clamp,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))
mode=default(mode,2)

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()

clip_0=masked_1
clip_0=(show) ? merge(clip1,over_mask) : clip_0

clip_1=ConditionalFilter(check_diff,clip1,masked_1,"AverageLuma","<","1",show=show)
clip_1=(show) ? StackVertical(merge(clip_1,over_mask),show_mask) : clip_1

c1_2=clip1.blur(0,1).Letterbox(top,bottom,left,right)
c2_2=clip2.blur(0,1).Letterbox(top,bottom,left,right)
small_0=mt_lutxy(c1_2,c2_2,"x y - abs",chroma="process").mt_binarize(40)
small=(margin==0) ? small_0 : mt_logic(small_0.Loop(0,0,margin-1),small_0.Loop(margin+1,0,0),mode="or")
small=(clamp) ? mt_logic(small_0,small,mode="or") : small
small=small.mt_inpand
big=mt_lutxy(c1_2,c2_2,"x y - abs 1.5 ^",chroma="process").mt_binarize(20)
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) ? StackVertical(merge(clip_2,diff_mask.Grayscale()),show_mask) : clip_2

return select(mode,clip_0,clip_1,clip_2)
}


clip1 - 差分を上書きしたいクリップ
clip2 - 上書きに用いるクリップ
top,bottom,left,right - 指定した外周を除外し、部分的なマスクを作成する
c1,c2 - 比較に用いるクリップ。指定した場合、c1とc2の差分から判定を行う。クリップの一部分だけを比較する場合に使う。
mode - [default:2]
0:差分の有無に関わらず、指定した部分マスクで上書きをする。
1:差分が認められた場合のみ、指定した部分マスクで上書きをする。
2:差分が認められた箇所に自動的にマスクを作成し、上書きをする。
margin - [default:0] 入力数値の前後フレームを参照してマスクをかける (フェードイン・アウトに有効)
clamp - [default:false] margin利用時に前後フレームだけでなく現在のフレームを反映させる (流れるテロップ以外では不要)
show - [default:false] 適用するマスクを透過表示し、差分判定を合わせて表示する
2つのクリップの差分にマスクをかけて上書きする - OverDiff3 (その2)
前回のものに条件フィルタを使って、該当フレーム以外ではあんまり重くならないようにしました。
まだ重いけど。

function OverDiff3 (clip clip1,clip clip2,int "margin",bool "clamp",bool "show") {
show=default(show,false)
c1=clip1.blur(0,1).letterbox(0,0,6,6)
c2=clip2.blur(0,1).letterbox(0,0,6,6)
margin=default(margin,0)
clamp=default(clamp,false)
check=mt_lutxy(c1,c2,"x y - abs",chroma="process").mt_binarize(10)
small_0=mt_lutxy(c1,c2,"x y - abs",chroma="process").mt_binarize(40)
small=(margin==0) ? small_0 : mt_logic(small_0.Loop(0,0,margin-1),small_0.Loop(margin+1,0,0),mode="or")
small=(clamp) ? mt_logic(small_0,small,mode="or") : small
small=small.mt_inpand
big=mt_lutxy(c1,c2,"x y - abs 1.5 ^",chroma="process").mt_binarize(20)
diff=mt_hysteresis(small,big).mt_expand.mt_expand.mt_expand.mt_expand.mt_expand.mt_expand.mt_expand
clip3=mt_merge(clip1,clip2,diff,luma=true)
return (show) ? merge(clip1,diff.Grayscale) : conditionalfilter(check,clip1,clip3,"averageluma","<","0.1")
}

2つのクリップの差分にマスクをかけて上書きする - OverDiff3
2_2015042300063597e.png

function OverDiff3 (clip clip1,clip clip2,int "margin",bool "clamp",bool "show") {
show=default(show,false)
c1=clip1.blur(0,1)
c2=clip2.blur(0,1)
margin=default(margin,0)
clamp=default(clamp,false)
small_0=mt_lutxy(c1,c2,"x y - abs",chroma="process").mt_binarize(40)
small=(margin==0) ? small_0 : mt_logic(small_0.Loop(0,0,margin-1),small_0.Loop(margin+1,0,0),mode="or")
small=(clamp) ? mt_logic(small_0,small,mode="or") : small
small=small.mt_inpand
big=mt_lutxy(c1,c2,"x y - abs 1.5 ^",chroma="process").mt_binarize(20)
diff=mt_hysteresis(small,big).mt_expand.mt_expand.mt_expand.mt_expand.mt_expand.mt_expand.mt_expand
return (show) ? merge(clip1,diff.Grayscale) : mt_merge(clip1,clip2,diff,luma=true)
}

clip1 - 差分を上書きしたいクリップ
clip2 - 上書きに用いるクリップ
margin - [default:0] 入力数値の前後フレームを参照してマスクをかける (フェードイン・アウトに有効)
clamp - [default:false] margin利用時に前後フレームだけでなく現在のフレームを反映させる (流れるテロップ以外では不要)
show - [default:false] 適用するマスクと反映させるクリップを透過表示させる


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