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

FlexibleMerge その4

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

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)

clip2=mt_merge(clip1,clip2,blank1,luma=true)

#nexc
global global_nmaxA=nmaxA
global global_nmaxB=nmaxB
global global_nmin=nmin
Mask1_Mask2=Interleave(Mask1,Mask2)
nexc_max1=ConditionalFilter(Mask1,clip1,clip,"AverageLuma()","<","global_nmaxA")
nexc_max2=ConditionalFilter(Mask2,clip2,clip,"AverageLuma()","<","global_nmaxA")
nexc_max3=ConditionalFilter(Mask1_Mask2,nexc_max1,nexc_max2,"AverageLuma(SelectEven)","<","AverageLuma(SelectOdd)")
SelectClip=Select(nexc,clip,nexc_max1,nexc_max2,nexc_max3)
nexc_max=ConditionalFilter(Mask1_Mask2,clip,SelectClip,"Abs(AverageLuma(SelectEven)-AverageLuma(SelectOdd))","<","global_nmaxB")
nexc_min1=ConditionalFilter(Mask1,clip1,nexc_max,"AverageLuma()","<","global_nmin")
nexc_min2=ConditionalFilter(Mask2,clip2,nexc_max,"AverageLuma()","<","global_nmin")
nexc_min3=ConditionalFilter(Mask1,clip1,nexc_min2,"AverageLuma()","<","global_nmin")
nexc_min=Select(nexc,clip,nexc_min1,nexc_min2,nexc_min3)
clip=(nexc==0) ? clip : nexc_max

#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,nexc_min,nexc_min,"AverageLuma(SelectEven)","<","AverageLuma(SelectOdd)",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のノイズ量の差がnmaxB以上のときclip1を返す。clip1がnmin以下ならclip1を返す。
2.clip1,clip2のノイズ量の差がnmaxB以上のときclip2を返す。clip2がnmin以下ならclip2を返す。
3.clip1,clip2のノイズ量の差がnmaxB以上のときノイズ量の少ないクリップを返す。clip1かclip2がnmin以下なら該当するクリップを返す(両方が該当する場合はclip1が優先される)。
nmin - [default=1] clip1,clip2のどちらかのノイズ量がこれ以下の場合はmergeしない
nmaxA - [default=30] clip1,clip2のノイズ量がnminからnmaxAの間はnexcを介さずにmergeする
nmaxB - [default=30] clip1とclip2のノイズ量の差。nexcで使う。
show - [default=0, 0-3] FlexibleMergeの働きを視覚化する
1.出力クリップにCombcheckを適用する
2.入力クリップと出力クリップにCombcheckを適用し並べる
3.入力クリップのノイズ量を表示する


ノイズ量に応じて出力を変える部分を変更。
スポンサーサイト

コメント
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
[2015/08/06 10:04] | # [ 編集 ]

管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
[2015/08/06 20:23] | # [ 編集 ]

Re: FlexibleMerge3について
SeparateFieldsしたら縦解像度が半分になっちゃいます。
それだと逆テレシネ後にblurかけたような結果になるかと。

1ソースで使う場合は、逆テレシネの際に本来間引いて捨てる部分をかけあわせます。
ソースのフレームの劣化状況が違う場合にしか効果がないので。
自分は以下のようにやってます。

avsでテレシネパターンごとに使う変数を指定して
DW023=Interleave(DoubleWeave().SelectEvery(5, 0),FlexibleMerge3(DoubleWeave().SelectEvery(5, 2),DoubleWeave().SelectEvery(5, 3)))
DW013=Interleave(FlexibleMerge3(DoubleWeave().SelectEvery(5, 0),DoubleWeave().SelectEvery(5, 1)),DoubleWeave().SelectEvery(5, 3))
DW134=Interleave(DoubleWeave().SelectEvery(5, 1),FlexibleMerge3(DoubleWeave().SelectEvery(5, 3),DoubleWeave().SelectEvery(5, 4)))
DW124=Interleave(FlexibleMerge3(DoubleWeave().SelectEvery(5, 1),DoubleWeave().SelectEvery(5, 2)),DoubleWeave().SelectEvery(5, 4))
DW024=Interleave(DoubleWeave().SelectEvery(5, 2),FlexibleMerge3(DoubleWeave().SelectEvery(5, 4),DoubleWeave().SelectEvery(5, 5)))
Its(def = "time.def", fps=-1, output = "datafile\timecode.tmc")

defで適用します
Set [24] DW023='DW023'
Set [24] DW013='DW013'
Set [24] DW134='DW134'
Set [24] DW124='DW124'
Set [24] DW024='DW024'

0-3894 [24] DW124 # 3895



thrの件はご指摘感謝です。とりあえず書きなおして使ってください。
[2015/08/06 20:32] URL | ささみし #- [ 編集 ]

承認待ちコメント
このコメントは管理者の承認待ちです
[2015/08/06 23:20] | # [ 編集 ]


コメントの投稿














管理者にだけ表示を許可する


トラックバック
トラックバック URL
http://sasamisi.blog24.fc2.com/tb.php/317-d4b1b080
この記事にトラックバックする(FC2ブログユーザー)

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