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 | } |