View difference between Paste ID: 1F6VPyxx and y3JfEFdf
SHOW: | | - or go back to the newest paste.
1-
# FixChromaBleedingMod v1.3
1+
# FixChromaBleedingMod v1.31
2
3
Function FixChromaBleedingMod (clip input, int "cxShift", int "cyShift", float "thr", float "strength", bool "f", float "opacity", bool "n", bool "xysh", bool "Bic") {
4
5
  xShift = default ( cxShift,       -4 )
6
  yShift = default ( cyShift,       -4 )
7
  thr	 = default ( thr,         4.0 )
8
  stre = default ( strength,      0.8 )
9
  f =  default ( f,       true )
10
  n =  default ( n,       false )
11
  sh =  default ( xysh,       false )
12
  Bic = default ( Bic,       false )
13
  opacity = default ( opacity,       1 )
14
15
  # prepare to work on the V channel and reduce to speed up and filter noise
16-
  areaf = input.tweak(sat=thr).VtoY.ReduceBy2
16+
  area = f ? input.tweak(sat=thr).VtoY.ConvertToyv12.ReduceBy2 : n ? input.tweak(sat=thr).VtoY.ConvertToyv12.Blur(1) : input.tweak(sat=thr).VtoY.ConvertToyv12
17-
  area = n ? input.tweak(sat=thr).VtoY.Blur(1) : input.tweak(sat=thr).VtoY
17+
18
  # select and normalize both extremes of the scale
19
  red = area.Levels(255,1.0,255,255,0)
20-
  red = f ? areaf.Levels(255,1.0,255,255,0) : area.Levels(255,1.0,255,255,0)
20+
  blue = area.Levels(0,1.0,0,0,255)
21-
  blue = f ? areaf.Levels(0,1.0,0,0,255) : area.Levels(0,1.0,0,0,255)
21+
22
  # merge both masks
23
  maskc = n ? MergeLuma(red, blue, 0.5).Levels(250,1.0,250,255,0) : f ?  MergeLuma(red, blue, 0.5).Levels(250,1.0,250,255,0) : MergeLuma(red, blue, 0.5).Blur(1).Levels(250,1.0,250,255,0)
24-
  maskc = n ? MergeLuma(red, blue, 0.5).Levels(250,1.0,250,255,0) : f ?  MergeLuma(red, blue, 0.5).Levels(250,1.0,250,255,0) : MergeLuma(red, blue, 0.5).Blur(1).Levels(250,1.0,250,255,0) 
24+
25
  # expand to cover beyond the bleeding areas and shift to compensate the resizing
26
   maskc = maskc.mt_edge("0 0 0 1 0 0 0 0 0", 0,255,0,255).mt_edge("1 1 1 1 1 1 0 0 0", 0,255,0,255)
27-
   maskc = IsPlanar(input) ? maskc.mt_edge("0 0 0 1 0 0 0 0 0", 0,255,0,255).mt_edge("1 1 1 1 1 1 0 0 0", 0,255,0,255) : maskc.ConvertToRGB32.GeneralConvolution(0,"0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0").ConvertToYV12
27+
28
  # back to full size and binarize (also a trick to expand)
29
  maskc = Bic ? maskc.BicubicResize(Width(input),Height(input)).Levels(10,1.0,10,0,255) : maskc.BilinearResize(Width(input),Height(input)).Levels(10,1.0,10,0,255)
30
31
  # prepare a version of the image that has its chroma shifted and less saturated
32
  input_c = sh ? input.ChromaShiftSP(x=xShift,y=yShift).tweak(sat=stre) : input.ChromaShift(C=xShift).tweak(sat=stre)
33
34
  # combine both images using the mask
35
  return input.overlay(input_c,mask=maskc,mode="blend",opacity=opacity)
36
}