Photo Gallery

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
ED などのクレジットに差異があるクリップ同士を Merge するためのスクリプトです。
まだ実験段階ですので、今後も改良するかもしれません。

クリップの差分検出したのちにエッジ検出でクレジットをマスキングしていますので、背景のアニメーションに差異がある場合は有効に働きませんので悪しからず…。

1031.png

v01-v12: Mergeするクリップ。偶数個指定。
nmax: FlexibleMerge(nmax)
weight: FlexibleMerge(weight)
weight2: FlexibleMerge(weight2)
thr: FlexibleMerge(thr)
thY1: クレジットを検出するためのmt_edgeのthY1
thY2: クレジットを検出するためのmt_edgeのthY2
expand: クレジットマスクの膨張量
credit_clip: クレジットを使用するクリップ(v01-v12の中から選択)


function CustomMergeEx(clip v01, clip v02, clip "v03", clip "v04", clip "v05", clip "v06", clip "v07", clip "v08", clip "v09", clip "v10", clip "v11", clip "v12", int "nmax", float "weight", float "weight2", int "thr", int "thY1", int "thY2", int "expand", clip "credit_clip") {
v03=default(v03,blankclip(v01,length=-1))
v04=default(v04,blankclip(v01,length=-1))
v05=default(v05,blankclip(v01,length=-1))
v06=default(v06,blankclip(v01,length=-1))
v07=default(v07,blankclip(v01,length=-1))
v08=default(v08,blankclip(v01,length=-1))
v09=default(v09,blankclip(v01,length=-1))
v10=default(v10,blankclip(v01,length=-1))
v11=default(v11,blankclip(v01,length=-1))
v12=default(v12,blankclip(v01,length=-1))
credit_clip=default(credit_clip,v01)
nmax=default(nmax,5)
thY1=default(thY1,80)
thY2=default(thY2,255)
weight=default(weight,0.25)
weight2=default(weight2,0.1)
thr=default(thr,2)
expand=default(expand,30)

w1=weight
w2=weight2
n=nmax
t=thr
s=0
clip=FlexibleMerge(v01,v02,weight=w1,weight2=w2,thr=t,nmax=n,exc=2,show=s)
clip=v03.framecount!=-1?FlexibleMerge(clip,v03,weight=w1,weight2=w2,thr=t,nmax=n,exc=2,show=s):clip
clip=v04.framecount!=-1?FlexibleMerge(clip,v04,weight=w1,weight2=w2,thr=t,nmax=n,exc=2,show=s):clip
clip=v05.framecount!=-1?FlexibleMerge(clip,v05,weight=w1,weight2=w2,thr=t,nmax=n,exc=2,show=s):clip
clip=v06.framecount!=-1?FlexibleMerge(clip,v06,weight=w1,weight2=w2,thr=t,nmax=n,exc=2,show=s):clip
clip=v07.framecount!=-1?FlexibleMerge(clip,v07,weight=w1,weight2=w2,thr=t,nmax=n,exc=2,show=s):clip
clip=v08.framecount!=-1?FlexibleMerge(clip,v08,weight=w1,weight2=w2,thr=t,nmax=n,exc=2,show=s):clip
clip=v09.framecount!=-1?FlexibleMerge(clip,v09,weight=w1,weight2=w2,thr=t,nmax=n,exc=2,show=s):clip
clip=v10.framecount!=-1?FlexibleMerge(clip,v10,weight=w1,weight2=w2,thr=t,nmax=n,exc=2,show=s):clip
clip=v11.framecount!=-1?FlexibleMerge(clip,v11,weight=w1,weight2=w2,thr=t,nmax=n,exc=2,show=s):clip
clip=v12.framecount!=-1?FlexibleMerge(clip,v12,weight=w1,weight2=w2,thr=t,nmax=n,exc=2,show=s):clip

maskA=mt_makediff(v01,v02,U=-128,V=-128)
maskB=v03.framecount!=-1&&v04.framecount!=-1?mt_makediff(v03,v04,U=-128,V=-128):BlankClip(v01,length=-1)
maskC=v05.framecount!=-1&&v06.framecount!=-1?mt_makediff(v05,v06,U=-128,V=-128):BlankClip(v01,length=-1)
maskD=v07.framecount!=-1&&v08.framecount!=-1?mt_makediff(v07,v08,U=-128,V=-128):BlankClip(v01,length=-1)
maskE=v09.framecount!=-1&&v10.framecount!=-1?mt_makediff(v09,v10,U=-128,V=-128):BlankClip(v01,length=-1)
maskF=v11.framecount!=-1&&v12.framecount!=-1?mt_makediff(v11,v12,U=-128,V=-128):BlankClip(v01,length=-1)

mask=mt_makediff(maskA,maskB,U=-128,V=-128)
mask=maskC.framecount!=-1?mt_makediff(mask,maskC,U=-128,V=-128):mask
mask=maskD.framecount!=-1?mt_makediff(mask,maskD,U=-128,V=-128):mask
mask=maskE.framecount!=-1?mt_makediff(mask,maskE,U=-128,V=-128):mask
mask=maskF.framecount!=-1?mt_makediff(mask,maskF,U=-128,V=-128):mask

mask=mask.mt_edge(thY1=thY1,thY2=thY2,mode="sobel",chroma="none").Levels(0,3.3,90,0,255).mt_binarize()
mask=Eval(AppendFunc("mask","mt_expand()",expand))

return mt_merge(clip,credit_clip,mask,luma=true)
}

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





©スズキヒサシ/株式会社KADOKAWA メディアファクトリー刊/すばる魔法学院

スポンサーサイト

1916.png
853.png


clip1 と clip2 を Merge したものに対して、次の clip2 を追加していく形で FlexibleMerge を使用した場合、より効率的な Merge 順序を知りたくて検証したので、結果をまとめました。

結論から申し上げますと、綺麗なクリップから順番に追加するほうが綺麗でした。

今回画質を評価する値として、 FlexibleMerge 内部でも使用されている CombCheck のルーチンを使い、 AverageChromaV で取れたものを使用しています。
AverageChromaV() はクリップ上の赤色の量を示すもので、赤色は CombCheck() によってコーミングを表しています。

今回検証に使用したソースは、BS11 のガルガンティア OP の 9話分 です。
以下に示すのは、中でも極端に画質破綻が起きているフレームの結果をまとめたものです。


ScriptClip(v04.CombCheck(),"subtitle(string(AverageChromaV()))") #131.931641
ScriptClip(v07.CombCheck(),"subtitle(string(AverageChromaV()))") #133.499557
ScriptClip(v10.CombCheck(),"subtitle(string(AverageChromaV()))") #133.610458
ScriptClip(v09.CombCheck(),"subtitle(string(AverageChromaV()))") #133.891953
ScriptClip(v03.CombCheck(),"subtitle(string(AverageChromaV()))") #134.028824
ScriptClip(v02.CombCheck(),"subtitle(string(AverageChromaV()))") #136.783371
ScriptClip(v05.CombCheck(),"subtitle(string(AverageChromaV()))") #140.683655
ScriptClip(v06.CombCheck(),"subtitle(string(AverageChromaV()))") #144.371918
ScriptClip(v08.CombCheck(),"subtitle(string(AverageChromaV()))") #148.861786


これらのソースを、綺麗な順番と汚い順番でそれぞれ Merge し、再び数値を取ります。
Merge の方法は以下の通り。

previewSourceCode.png


上段、綺麗なクリップ順。下段、汚いクリップ順。
609昇順
609昇順


上段、綺麗なクリップ順。下段、汚いクリップ順。
609昇順up
609降順up


あまりにも歴然の差でした。
今後は Merge する順番にも拘ってエンコードしてみます。

まぁ、それほど気にする必要ないかもしれませんが、フレームごとに検証ルーチン挟んで Merge したほうがいいかもしれないですね。
物凄く重くなりそうだけど。


それでは。




©オケアノス/「翠星のガルガンティア」製作委員会


Tag:FlexibleMerge 翠星のガルガンティア

縞が出ているクレジットをBOB化します。
エッジマスクを使っているので、他所への影響は少ないです。

追記 それでも尚縞が残る場合は、フレーム全体にbob化処理を行うように改良

520-.png

520bob-.png


function PointBob(clip clip) {
BOBCLIP=clip.bob().SelectOdd()
mask=clip.mt_edge(mode="LAPLACE").mt_binarize().mt_expand()
ConditionalFilter(clip, mt_merge(clip,BOBCLIP,mask),clip,"IsCombedT()", "=", "TRUE")
}

function PointBob(clip clip, int "thr") {
thr=default(thr,9)
global thr=thr
BOBCLIP=clip.QTGMC(preset="fast").SelectOdd()
mask=clip.mt_edge(mode="laplace").mt_binarize().mt_expand()
last=ConditionalFilter(clip, mt_merge(clip,BOBCLIP,mask),clip,"IsCombedT(thr,thr)", "=", "TRUE")
return ConditionalFilter(clip, clip.QTGMC(preset="fast").SelectOdd(),last,"IsCombedT(thr,thr)", "=", "TRUE")
}



©秋元 康・木村千歌・講談社/NHK・NEP
有名なアレライクな周期チェック用スクリプト。

周期が 2-3pulldown もしくは 3-2pulldown であることが前提で
5 つのパターンを並べて比較します。

最近のアニメでしたらこれで大体網羅できると思うので、使い勝手はいいんじゃないかと。



1977.png


MergeCheck.png


function MergeCheck(clip clip, int "mode") {
mode=default(mode,0)
Assert(0<=mode&&mode<=5, "error.")
clip.SeparateFields()

#############################################################
# 2-3 pulldown
# 4B 4T | [1B][1T] 2B [2T][2B][3T][3B] 4T [4B][4T] | 1B 1T
# 4B 4T | [1B][1T][2B][2T] 2B [3T][3B][4T][4B] 4T | 1B 1T
# -- -- ++ ++ -- -- -- ++ ++ -- -- -- ++ ++
# -2 -1 | 00 +1 +2 +3 +4 +5 +6 +7 +8 +9 | 10 11
v1=SelectEvery(10,00,01,04,03,06,05,08,09).Weave()
v2=SelectEvery(10,00,01,02,03,06,05,08,07).Weave()
A=Merge(v1, v2)

##############################################################
# 2-3 pulldown ( 1f back shift )
# 4T [1B] | [1T] 2B [2T][2B][3T][3B] 4T [4B][4T] 1B | 1T 2B
# 4T [1B] | [1T][2B][2T] 2B [3T][3B][4T][4B] 4T 1B | 1T 2B
# -- ++ ++ -- -- -- ++ ++ -- -- -- ++ ++ --
# -2 -1 | 00 +1 +2 +3 +4 +5 +6 +7 +8 +9 | 10 11
v1=SelectEvery(10,-1,00,03,02,05,04,07,08).Weave()
v2=SelectEvery(10,-1,00,01,02,05,04,07,06).Weave()
B=Merge(v1, v2)

##############################################################
# 3-2 pulldown
# 4B 4T | 1B [1T][1B][2T][2B] 3T [3B][3T][4B][4T] | 1B 1T
# 4B 4T | [1B][1T] 1B [2T][2B][3T][3B] 3T [4B][4T] | 1B 1T
# -- -- ++ ++ ++ -- -- ++ ++ ++ -- -- ++ ++
# -2 -1 | 00 +1 +2 +3 +4 +5 +6 +7 +8 +9 | 10 11
v1=SelectEvery(10,02,01,04,03,06,07,08,09).Weave()
v2=SelectEvery(10,00,01,04,03,06,05,08,09).Weave()
C=Merge(v1, v2)

##############################################################
# 3-2 pulldown ( 1f back shift )
# 4T 1B | [1T][1B][2T][2B] 3T [3B][3T][4B][4T] 1B | 1T 1B
# 4T [1B] | [1T] 1B [2T][2B][3T][3B] 3T [4B][4T] 1B | 1T 1B
# -- ++ ++ ++ -- -- ++ ++ ++ -- -- ++ ++ ++
# -2 -1 | 00 +1 +2 +3 +4 +5 +6 +7 +8 +9 | 10 11
v1=SelectEvery(10,01,00,03,02,05,06,07,08).Weave()
v2=SelectEvery(10,-1,00,03,02,05,04,07,08).Weave()
D=Merge(v1, v2)

##############################################################
# 3-2 pulldown ( 2f back shift )
#[1B][1T] | 1B [2T][2B][3T][3B] 3T [4B][4T] 1B 1T | 1B 1T
# 1B [1T] | [1B][2T][2B] 3T [3B][3T][4B][4T] 1B 1T | 1B 1T
# -2 -1 | 00 +1 +2 +3 +4 +5 +6 +7 +8 +9 | 10 11
v1=SelectEvery(10,-2,-1,02,01,04,03,06,07).Weave()
v2=SelectEvery(10,00,-1,02,01,04,05,06,07).Weave()
E=Merge(v1, v2)

return \
mode!=0 ? mode!=1 ? mode!=2 ? mode!=3 ? mode!=4 ? mode!=5 ? \
nop() : E : D : C : B : A : \
ShowFiveVersions( \
A.CombCheck().SubTitle("[2-3] (mode=1)",size=96), \
B.CombCheck().SubTitle("[2-3]-1 (mode=2)",size=96), \
C.CombCheck().SubTitle("[3-2] (mode=3)",size=96), \
D.CombCheck().SubTitle("[3-2]-1 (mode=4)",size=96), \
E.CombCheck().SubTitle("[3-2]-2 (mode=5)",size=96))
}



コーミング表示には、動作が軽い ささみしさんの CombCheck() 関数を使わせて頂きました m(__m

※Combcheckの記述ミスってたので訂正。入力クリップそのまま返してました。影響があるのはshow=1,2でノイズ量を目視確認するときだけなので、必要なければスルーでいいです。使うときは↓赤字で書いたclip=を書き足してやってください。FlexibleMergeに機能を追加exc - [default=0] 0 無効。以前と同じ。/1 NoiseExcludeを使う。ノイズの差がnmax以上の場合はclip1を返す。/2 NoiseExcludeを使う。ノイズの差がnma以上の場合
2つのソースからノイズの無い部分を選んでブレンドする (FlexibleMerge) その2






(C)2011 三雲岳斗・Gユウスケ・角川書店/ダンタリアンの書架製作委員会

今期放送中の TV アニメ「アブソリュート・デュオ」で
一人原画でぬるぬるキャラクターを動かしているという事で、物議を醸しだしている 江畑諒真 氏の OP ですが
8 話で更に細かいリテイクがかかっているようですので、端的に纏めました。

この手の作画修正というのは、実は他のアニメでも散見されます。
あまりにも細かいので話題には挙がらないですが、探してみるのも面白いです。




1843 - 1862 frame. 表情と足
1843_03-07.png
1843_08.png



1921 - 1934 frame. 表情
1921_03-07.png
1921_08.png



1937 - 1952 frame. 髪と下半身の動き
1937_03-07.png
1937_08.png



1956 - 1958 frame. 足の動き
1956_03-07.png
1956_08.png



1961 - 1963 frame. 髪と手足の動き
1961_03-07.png
1961_08.png



1967 - 1978 frame. 表情を含む体全体の動き
1967_03-07.png
1967_08.png



1987 - 1988 frame. 足の動きと体全体の位置
1987_03-07.png
1987_08.png



1992 frame. 手足と体全体
1992_03-07.png
1992_08.png



1996 frame. 足
1996_03-07.png
1996_08.png



2017 - 2022 frame. 髪とブレザーの裾
2017_03-07.png
2017_08.png



2026 - 2029 frame. 表情と襟とリボンと足の動き
2026_03-07.png
2026_08.png




©柊☆たくみ・株式会社KADOKAWA メディアファクトリー刊/アブソリュート・デュオ製作委員会

Tag:アニメ アブソリュート・デュオ 作画

複数のクリップを、差分を挟みながら並べて表示します。
mode で並べる方向を指定できます。

それだけ…。


1203_.jpg


StackDiff.png



function StackDiff(clip v01, clip v02, clip "v03", clip "v04", clip "v05", clip "v06", int "mode") {
v03=default(v03,BlankClip(v03,length=-1))
v04=default(v04,BlankClip(v04,length=-1))
v05=default(v05,BlankClip(v05,length=-1))
v06=default(v06,BlankClip(v06,length=-1))
mode=default(mode,0)
cnt=2
cnt=v03.FrameCount!=-1?cnt+1:cnt
cnt=v04.FrameCount!=-1?cnt+1:cnt
cnt=v05.FrameCount!=-1?cnt+1:cnt
cnt=v06.FrameCount!=-1?cnt+1:cnt
last=addClip(v01,Overlay(v01,v02,mode="Difference",pc_range=true),mode=mode).addClip(v02,mode=mode)
last=cnt>=03?addClip(last,Overlay(v02,v03,mode="Difference",pc_range=true),mode=mode).addClip(v03,mode=mode):last
last=cnt>=04?addClip(last,Overlay(v03,v04,mode="Difference",pc_range=true),mode=mode).addClip(v04,mode=mode):last
last=cnt>=05?addClip(last,Overlay(v04,v05,mode="Difference",pc_range=true),mode=mode).addClip(v05,mode=mode):last
last=cnt==06?addClip(last,Overlay(v05,v06,mode="Difference",pc_range=true),mode=mode).addClip(v06,mode=mode):last
return last
}

function addClip(clip a, clip b,int "mode") {
mode=default(mode,0)
Assert(mode==0||mode==1,"out of range. (int mode)'")
diff=mode==0? \
a.height!= b.height?a.height-b.height:0: \
a.width!= b.width?a.width-b.width:0
b=mode==0? \
diff!=0?b.AddBorders(0,0,0,diff):b: \
diff!=0?b.AddBorders(0,0,diff,0):b
return (mode==0?StackVertical(a,b).Crop(0,0,0,-diff):StackHorizontal(a,b).crop(0,0,-diff,0))
}





(C)2015 丸戸史明・深崎暮人・KADOKAWA 富士見書房/冴えない製作委員会

Tag:StackDiff AviSynth

昨日、Twitter で何気なく投稿したネタが予想外の反響でしたので、ちょっとだけパターン作ってみました。

テロップ2
http://blog-imgs-75.fc2.com/p/o/t/potatosub/2015030108283826d.png


720p に合わせてサイズ調整してあります。
PNG-24 形式で、透過処理もしてあるので素材としてどうぞ。

Tag:テロップ 素材



WHAT'S NEW?

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