Advertisement
sonkai

AutoBlockNR v1.1.0

Jan 3rd, 2015
316
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Avisynth 12.32 KB | None | 0 0
  1. #----------------------------------------------------------------------------------------------------------
  2. #
  3. # AutoBlockNR.avsi v1.1.0
  4. #
  5. # 概要:
  6. #  フィールド単位の色差成分の情報を利用して、MPEG2のブロックノイズを低減する
  7. #
  8. # 説明:
  9. #  MPEG2のブロックノイズはフィールド単位のノイズで、かつ色差成分に顕著に反映されるノイズのようです。
  10. #  この特性を利用して、色差成分のノイズが少ないフィールドをBOB化することにより良好なソースを得られる可能性があります。
  11. #
  12. # 使い方:
  13. #  サンプルを参照してください。
  14. #
  15. # 動作に必要なDLL:
  16. #  TDeint.dll
  17. #  nnedi3.dll
  18. #  TMM.dll
  19. #  Masktools
  20. #
  21. # 改修履歴
  22. # 2014/1/3 v1.1.0
  23. #  修正フレームリストの出力機能&フレームリストを読み込んで修正を行う機能の追加(AutoBlockNR_Parse・AutoBlockNRByFile)
  24. # 2014/12/31 v1.0.3
  25. #  ノイズのログ出力機能の追加
  26. # 2014/12/31 v1.0.2
  27. #  ノイズ判定時の色差強調を戻し、デフォルトのしきい値を9.0->12.0に変更
  28. #  ScriptClip内の処理の削減
  29. # 2014/12/30 v1.0.1
  30. #  CombCheckからテスト出力を除去
  31. #  フィールド選択時にcurrent_frameを使わないよう変更
  32. #  ノイズ判定にUプレーンだけでなくVプレーンの情報も追加
  33. #  ノイズ判定時の色差強調を外し、デフォルトのしきい値を12.0->9.0に変更
  34. #----------------------------------------------------------------------------------------------------------
  35.  
  36. #----------------------------------------
  37. # 関数サマリ
  38. #----------------------------------------
  39. #Function AutoBlockNR() : クリップを受け取り、ブロックノイズを低減して返す
  40. #Function AutoBlockNR_InterpolateByField() : トップ/ボトムのいずれかのBOB化クリップを返す
  41. #Function AutoBlockNR_Bob() : 片フィールド補間に使うBob化関数。本番用
  42. #Function AutoBlockNR_BobForTest() : 片フィールド補間に使うBob化関数。テスト用
  43. #Function AutoBlockNR_LogNoise() : ノイズをログファイルに出力する
  44. #Function AutoBlockNR_Parse() : フレームリストとノイズ値のログを出力する
  45. #Function AutoBlockNRByFile() : フレームリストを元に片フィールド補間を行う
  46. #Function Combcheck() : ノイズの強調表示関数。「にわとり遊び」のささみし様の関数を参考にさせて頂きました。
  47.  
  48. #----------------------------------------
  49. # AutoBlockNR
  50. #----------------------------------------
  51. # 処理:クリップを受け取り、ブロックノイズを低減して返す
  52. # 引数:
  53. # ・th_noise_diff フィールド間にどれだけノイズ差があったら補間を行うか。値が小さいほど補間フレームは多くなりますが、誤爆も多くなります。デフォルトは12.0
  54. # ・tff トップフィールドファーストならtrue・・・のつもり。BOB化して汚くなるようならfalseに設定してみてください。デフォルトはtrue
  55. # ・test テストモードならtrue。テストモードでは各種情報が表示されるほか、BOB化に軽量関数を使うのでプレビューが早くなります。デフォルトはfalse
  56. # 返し値:ブロックノイズを低減したクリップ
  57. Function AutoBlockNR(clip c,float "th_noise_diff",bool "tff",bool "test")
  58. {
  59.   # 初期値の設定
  60.   global g_autoblocknr_th_noise_diff=Default(th_noise_diff,12.0)
  61.   tff=Default(tff,true)
  62.   test=Default(test,false)
  63.  
  64.   # あらかじめノイズを強調表示した色差プレーンを用意
  65.   global g_autoblocknr_field_clip=c.SeparateFields().Tweak(sat=5.0)
  66.   global g_autoblocknr_noised_clip=StackVertical(g_autoblocknr_field_clip.UToY(),g_autoblocknr_field_clip.VToY()).CombCheck()
  67.  
  68.   # フィールド間のノイズの差がしきい値を越えていたら片フィールド補間。越えていなければ素通し
  69.   c
  70.   fixed=ConditionalFilter(
  71.     \AutoBlockNR_InterpolateByField(true,tff,test),
  72.     \AutoBlockNR_InterpolateByField(false,tff,test),
  73.     \"noise_t",">","noise_b")
  74.   ConditionalFilter(fixed,last,"noise_diff",">","g_autoblocknr_th_noise_diff")
  75.  
  76.   # デバッグ情報の表示
  77.   (test==true)?ScriptClip("""
  78.    offset_x=10
  79.    offset_y=10
  80.  
  81.    op=(noise_diff<g_autoblocknr_th_noise_diff)
  82.    \? "none"
  83.    \: (noise_t > noise_b)
  84.      \? "bottom field"
  85.      \: "top field"
  86.  
  87.    SubTitle("noise_diff "+String(noise_diff,"%.2f"),offset_x,offset_y+0,font="lucida console")
  88.    SubTitle("bob        "+op,offset_x,offset_y+25,font="lucida console")
  89.  """):last
  90.  
  91.   # ノイズの判定。ScriptClipの処理は後ろから行われるため
  92.   ScriptClip("""
  93.    # ノイズの測定
  94.    noise_t=g_autoblocknr_noised_clip.SelectEven().AverageLuma()
  95.    noise_b=g_autoblocknr_noised_clip.SelectOdd().AverageLuma()
  96.    noise_diff=Abs(noise_t-noise_b)
  97.  
  98.    return last
  99.  """)
  100.  
  101.   return last
  102. }
  103.  
  104. #----------------------------------------
  105. # AutoBlockNR_InterpolateByField
  106. #----------------------------------------
  107. # 処理:トップ/ボトムのいずれかのBOB化クリップを返す
  108. # 引数:
  109. # ・top トップフィールドが汚れているならtrue
  110. # ・tff トップフィールドファーストならtrue
  111. # ・test テストモードならtrue
  112. # 返し値: BOB化クリップ
  113. Function AutoBlockNR_InterpolateByField(clip c,bool top,bool tff,bool test)
  114. {
  115.   # フィールドのBOB
  116.   c
  117.   (test==true)?AutoBlockNR_BobForTest():AutoBlockNR_Bob()
  118.  
  119.   # トップフィールドとボトムフィールド、どちらを返すか。引数で指定されるのは汚れたフィールドであることに注意
  120.   bob_top=(tff==true)
  121.   \? (top==true) ? false : true
  122.   \: (top==true) ? true : false
  123.  
  124.   (bob_top==true)?SelectEven():SelectOdd()
  125.  
  126.   return last
  127. }
  128.  
  129. #----------------------------------------
  130. # AutoBlockNR_BobForTest
  131. #----------------------------------------
  132. # 処理:テストモード用のBOB化関数
  133. # 引数:
  134. # 返し値: BOB化フレーム
  135. Function AutoBlockNR_BobForTest(clip c)
  136. {
  137.   return c.Bob()
  138. }
  139.  
  140. #----------------------------------------
  141. # AutoBlockNR_Bob
  142. #----------------------------------------
  143. # 処理:本番用のBOB化関数
  144. # 引数:
  145. # 返し値: BOB化フレーム
  146. Function AutoBlockNR_Bob(clip c)
  147. {
  148.   c
  149.  
  150.   interp=nnedi3(field=-2)
  151.   mask=tmm(mode=1)
  152.   TDeint(mode=1, edeint=interp, emask=mask)
  153.  
  154.   return last
  155. }
  156.  
  157. #----------------------------------------
  158. # AutoBlockNR_LogNoise
  159. #----------------------------------------
  160. # 処理:ノイズをログファイルに出力する
  161. # 引数: ログファイル名
  162. # 返し値: 渡されたクリップ
  163. Function AutoBlockNR_LogNoise(clip c,string noise_log)
  164. {
  165.   # あらかじめノイズを強調表示した色差プレーンを用意
  166.   global g_autoblocknr_field_clip=c.SeparateFields().Tweak(sat=5.0)
  167.   global g_autoblocknr_noised_clip=StackVertical(g_autoblocknr_field_clip.UToY(),g_autoblocknr_field_clip.VToY()).CombCheck()
  168.  
  169.   c
  170.   CR=Chr(13)
  171.   WriteFileStart(noise_log,""" "TYPE FLOAT" ""","CR",""" "DEFAULT 0" ""","CR")
  172.   WriteFile(noise_log,"current_frame","SPACE","noise_diff")
  173.  
  174.   # ノイズの判定。ScriptClipの処理は後ろから行われるため
  175.   ScriptClip("""
  176.    # 定数の宣言
  177.    SPACE=Chr(32)
  178.  
  179.    # ノイズの測定
  180.    noise_t=g_autoblocknr_noised_clip.SelectEven().AverageLuma()
  181.    noise_b=g_autoblocknr_noised_clip.SelectOdd().AverageLuma()
  182.    noise_diff=Abs(noise_t-noise_b)
  183.  
  184.    return last
  185.  """)
  186.  
  187.   return last
  188. }
  189.  
  190. #----------------------------------------
  191. # AutoBlockNR_Parse
  192. #----------------------------------------
  193. # 処理:フレームリストとノイズ値のログを出力する
  194. # 引数:
  195. #  ・filename フレームリストのファイル名
  196. #  ・th_noise_diff ノイズ差のしきい値。デフォルトは12.0
  197. #  ・noise_log ファイル名を指定すると、そのファイルにノイズ値(noise_diff)を出力する
  198. # 返し値: 渡されたクリップ
  199.  
  200. Function AutoBlockNR_Parse(clip c,string filename,float "th_noise_diff",string "noise_log")
  201. {
  202.   # 初期値の設定
  203.   global g_autoblocknr_th_noise_diff=Default(th_noise_diff,12.0)
  204.   noise_log=Default(noise_log,"")
  205.   use_noise_log=(noise_log!="")
  206.  
  207.   # あらかじめノイズを強調表示した色差プレーンを用意
  208.   global g_autoblocknr_field_clip=c.SeparateFields().Tweak(sat=5.0)
  209.   global g_autoblocknr_noised_clip=StackVertical(g_autoblocknr_field_clip.UToY(),g_autoblocknr_field_clip.VToY()).CombCheck()
  210.  
  211.   c
  212.   CR=Chr(13)
  213.  
  214.   # もしnoise_log引数が指定されている場合、ノイズ値を出力
  215.   (use_noise_log)?WriteFileStart(noise_log,""" "TYPE FLOAT" ""","CR",""" "DEFAULT 0" ""","CR"):last
  216.   (use_noise_log)?WriteFile(noise_log,"current_frame","SPACE","noise_diff"):last
  217.  
  218.   # ノイズ値がしきい値を上回っていたらフレームリストに出力
  219.   WriteFileStart(filename,
  220.     \""" "TYPE INT" ""","CR",
  221.     \""" "DEFAULT 0" ""","CR",
  222.     \""" "# 1:top field is dirty" ""","CR",
  223.     \""" "# 2:bottom field is dirty" ""","CR")
  224.   WriteFileIf(filename,"noise_diff>g_autoblocknr_th_noise_diff && noise_t > noise_b","current_frame","SPACE","String(DIRTY_TOP)")
  225.   WriteFileIf(filename,"noise_diff>g_autoblocknr_th_noise_diff && noise_t < noise_b","current_frame","SPACE","String(DIRTY_BOTTOM)")
  226.  
  227.   # ノイズの判定。ScriptClipの処理は後ろから行われるため
  228.   ScriptClip("""
  229.  
  230.    SPACE=Chr(32)
  231.    DIRTY_TOP=1
  232.    DIRTY_BOTTOM=2
  233.    
  234.    # ノイズの測定
  235.    noise_t=g_autoblocknr_noised_clip.SelectEven().AverageLuma()
  236.    noise_b=g_autoblocknr_noised_clip.SelectOdd().AverageLuma()
  237.    noise_diff=Abs(noise_t-noise_b)
  238.    
  239.    #SubTitle("noise_diff "+String(noise_diff,"%.2f"))
  240.    
  241.    return last
  242.  """)
  243.  
  244.   return last
  245. }
  246.  
  247. #----------------------------------------
  248. # AutoBlockNRByFile
  249. #----------------------------------------
  250. # 処理:フレームリストを元に片フィールド補間を行う
  251. # 引数:
  252. #  ・filename フレームリストのファイル名
  253. #  ・tff tffだったらtrueのつもり。デフォルトはtrue
  254. #  ・test trueならテストモードで出力。テストモードでは各情報が表示される他、BOB化に軽量関数を使用する
  255. # 返し値: 片フィールド補間を行ったクリップ
  256. Function AutoBlockNRByFile(clip c,string filename,bool "tff",bool "test")
  257. {
  258.   # 初期値の設定
  259.   tff=Default(tff,true)
  260.   test=Default(test,false)
  261.  
  262.   # あらかじめノイズを強調表示した色差プレーンを用意
  263.   global g_autoblocknr_field_clip=c.SeparateFields().Tweak(sat=5.0)
  264.   global g_autoblocknr_noised_clip=StackVertical(g_autoblocknr_field_clip.UToY(),g_autoblocknr_field_clip.VToY()).CombCheck()
  265.  
  266.   # フレームリストを元に片フィールド補間
  267.   c
  268.   ConditionalFilter(AutoBlockNR_InterpolateByField(true,tff,test),last,"MyDirection","=","DIRTY_TOP")
  269.   ConditionalFilter(AutoBlockNR_InterpolateByField(false,tff,test),last,"MyDirection","=","DIRTY_BOTTOM")
  270.  
  271.   # デバッグ情報の表示
  272.   (test==true)?ScriptClip("""
  273.    offset_x=10
  274.    offset_y=10
  275.  
  276.    op=(MyDirection==DIRTY_TOP)?"bottom field(log)":((MyDirection==DIRTY_BOTTOM)?"top field(log)":"none")
  277.  
  278.    SubTitle("noise_diff "+String(noise_diff,"%.2f"),offset_x,offset_y+0,font="lucida console")
  279.    SubTitle("bob        "+op,offset_x,offset_y+25,font="lucida console")
  280.  """):last
  281.  
  282.   # ノイズの判定。ScriptClipの処理は後ろから行われるため
  283.   ScriptClip("""
  284.  
  285.    DIRTY_TOP=1
  286.    DIRTY_BOTTOM=2
  287.  
  288.    # ノイズの測定
  289.    noise_t=g_autoblocknr_noised_clip.SelectEven().AverageLuma()
  290.    noise_b=g_autoblocknr_noised_clip.SelectOdd().AverageLuma()
  291.    noise_diff=Abs(noise_t-noise_b)
  292.  
  293.    return last
  294.  """)
  295.  
  296.   # フレームリストの読み込み
  297.   ConditionalReader(filename,"MyDirection")
  298.  
  299.   return last
  300. }
  301.  
  302. #----------------------------------------
  303. # CombCheck
  304. #----------------------------------------
  305. # 処理:ノイズの強調表示関数。「にわとり遊び」のささみし様の関数を参考にさせて頂きました。
  306. Function Combcheck(clip c,int "thY")
  307. {
  308.   thY=Default(thY,16)
  309.  
  310.   c1=c.BlankClip(color=$000000)
  311.   c2=c.BlankClip(color=$FFFFFF)
  312.   mask1=c.CombMask(thY1=thY,thY2=thY)
  313.  
  314.   mt_merge(c1,c2,mask1,luma=true)
  315.  
  316.   return last
  317. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement