# FixChromaBleedingMod v1.2 Function FixChromaBleedingMod (clip input, int "Shift", float "thr", float "strength", bool "f", float "opacity") { Shift = default ( Shift, -4 ) thr = default ( thr, 4.0 ) stre = default ( strength, 0.8 ) f = default ( f, true ) opacity = default ( opacity, 1 ) # prepare to work on the V channel and reduce to speed up and filter noise areaf = input.tweak(sat=thr).VtoY.ReduceBy2 area = input.tweak(sat=thr).VtoY.Blur(1) # select and normalize both extremes of the scale red = f ? areaf.Levels(255,1.0,255,255,0) : area.Levels(255,1.0,255,255,0) blue = f ? areaf.Levels(0,1.0,0,0,255) : area.Levels(0,1.0,0,0,255) # merge both masks maskc = MergeLuma(red, blue, 0.5).Levels(250,1.0,250,255,0) # expand to cover beyond the bleeding areas and shift to compensate the resizing 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) # back to full size and binarize (also a trick to expand) maskc = maskc.BilinearResize(Width(input),Height(input)).Levels(10,1.0,10,0,255) # prepare a version of the image that has its chroma shifted and less saturated input_c = input.ChromaShift(C=Shift).tweak(sat=stre) # combine both images using the mask return input.overlay(input_c,mask=maskc,mode="blend",opacity=opacity) }