Advertisement
mawen1250

HQDering mod v0.8

Dec 29th, 2012
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Avisynth 11.84 KB | None | 0 0
  1. ######
  2. ###
  3. ### HQDering mod v0.8 by mawen1250
  4. ###
  5. ### Requirements: masktools v2.0a48, RemoveGrain + Repair v1.0pre, RemoveGrainHD v0.5, dfttest v1.9.2, dither v1.21.0
  6. ###
  7. ### Applies deringing by using a smart smoother near edges (where ringing occurs) only.
  8. ###
  9. ######
  10.  
  11. Function HQDeringmod(clip input, clip "smoothed", int "Y", int "U", int "V", int "mthr", int "mrad", int "nrmode", int "nrmodec", float "sigma", float "sigma2", int "sbsize", int "sosize", bool "sharp", int "drrep", bool "lsb_in", bool "lsb", int "dither", bool "show") {
  12.  
  13.  HD       = input.width >= 1280 || input.height >= 720 ? true : false
  14.  
  15.  Y        = Default(Y,      3       )
  16.  U        = Default(U,      2       )
  17.  V        = Default(V,      2       )
  18.  
  19.  mthr     = Default(mthr,   60      )   # threshold of edge mask, lower  value means more aggressive processing
  20.  mrad     = Default(mrad,   HD?3:2  )   # radius    of ring mask, higher value means more aggressive processing
  21.  
  22.  nrmode   = Default(nrmode, HD?2:1  )   # kernel of dering - 0: dfttest, 1: MinBlur(radius=1), 2: MinBlur(radius=2), 3: MinBlur(radius=3)
  23.  nrmodec  = Default(nrmodec,nrmode  )   # kernel of dering for chroma
  24.  sigma    = Default(sigma,  128.0   )   # dfttest: sigma for medium frequecies
  25.  sigma2   = Default(sigma2, sigma/16.0)   # dfttest: sigma for low&high frequecies
  26.  sbsize   = Default(sbsize, HD?8:6  )   # dfttest: length of the sides of the spatial window
  27.  sosize   = Default(sosize, HD?6:4  )   # dfttest: spatial overlap amount
  28.  sigma    = string (sigma           )
  29.  sigma2   = string (sigma2          )
  30.  
  31.  sharp    = Default(sharp,  false   )   # whether to use contra-sharpening to resharp deringed clip
  32.  drrep    = Default(drrep,  nrmode>0?lsb?13:24:0)   # use repair for details retention, recommended values are 24/23(only for lsb=false)/13/12/1
  33.  
  34.  lsb_in   = Default(lsb_in, false   )   # input  clip is 16-bit stacked or not
  35.  lsb      = Default(lsb,    false   )   # output clip is 16-bit stacked or not
  36.  dither   = Default(dither, 6       )   # dither mode for 8-bit output
  37.  
  38.  show     = Default(show,   false   )   # whether to output mask clip instead of filtered clip
  39.  
  40.  Y        = min(Y, 3)
  41.  U        = min(U, 3)
  42.  V        = min(V, 3)
  43.  Yt       = Y == 3
  44.  Ut       = U == 3
  45.  Vt       = V == 3
  46.  Y31      = Yt ? 3 : 1
  47.  U31      = Ut ? 3 : 1
  48.  V31      = Vt ? 3 : 1
  49.  
  50.  input8   = lsb_in ? input.DitherPost(mode=dither, Y=3, U=3, V=3) : input
  51.  input16  = lsb_in ? input                                        : input.Dither_convert_8_to_16()
  52.  
  53.  smoothc  = nrmodec <= 0 ? input.dfttest(Y=false, U=Ut, V=Vt, sbsize=sbsize, sosize=sosize, tbsize=1,
  54.  \                               sstring="0.0:"+sigma2+" 0.05:"+sigma+" 0.5:"+sigma+" 0.75:"+sigma2+" 1.0:0.0", lsb_in=lsb_in, lsb=lsb)
  55.  \                       : input.HQDeringmod_MinBlur(nrmodec, Y=1, U=U, V=V, lsb_in=lsb_in, lsb=lsb, dither=dither)
  56.  smoothed = Defined(smoothed) ? lsb_in ? lsb ? smoothed : smoothed.DitherPost(mode=dither) : lsb ? smoothed.Dither_convert_8_to_16() : smoothed : nrmode <= 0 ? input.dfttest(Y=Yt, U=(nrmode==nrmodec||!(Ut||Vt))?Ut:false, V=(nrmode==nrmodec||!(Ut||Vt))?Vt:false,
  57.  \                                      sbsize=sbsize, sosize=sosize, tbsize=1, lsb_in=lsb_in, lsb=lsb,
  58.  \                                      sstring="0.0:"+sigma2+" 0.05:"+sigma+" 0.5:"+sigma+" 0.75:"+sigma2+" 1.0:0.0")
  59.  \                      : input.HQDeringmod_MinBlur(nrmode, lsb_in=lsb_in, lsb=lsb, dither=dither,
  60.  \                                                  Y=Y, U=(nrmode==nrmodec||!(Ut||Vt))?U:1, V=(nrmode==nrmodec||!(Ut||Vt))?V:1)
  61.  smoothed = nrmode == nrmodec || !(Ut || Vt) ? smoothed : smoothed.MergeChroma(smoothc)
  62.  
  63.  pre           = lsb ? smoothed .Dither_removegrain16(Yt ? 4  : -1, Ut ? 4  : -1, Vt ? 4  : -1)
  64.  \                   : smoothed .         RemoveGrain(Yt ? 4  : -1, Ut ? 4  : -1, Vt ? 4  : -1)
  65.  method        = lsb ? pre      .Dither_removegrain16(Yt ? 11 : -1, Ut ? 11 : -1, Vt ? 11 : -1)
  66.  \                   : pre      .         RemoveGrain(Yt ? 11 : -1, Ut ? 11 : -1, Vt ? 11 : -1)
  67.  sharpdiff     = lsb ? pre      .Dither_sub16(method,   Y=Y31, U=U31, V=V31, dif=true)
  68.  \                   : pre      . mt_makediff(method,   Y=Y31, U=U31, V=V31)
  69.  allD          = lsb ? input16  .Dither_sub16(smoothed, Y=Y31, U=U31, V=V31, dif=true)
  70.  \                   : input8   . mt_makediff(smoothed, Y=Y31, U=U31, V=V31)
  71.  ssDD          = lsb ? sharpdiff.Dither_repair16(allD, Yt ? 1 : -1, Ut ? 1 : -1, Vt ? 1 : -1)
  72.  \                   : sharpdiff.         Repair(allD, Yt ? 1 : -1, Ut ? 1 : -1, Vt ? 1 : -1)
  73.  ssDD          = lsb ? ssDD     .HQDeringmod_limitdiff16(sharpdiff, Y=Y31, U=U31, V=V31)
  74.  \                   : ssDD     .mt_lutxy(sharpdiff, "x 128 - abs y 128 - abs <= x y ?", Y=Y31, U=U31, V=V31)
  75.  sclp          = !sharp ? smoothed :
  76.  \               lsb ? smoothed .Dither_add16(ssDD,     Y=Y31, U=U31, V=V31, dif=true)
  77.  \                   : smoothed .  mt_adddiff(ssDD,     Y=Y31, U=U31, V=V31)
  78.  
  79.  repclp        = drrep <= 0 ? sclp
  80.  \                          : lsb ? input16.Dither_repair16(sclp, Yt ? drrep : -1, Ut ? drrep : -1, Vt ? drrep : -1)
  81.  \                                : input8 .         Repair(sclp, Yt ? drrep : -1, Ut ? drrep : -1, Vt ? drrep : -1)
  82.  
  83.  prewittm      = input8.mt_edge("prewitt", mthr, 255, 0, 0, V=1, U=1)
  84.  fmask         = mt_hysteresis(prewittm.RemoveGrain(4, -1), prewittm, U=1, V=1)
  85.  omask         = mrad > 1 ? fmask.mt_expand(U=1, V=1) : fmask
  86.  omask         = mrad > 2 ? omask.mt_expand(U=1, V=1) : omask
  87.  omask         = mrad > 3 ? omask.mt_expand(U=1, V=1) : omask
  88.  omask         = mrad > 4 ? omask.mt_expand(U=1, V=1) : omask
  89.  imask         = fmask.mt_inflate(U=1, V=1).mt_inpand(U=1, V=1)
  90.  ringmaskl     = omask.mt_lutxy(imask, "x 255 y - * 255 /", U=1, V=1)
  91.  ringmask      = Ut || Vt ? ringmaskl.HQDeringmod_YtoYUV : ringmaskl
  92.  
  93.  return show ? ringmask
  94.  \           : lsb ? Dither_merge16_8(input16, repclp, ringmask, luma=false, Y=Y, U=U, V=V)
  95.  \                 : mt_merge        (input8,  repclp, ringmask, luma=false, Y=Y, U=U, V=V)
  96.  
  97. }
  98.  
  99.  
  100. Function HQDeringmod_MinBlur(clip clp, int "r", int "Y", int "U", int "V", bool "lsb_in", bool "lsb", int "dither", bool "hpmedian"){
  101.  
  102. r     = Default(r,    1)
  103. Y     = Default(Y,    3)
  104. U     = Default(U,    3)
  105. V     = Default(V,    3)
  106.  
  107. Y2    = (Y==2) ? 1  :  Y
  108. Y4    = (Y==3) ? 4  : -1
  109. Y11   = (Y==3) ? 11 : -1
  110. Y20   = (Y==3) ? 20 : -1
  111. Ym2   = (Y==3) ? 2  : Y==2 ? 0 : -1
  112. Ym3   = (Y==3) ? 3  : Y==2 ? 0 : -1
  113. U2    = (U==2) ? 1  :  U
  114. U4    = (U==3) ? 4  : -1
  115. U11   = (U==3) ? 11 : -1
  116. U20   = (U==3) ? 20 : -1
  117. Um2   = (U==3) ? 2  : U==2 ? 0 : -1
  118. Um3   = (U==3) ? 3  : U==2 ? 0 : -1
  119. V2    = (V==2) ? 1  :  V
  120. V4    = (V==3) ? 4  : -1
  121. V11   = (V==3) ? 11 : -1
  122. V20   = (V==3) ? 20 : -1
  123. Vm2   = (V==3) ? 2  : V==2 ? 0 : -1
  124. Vm3   = (V==3) ? 3  : V==2 ? 0 : -1
  125.  
  126. lsb_in   = Default(lsb_in,   false)
  127. lsb      = Default(lsb,      false)
  128. dither   = Default(dither,       6)
  129. hpmedian = Default(hpmedian, false)
  130.  
  131. clp8  = lsb_in ? clp.DitherPost(mode=dither, Y=3, U=3, V=3) : clp
  132. clp16 = lsb_in ? clp                                        : clp.Dither_convert_8_to_16()
  133.  
  134. RG11  = (r<=1) ? lsb ? clp16.Dither_removegrain16(Y11, U11, V11)
  135. \                    : clp8 .         RemoveGrain(Y11, U11, V11)
  136. \     : (r==2) ? lsb ? clp16.Dither_removegrain16(Y11, U11, V11).Dither_removegrain16(Y20, U20, V20)
  137. \                    : clp8 .         RemoveGrain(Y11, U11, V11).         RemoveGrain(Y20, U20, V20)
  138. \     :          lsb ? clp16.Dither_removegrain16(Y11, U11, V11).Dither_removegrain16(Y20, U20, V20).Dither_removegrain16(Y20, U20, V20)
  139. \                    : clp8 .         RemoveGrain(Y11, U11, V11).         RemoveGrain(Y20, U20, V20).         RemoveGrain(Y20, U20, V20)
  140.  
  141. RG4   = (r<=1) ? lsb_in&&lsb&&hpmedian ? clp16.Dither_removegrain16(Y4, U4, V4)          
  142. \                                      : clp8 .RemoveGrain(Y4, U4, V4)
  143. \     : (r==2) ? lsb_in&&lsb&&hpmedian ? clp16.Dither_median16(2, 2, 0, Y=Y2, U=U2, V=V2)
  144. \                                      : clp8 .Quantile(radius_y=Ym2, radius_u=Um2, radius_v=Vm2)
  145. \     :          lsb_in&&lsb&&hpmedian ? clp16.Dither_median16(3, 3, 0, Y=Y2, U=U2, V=V2)
  146. \                                      : clp8 .Quantile(radius_y=Ym3, radius_u=Um3, radius_v=Vm3)
  147. RG4   =        !lsb_in||!hpmedian&&lsb ? RG4  .Dither_convert_8_to_16() : RG4
  148.  
  149. RG11D = lsb ? Dither_sub16(clp16, RG11, Y=Y2, U=U2, V=V2, dif=true)
  150. \           :  mt_makediff(clp8,  RG11, Y=Y2, U=U2, V=V2)
  151. RG4D  = lsb ? Dither_sub16(clp16, RG4,  Y=Y2, U=U2, V=V2, dif=true)
  152. \           :  mt_makediff(clp8,  RG4,  Y=Y2, U=U2, V=V2)
  153.  
  154. DD    = lsb ? HQDeringmod_limitdiff16(RG11D, RG4D, Y=Y2, U=U2, V=V2)
  155. \           : mt_lutxy(RG11D, RG4D, "x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?", Y=Y2, U=U2, V=V2)
  156. end   = lsb ? clp16.Dither_sub16(DD, Y=Y2, U=U2, V=V2, dif=true)
  157. \           : clp8 . mt_makediff(DD, Y=Y2, U=U2, V=V2)
  158.  
  159. return end
  160. }
  161.  
  162.  
  163. Function HQDeringmod_limitdiff16(clip diff1, clip diff2, int "Y", int "U", int "V")
  164. {
  165. Y          = Default(Y,        3)
  166. U          = Default(U,        3)
  167. V          = Default(V,        3)
  168.  
  169. abdiff1    = Dither_lut16(diff1, "x 32768 - abs", Y=Y==3?3:1, U=U==3?3:1, V=V==3?3:1)
  170. abdiff2    = Dither_lut16(diff2, "x 32768 - abs", Y=Y==3?3:1, U=U==3?3:1, V=V==3?3:1)
  171. abdiffdiff = Dither_sub16(abdiff1, abdiff2, Y=Y==3?3:1, U=U==3?3:1, V=V==3?3:1, dif=true)
  172. bin        = Dither_lut16(abdiffdiff, "x 32768 <= 0 65535 ?", Y=Y==3?3:1, U=U==3?3:1, V=V==3?3:1)
  173.  
  174. return Dither_merge16(diff1, diff2, bin, luma=false, Y=Y, U=U, V=V)
  175. }
  176.  
  177.  
  178. Function HQDeringmod_YtoYUV(clip inputl, string "colorspace")
  179. {
  180.  sw          = inputl.width
  181.  sh          = inputl.height
  182.  wmod4       = (sw/4*4==sw) ? true : false
  183.  hmod4       = (sh/4*4==sh) ? true : false
  184.  
  185.  icolorspace = inputl.YtoYUV_GetCSP
  186.  ocolorspace = Defined(colorspace) ? colorspace : icolorspace
  187.  
  188.  try {
  189.    inputp = inputl.ConvertToY8
  190.    inputc = ocolorspace == "YV24" ? inputp
  191.    \      : ocolorspace == "YV16" ? inputp.BicubicResize(sw/2, sh  , -0.50)
  192.    \      :                         inputp.BicubicResize(sw/2, sh/2, -0.50)
  193.    
  194.    output = YtoUV(inputc, inputc, inputp)
  195.  
  196.  } catch ( error_msg ) {
  197.    inputp = wmod4&&hmod4 ? inputl : inputl.PointResize(wmod4?sw:sw+2, hmod4?sh:sh+2, 0, 0, wmod4?sw:sw+2, hmod4?sh:sh+2)
  198.    inputc = inputp.BicubicResize(sw/2, sh/2, -0.50)
  199.    
  200.    output = YtoUV(inputc, inputc, inputp)
  201.    output = wmod4&&hmod4 ? output : output.Crop(0, 0, wmod4?0:-2, hmod4?0:-2)
  202.  
  203.  }
  204.  
  205.  return output
  206.  
  207.  Function YtoYUV_GetCSP(clip c) {
  208.    return c.IsPlanar ? c.IsYV12 ? "YV12" :
  209.    \                   c.IsYV16 ? "YV16" :
  210.    \                   c.IsYV24 ? "YV24" : c.GetCSP_Y8_YV411 :
  211.    \      c.IsYUY2   ? "YUY2"   :
  212.    \      c.IsRGB32  ? "RGB32"  :
  213.    \      c.IsRGB24  ? "RGB24"  : "Unknown"
  214.  
  215.    Function GetCSP_Y8_YV411(clip c) {
  216.      try {
  217.        c.UtoY
  218.        csp = "YV411"
  219.      } catch ( error_msg ) {
  220.       csp = "Y8"
  221.      }
  222.      return csp
  223.    }
  224.  }
  225. }
  226.  
  227.  
  228. Function HQDeringmod_Spline36Resize(clip input, int "target_width", int "target_height", float "src_left", float "src_top", float "src_width", float "src_height", bool "chroma") {
  229.  
  230.  w             = input.width
  231.  h             = input.height
  232.  
  233.  target_width  = Default(target_width,      w)
  234.  target_height = Default(target_height,     h)
  235.  src_left      = Default(src_left,          0)
  236.  src_top       = Default(src_top,           0)
  237.  src_width     = Default(src_width,         w)
  238.  src_height    = Default(src_height,        h)
  239.  chroma        = Default(chroma,         true)
  240.  
  241.  try {
  242.    inputp = chroma ? input  : input .ConvertToY8
  243.    resize = inputp.Spline36Resize(target_width, target_height, src_left, src_top, src_width, src_height)
  244.    resize = chroma ? resize : resize.ConvertToYV12
  245.  } catch ( error_msg ) {
  246.    resize = input.Spline36Resize(target_width, target_height, src_left, src_top, src_width, src_height)
  247.  }
  248.  
  249.   return resize
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement