Advertisement
sonkai

AutoBlockNR v1.0.1

Dec 30th, 2014
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #----------------------------------------------------------------------------------------------------------
  2. #
  3. # AutoBlockNR.avsi v1.0.1
  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. #  Masktools v2
  21. #
  22. # 改修履歴
  23. # 2014/12/30 v1.0.1
  24. #  CombCheckからテスト出力を除去
  25. #  フィールド選択時にcurrent_frameを使わないよう変更
  26. #  ノイズ判定にUプレーンだけでなくVプレーンの情報も追加
  27. #  ノイズ判定時の色差強調を外し、デフォルトのしきい値を12.0->9.0に変更
  28. #----------------------------------------------------------------------------------------------------------
  29.  
  30. #----------------------------------------
  31. # 関数サマリ
  32. #----------------------------------------
  33. #Function AutoBlockNR() : クリップを受け取り、ブロックノイズを低減して返す
  34. #Function AutoBlockNR_InterpolateByField() : 指定されたフレームを、片フィールド補間して返す
  35. #Function AutoBlockNR_Bob() : 片フィールド補間に使うBob化関数。本番用
  36. #Function AutoBlockNR_BobForTest() : 片フィールド補間に使うBob化関数。テスト用
  37. #Function Combcheck(clip c,bool "test",int "thY") : ノイズの強調表示関数。「にわとり遊び」のささみし様の関数を流用させて頂きました。
  38.  
  39. #----------------------------------------
  40. # AutoBlockNR
  41. #----------------------------------------
  42. # 処理:クリップを受け取り、ブロックノイズを低減して返す
  43. # 引数:
  44. # ・th_noise_diff フィールド間にどれだけノイズ差があったら補間を行うか。値が小さいほど補間フレームは多くなりますが、誤爆も多くなります。デフォルトは9.0
  45. # ・tff トップフィールドファーストならtrue・・・のつもり。BOB化して汚くなるようならfalseに設定してみてください。デフォルトはtrue
  46. # ・test テストモードならtrue。テストモードでは各種情報が表示されるほか、BOB化に軽量関数を使うのでプレビューが早くなります。デフォルトはfalse
  47. # 返し値:ブロックノイズを低減したクリップ
  48. Function AutoBlockNR(clip c,float "th_noise_diff",bool "tff",bool "test")
  49. {
  50.   # 各種グローバル関数。ScriptClipに渡すため
  51.   global g_autoblocknr_th_noise_diff=Default(th_noise_diff,9.0)
  52.   global g_autoblocknr_tff=Default(tff,true)
  53.   global g_autoblocknr_test=Default(test,false)
  54.  
  55.   # メイン処理
  56.   c.ScriptClip("""
  57.    src=last
  58.  
  59.    # 色差プレーンを表示し、CombCheck()でノイズの量を測定する
  60.    SeparateFields()
  61.    StackVertical(UToY(),VToY())
  62.    CombCheck()
  63.    noise_t=SelectEven().AverageLuma()
  64.    noise_b=SelectOdd().AverageLuma()
  65.    noise_diff=Abs(noise_t-noise_b)
  66.    
  67.    # フィールド間のノイズの差がしきい値を越えていたら片フィールド補間。越えていなければ素通し
  68.    src
  69.    (noise_diff<g_autoblocknr_th_noise_diff)
  70.    \? last
  71.    \: (noise_t > noise_b)
  72.      \? AutoBlockNR_InterpolateByField(current_frame,true,g_autoblocknr_tff,g_autoblocknr_test)
  73.      \: AutoBlockNR_InterpolateByField(current_frame,false,g_autoblocknr_tff,g_autoblocknr_test)
  74.  
  75.    # テストモード用の各種情報の用意
  76.    offset_x=10
  77.    offset_y=10
  78.    op=(noise_diff<g_autoblocknr_th_noise_diff)
  79.    \? "none"
  80.    \: (noise_t > noise_b)
  81.      \? "bottom field"
  82.      \: "top field"
  83.  
  84.    # テストモードでの各種情報の表示。色々表示したいが、載せるほど動作が重く・・・
  85.    (g_autoblocknr_test==true)
  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.    return last
  92.  """)
  93.  
  94.   return last
  95. }
  96.  
  97. #----------------------------------------
  98. # AutoBlockNR_InterpolateByField
  99. #----------------------------------------
  100. # 処理:指定されたフレームを、片フィールド補間して返す
  101. # 引数:
  102. # ・frame 処理したいフレーム番号
  103. # ・top トップフィールドが汚れているならtrue
  104. # ・tff トップフィールドファーストならtrue
  105. # ・test テストモードならtrue
  106. # 返し値: BOB化クリップ
  107. Function AutoBlockNR_InterpolateByField(clip c,int frame,bool top,bool tff,bool test)
  108. {
  109.   # トップフィールドとボトムフィールド、どちらをBob化するか判断。引数で指定されるのは汚れたフィールドであることに注意
  110.   offset=(tff==true)
  111.   \? (top==true) ? 1 : 0
  112.   \: (top==true) ? 0 : 1
  113.  
  114.   # フィールドのBOB化
  115.   c
  116.   bobed=(test==true)?AutoBlockNR_BobForTest():AutoBlockNR_Bob()
  117.   field=frame*2+offset
  118.   fixed=bobed.Trim(field,-1)
  119.   fixed=fixed.AssumeFPS(c.FrameRate)
  120.  
  121.   return fixed
  122. }
  123.  
  124. #----------------------------------------
  125. # AutoBlockNR_BobForTest
  126. #----------------------------------------
  127. # 処理:テストモード用のBOB化関数
  128. # 引数:
  129. # 返し値: BOB化フレーム
  130. Function AutoBlockNR_BobForTest(clip c)
  131. {
  132.   return c.Bob()
  133. }
  134.  
  135. #----------------------------------------
  136. # AutoBlockNR_Bob
  137. #----------------------------------------
  138. # 処理:本番用のBOB化関数
  139. # 引数:
  140. # 返し値: BOB化フレーム
  141. Function AutoBlockNR_Bob(clip c)
  142. {
  143.   c
  144.  
  145.   interp=nnedi3(field=-2)
  146.   mask=tmm(mode=1)
  147.   TDeint(mode=1, edeint=interp, emask=mask)
  148.  
  149.   #~ QTGMC(preset="Slow")
  150.  
  151.   return last
  152. }
  153.  
  154. #----------------------------------------
  155. # CombCheck
  156. #----------------------------------------
  157. # 処理:ノイズの強調表示関数。「にわとり遊び」のささみし様の関数を流用させて頂きました。
  158. Function Combcheck(clip c,int "thY")
  159. {
  160.   thY=Default(thY,16)
  161.  
  162.   c1=c.BlankClip(color=$000000)
  163.   c2=c.BlankClip(color=$FFFFFF)
  164.   mask1=c.CombMask(thY1=thY,thY2=thY)
  165.  
  166.   mt_merge(c1,c2,mask1,luma=true)
  167.  
  168.   return last
  169. }
  170.  
  171. #----------------------------------------
  172. # 以下作りかけ(判定結果をログ出力&ログから片フィールド補間。手作業で調整できるようにする)
  173. #----------------------------------------
  174. Function AutoBlockNR_LogNoise(clip c,string filename)
  175. {
  176.   CR=Chr(13)
  177.  
  178.   c
  179.   WriteFileStart(filename,""" "TYPE FLOAT" ""","CR",""" "DEFAULT 0" ""","CR")
  180.  
  181.   ScriptClip("""
  182.    src=last
  183.  
  184.    # 色差ノイズを強調表示し、CombCheck()でノイズの量を測定する
  185.    SeparateFields()
  186.    StackVertical(UToY(),VToY())
  187.    CombCheck()
  188.  
  189.    noise_t=Trim(current_frame*2,-1).AverageLuma()
  190.    noise_b=Trim(current_frame*2+1,-1).AverageLuma()
  191.    noise_diff=Abs(noise_t-noise_b)
  192.  
  193.    return src
  194. """)
  195.  
  196.   WriteFile(filename,"current_frame",""" " " ""","noise_diff")
  197.  
  198.   return last
  199. }
  200.  
  201. Function AutoBlockNR_Parse(clip c,string filename,float "th_noise_diff")
  202. {
  203.   CR=Chr(13)
  204.  
  205.   # 各種グローバル関数。ScriptClipに渡すため
  206.   global g_autoblocknr_th_noise_diff=Default(th_noise_diff,9.0)
  207.   global g_autoblocknr_filename=filename
  208.  
  209.   c
  210.   WriteFileStart(filename,""" "TYPE INT" ""","CR",""" "DEFAULT 0" ""","CR")
  211.  
  212.   # メイン処理
  213.   ScriptClip("""
  214.    SPACE=Chr(32)
  215.    BOB_BOTTOM="1"
  216.    BOB_TOP="2"
  217.  
  218.    src=last
  219.  
  220.    # 色差ノイズを強調表示し、CombCheck()でノイズの量を測定する
  221.    SeparateFields()
  222.    StackVertical(UToY(),VToY())
  223.    CombCheck()
  224.    noise_t=Trim(current_frame*2,-1).AverageLuma()
  225.    noise_b=Trim(current_frame*2+1,-1).AverageLuma()
  226.    noise_diff=Abs(noise_t-noise_b)
  227.    
  228.    return src
  229.  """)
  230.  
  231.   WriteFileIf(filename,"noise_diff>g_autoblocknr_th_noise_diff && noise_t > noise_b","current_frame",""" " " ""","BOB_BOTTOM")
  232.   WriteFileIf(filename,"noise_diff>g_autoblocknr_th_noise_diff && noise_t <= noise_b","current_frame","SPACE","BOB_TOP")
  233.  
  234.   return last
  235. }
  236.  
  237. Function AutoBlockNRByLog(clip c,string filename,bool "tff",bool "test")
  238. {
  239.   # 各種グローバル関数。ScriptClipに渡すため
  240.   global g_autoblocknr_tff=Default(tff,true)
  241.   global g_autoblocknr_test=Default(test,false)
  242.  
  243.   # メイン処理
  244.   c
  245.   ScriptClip("""
  246.    SubTitle(String(MyBobDirection))
  247.    
  248.    return last
  249.  """)
  250.  
  251.   ConditionalReader(filename,"MyBobDirection")
  252.  
  253.   return last
  254.  
  255.  
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement