Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #----------------------------------------------------------------------------------------------------------
- #
- # AutoBlockNR.avsi v1.1.0
- #
- # 概要:
- # フィールド単位の色差成分の情報を利用して、MPEG2のブロックノイズを低減する
- #
- # 説明:
- # MPEG2のブロックノイズはフィールド単位のノイズで、かつ色差成分に顕著に反映されるノイズのようです。
- # この特性を利用して、色差成分のノイズが少ないフィールドをBOB化することにより良好なソースを得られる可能性があります。
- #
- # 使い方:
- # サンプルを参照してください。
- #
- # 動作に必要なDLL:
- # TDeint.dll
- # nnedi3.dll
- # TMM.dll
- # Masktools
- #
- # 改修履歴
- # 2014/1/3 v1.1.0
- # 修正フレームリストの出力機能&フレームリストを読み込んで修正を行う機能の追加(AutoBlockNR_Parse・AutoBlockNRByFile)
- # 2014/12/31 v1.0.3
- # ノイズのログ出力機能の追加
- # 2014/12/31 v1.0.2
- # ノイズ判定時の色差強調を戻し、デフォルトのしきい値を9.0->12.0に変更
- # ScriptClip内の処理の削減
- # 2014/12/30 v1.0.1
- # CombCheckからテスト出力を除去
- # フィールド選択時にcurrent_frameを使わないよう変更
- # ノイズ判定にUプレーンだけでなくVプレーンの情報も追加
- # ノイズ判定時の色差強調を外し、デフォルトのしきい値を12.0->9.0に変更
- #----------------------------------------------------------------------------------------------------------
- #----------------------------------------
- # 関数サマリ
- #----------------------------------------
- #Function AutoBlockNR() : クリップを受け取り、ブロックノイズを低減して返す
- #Function AutoBlockNR_InterpolateByField() : トップ/ボトムのいずれかのBOB化クリップを返す
- #Function AutoBlockNR_Bob() : 片フィールド補間に使うBob化関数。本番用
- #Function AutoBlockNR_BobForTest() : 片フィールド補間に使うBob化関数。テスト用
- #Function AutoBlockNR_LogNoise() : ノイズをログファイルに出力する
- #Function AutoBlockNR_Parse() : フレームリストとノイズ値のログを出力する
- #Function AutoBlockNRByFile() : フレームリストを元に片フィールド補間を行う
- #Function Combcheck() : ノイズの強調表示関数。「にわとり遊び」のささみし様の関数を参考にさせて頂きました。
- #----------------------------------------
- # AutoBlockNR
- #----------------------------------------
- # 処理:クリップを受け取り、ブロックノイズを低減して返す
- # 引数:
- # ・th_noise_diff フィールド間にどれだけノイズ差があったら補間を行うか。値が小さいほど補間フレームは多くなりますが、誤爆も多くなります。デフォルトは12.0
- # ・tff トップフィールドファーストならtrue・・・のつもり。BOB化して汚くなるようならfalseに設定してみてください。デフォルトはtrue
- # ・test テストモードならtrue。テストモードでは各種情報が表示されるほか、BOB化に軽量関数を使うのでプレビューが早くなります。デフォルトはfalse
- # 返し値:ブロックノイズを低減したクリップ
- Function AutoBlockNR(clip c,float "th_noise_diff",bool "tff",bool "test")
- {
- # 初期値の設定
- global g_autoblocknr_th_noise_diff=Default(th_noise_diff,12.0)
- tff=Default(tff,true)
- test=Default(test,false)
- # あらかじめノイズを強調表示した色差プレーンを用意
- global g_autoblocknr_field_clip=c.SeparateFields().Tweak(sat=5.0)
- global g_autoblocknr_noised_clip=StackVertical(g_autoblocknr_field_clip.UToY(),g_autoblocknr_field_clip.VToY()).CombCheck()
- # フィールド間のノイズの差がしきい値を越えていたら片フィールド補間。越えていなければ素通し
- c
- fixed=ConditionalFilter(
- \AutoBlockNR_InterpolateByField(true,tff,test),
- \AutoBlockNR_InterpolateByField(false,tff,test),
- \"noise_t",">","noise_b")
- ConditionalFilter(fixed,last,"noise_diff",">","g_autoblocknr_th_noise_diff")
- # デバッグ情報の表示
- (test==true)?ScriptClip("""
- offset_x=10
- offset_y=10
- op=(noise_diff<g_autoblocknr_th_noise_diff)
- \? "none"
- \: (noise_t > noise_b)
- \? "bottom field"
- \: "top field"
- SubTitle("noise_diff "+String(noise_diff,"%.2f"),offset_x,offset_y+0,font="lucida console")
- SubTitle("bob "+op,offset_x,offset_y+25,font="lucida console")
- """):last
- # ノイズの判定。ScriptClipの処理は後ろから行われるため
- ScriptClip("""
- # ノイズの測定
- noise_t=g_autoblocknr_noised_clip.SelectEven().AverageLuma()
- noise_b=g_autoblocknr_noised_clip.SelectOdd().AverageLuma()
- noise_diff=Abs(noise_t-noise_b)
- return last
- """)
- return last
- }
- #----------------------------------------
- # AutoBlockNR_InterpolateByField
- #----------------------------------------
- # 処理:トップ/ボトムのいずれかのBOB化クリップを返す
- # 引数:
- # ・top トップフィールドが汚れているならtrue
- # ・tff トップフィールドファーストならtrue
- # ・test テストモードならtrue
- # 返し値: BOB化クリップ
- Function AutoBlockNR_InterpolateByField(clip c,bool top,bool tff,bool test)
- {
- # フィールドのBOB
- c
- (test==true)?AutoBlockNR_BobForTest():AutoBlockNR_Bob()
- # トップフィールドとボトムフィールド、どちらを返すか。引数で指定されるのは汚れたフィールドであることに注意
- bob_top=(tff==true)
- \? (top==true) ? false : true
- \: (top==true) ? true : false
- (bob_top==true)?SelectEven():SelectOdd()
- return last
- }
- #----------------------------------------
- # AutoBlockNR_BobForTest
- #----------------------------------------
- # 処理:テストモード用のBOB化関数
- # 引数:
- # 返し値: BOB化フレーム
- Function AutoBlockNR_BobForTest(clip c)
- {
- return c.Bob()
- }
- #----------------------------------------
- # AutoBlockNR_Bob
- #----------------------------------------
- # 処理:本番用のBOB化関数
- # 引数:
- # 返し値: BOB化フレーム
- Function AutoBlockNR_Bob(clip c)
- {
- c
- interp=nnedi3(field=-2)
- mask=tmm(mode=1)
- TDeint(mode=1, edeint=interp, emask=mask)
- return last
- }
- #----------------------------------------
- # AutoBlockNR_LogNoise
- #----------------------------------------
- # 処理:ノイズをログファイルに出力する
- # 引数: ログファイル名
- # 返し値: 渡されたクリップ
- Function AutoBlockNR_LogNoise(clip c,string noise_log)
- {
- # あらかじめノイズを強調表示した色差プレーンを用意
- global g_autoblocknr_field_clip=c.SeparateFields().Tweak(sat=5.0)
- global g_autoblocknr_noised_clip=StackVertical(g_autoblocknr_field_clip.UToY(),g_autoblocknr_field_clip.VToY()).CombCheck()
- c
- CR=Chr(13)
- WriteFileStart(noise_log,""" "TYPE FLOAT" ""","CR",""" "DEFAULT 0" ""","CR")
- WriteFile(noise_log,"current_frame","SPACE","noise_diff")
- # ノイズの判定。ScriptClipの処理は後ろから行われるため
- ScriptClip("""
- # 定数の宣言
- SPACE=Chr(32)
- # ノイズの測定
- noise_t=g_autoblocknr_noised_clip.SelectEven().AverageLuma()
- noise_b=g_autoblocknr_noised_clip.SelectOdd().AverageLuma()
- noise_diff=Abs(noise_t-noise_b)
- return last
- """)
- return last
- }
- #----------------------------------------
- # AutoBlockNR_Parse
- #----------------------------------------
- # 処理:フレームリストとノイズ値のログを出力する
- # 引数:
- # ・filename フレームリストのファイル名
- # ・th_noise_diff ノイズ差のしきい値。デフォルトは12.0
- # ・noise_log ファイル名を指定すると、そのファイルにノイズ値(noise_diff)を出力する
- # 返し値: 渡されたクリップ
- Function AutoBlockNR_Parse(clip c,string filename,float "th_noise_diff",string "noise_log")
- {
- # 初期値の設定
- global g_autoblocknr_th_noise_diff=Default(th_noise_diff,12.0)
- noise_log=Default(noise_log,"")
- use_noise_log=(noise_log!="")
- # あらかじめノイズを強調表示した色差プレーンを用意
- global g_autoblocknr_field_clip=c.SeparateFields().Tweak(sat=5.0)
- global g_autoblocknr_noised_clip=StackVertical(g_autoblocknr_field_clip.UToY(),g_autoblocknr_field_clip.VToY()).CombCheck()
- c
- CR=Chr(13)
- # もしnoise_log引数が指定されている場合、ノイズ値を出力
- (use_noise_log)?WriteFileStart(noise_log,""" "TYPE FLOAT" ""","CR",""" "DEFAULT 0" ""","CR"):last
- (use_noise_log)?WriteFile(noise_log,"current_frame","SPACE","noise_diff"):last
- # ノイズ値がしきい値を上回っていたらフレームリストに出力
- WriteFileStart(filename,
- \""" "TYPE INT" ""","CR",
- \""" "DEFAULT 0" ""","CR",
- \""" "# 1:top field is dirty" ""","CR",
- \""" "# 2:bottom field is dirty" ""","CR")
- WriteFileIf(filename,"noise_diff>g_autoblocknr_th_noise_diff && noise_t > noise_b","current_frame","SPACE","String(DIRTY_TOP)")
- WriteFileIf(filename,"noise_diff>g_autoblocknr_th_noise_diff && noise_t < noise_b","current_frame","SPACE","String(DIRTY_BOTTOM)")
- # ノイズの判定。ScriptClipの処理は後ろから行われるため
- ScriptClip("""
- SPACE=Chr(32)
- DIRTY_TOP=1
- DIRTY_BOTTOM=2
- # ノイズの測定
- noise_t=g_autoblocknr_noised_clip.SelectEven().AverageLuma()
- noise_b=g_autoblocknr_noised_clip.SelectOdd().AverageLuma()
- noise_diff=Abs(noise_t-noise_b)
- #SubTitle("noise_diff "+String(noise_diff,"%.2f"))
- return last
- """)
- return last
- }
- #----------------------------------------
- # AutoBlockNRByFile
- #----------------------------------------
- # 処理:フレームリストを元に片フィールド補間を行う
- # 引数:
- # ・filename フレームリストのファイル名
- # ・tff tffだったらtrueのつもり。デフォルトはtrue
- # ・test trueならテストモードで出力。テストモードでは各情報が表示される他、BOB化に軽量関数を使用する
- # 返し値: 片フィールド補間を行ったクリップ
- Function AutoBlockNRByFile(clip c,string filename,bool "tff",bool "test")
- {
- # 初期値の設定
- tff=Default(tff,true)
- test=Default(test,false)
- # あらかじめノイズを強調表示した色差プレーンを用意
- global g_autoblocknr_field_clip=c.SeparateFields().Tweak(sat=5.0)
- global g_autoblocknr_noised_clip=StackVertical(g_autoblocknr_field_clip.UToY(),g_autoblocknr_field_clip.VToY()).CombCheck()
- # フレームリストを元に片フィールド補間
- c
- ConditionalFilter(AutoBlockNR_InterpolateByField(true,tff,test),last,"MyDirection","=","DIRTY_TOP")
- ConditionalFilter(AutoBlockNR_InterpolateByField(false,tff,test),last,"MyDirection","=","DIRTY_BOTTOM")
- # デバッグ情報の表示
- (test==true)?ScriptClip("""
- offset_x=10
- offset_y=10
- op=(MyDirection==DIRTY_TOP)?"bottom field(log)":((MyDirection==DIRTY_BOTTOM)?"top field(log)":"none")
- SubTitle("noise_diff "+String(noise_diff,"%.2f"),offset_x,offset_y+0,font="lucida console")
- SubTitle("bob "+op,offset_x,offset_y+25,font="lucida console")
- """):last
- # ノイズの判定。ScriptClipの処理は後ろから行われるため
- ScriptClip("""
- DIRTY_TOP=1
- DIRTY_BOTTOM=2
- # ノイズの測定
- noise_t=g_autoblocknr_noised_clip.SelectEven().AverageLuma()
- noise_b=g_autoblocknr_noised_clip.SelectOdd().AverageLuma()
- noise_diff=Abs(noise_t-noise_b)
- return last
- """)
- # フレームリストの読み込み
- ConditionalReader(filename,"MyDirection")
- return last
- }
- #----------------------------------------
- # CombCheck
- #----------------------------------------
- # 処理:ノイズの強調表示関数。「にわとり遊び」のささみし様の関数を参考にさせて頂きました。
- Function Combcheck(clip c,int "thY")
- {
- thY=Default(thY,16)
- c1=c.BlankClip(color=$000000)
- c2=c.BlankClip(color=$FFFFFF)
- mask1=c.CombMask(thY1=thY,thY2=thY)
- mt_merge(c1,c2,mask1,luma=true)
- return last
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement