Skip to content

Instantly share code, notes, and snippets.

@4re
Last active September 14, 2019 02:24
Show Gist options
  • Select an option

  • Save 4re/bba3f65469acfe0ec08a to your computer and use it in GitHub Desktop.

Select an option

Save 4re/bba3f65469acfe0ec08a to your computer and use it in GitHub Desktop.

Revisions

  1. 4re revised this gist Sep 4, 2015. 1 changed file with 7 additions and 19 deletions.
    26 changes: 7 additions & 19 deletions vshelpers.py
    Original file line number Diff line number Diff line change
    @@ -5,8 +5,8 @@ def clamp(minimum, x, maximum):
    return int(max(minimum, min(round(x), maximum)))


    def m4(x):
    return 16 if x < 16 else int(round(x / 4.0) * 4)
    def m4(x, m=4.0):
    return 16 if x < 16 else int(round(x / m) * m)


    def build_mask(c, edgelvl=40, mode=0):
    @@ -78,19 +78,7 @@ def get_luma(c):

    def merge_chroma(c1, c2):
    core = vs.get_core()
    return core.std.ShufflePlanes(clips=[c1, c2], planes=[0, 1, 2], colorfamily=vs.YUV)


    def invert(src, planes=[0, 1, 2]):
    core = vs.get_core()

    max_ = (2 ** src.format.bits_per_sample) - 1

    expr = '{} x -'.format(max_)
    expr = [expr if 0 in planes else '', expr if 1 in planes else '', expr if 2 in planes else '']
    inv = core.std.Expr(clips=[src], expr=expr)

    return inv
    return core.std.ShufflePlanes(clips=[c1, c2], planes=[0, 1, 2], colorfamily=c2.format.color_family)


    def rsoften(clip, radius=5, kernel='bicubic', bits=None):
    @@ -205,15 +193,15 @@ def starmask(src, mode=1):
    clean = core.rgvs.RemoveGrain(clip, 17)
    diff = core.std.MakeDiff(clip, clean)
    final = core.std.ShufflePlanes(diff, 0, vs.GRAY).resize.Bicubic(format=vs.YUV420P8)
    final = core.generic.Levels(final, 40, 168, 0.350, 0, 255)
    final = core.std.Levels(final, 40, 168, 0.350, 0, 255)
    final = core.rgvs.RemoveGrain(final, [7, 0])
    final = core.generic.Prewitt(clip=final, min=4, max=16)
    final = core.std.Prewitt(clip=final, min=4, max=16)
    else:
    clean = core.rgvs.RemoveGrain(core.rgvs.Repair(core.avs.deen(src, 'a3d', 4, 12, 0), src, 15), 21)
    coord = [int(s) for s in core.avs.mt_circle(1).split(' ')]
    pmask = core.avs.mt_edge(src, 'roberts', 0, 2, 0, 2).generic.Maximum(coordinates=coord).generic.Invert()
    pmask = core.avs.mt_edge(src, 'roberts', 0, 2, 0, 2).std.Maximum(coordinates=coord).std.Invert()
    fmask = core.std.MaskedMerge(clean, src, pmask)
    subt = subtract(fmask, src)
    final = core.generic.Deflate(core.avs.mt_edge(subt, 'roberts', 0, 0, 0, 0))
    final = core.std.Deflate(core.avs.mt_edge(subt, 'roberts', 0, 0, 0, 0))

    return final
  2. 4re created this gist May 15, 2015.
    219 changes: 219 additions & 0 deletions vshelpers.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,219 @@
    import vapoursynth as vs


    def clamp(minimum, x, maximum):
    return int(max(minimum, min(round(x), maximum)))


    def m4(x):
    return 16 if x < 16 else int(round(x / 4.0) * 4)


    def build_mask(c, edgelvl=40, mode=0):
    core = vs.get_core()

    if mode < 0 or mode > 1:
    raise ValueError('mode should be an int between 1 and 3.')

    edgelvl = edgelvl << c.format.bits_per_sample-8

    if c.format.id != vs.GRAY:
    c = core.std.ShufflePlanes(clips=c, planes=[0], colorfamily=vs.GRAY)

    if mode == 0:
    m = core.std.Prewitt(c, edgelvl, edgelvl)
    m = core.std.Maximum(m)
    elif mode == 1:
    m = core.std.Convolution(clip=c, matrix=[1, 2, 1, 0, 0, 0, -1, -2, -1])
    m = core.std.Binarize(m)
    m = core.std.Maximum(m)

    return m


    def mt_lut(c1, expr, planes=[0]):
    core = vs.get_core()
    max_ = 2 ** c1.format.bits_per_sample - 1
    lut_range = range(max_ + 1)
    lut = [clamp(0, expr(x), max_) for x in lut_range]
    return core.std.Lut(clip=c1, lut=lut, planes=planes)


    def mt_lutxy(c1, c2, expr, planes=[0]):
    core = vs.get_core()
    max_ = 2 ** c1.format.bits_per_sample - 1
    lut_range = range(max_ + 1)
    lut = []
    for y in lut_range:
    for x in lut_range:
    lut.append(clamp(0, expr(x, y), max_))
    return core.std.Lut2(c1, c2, lut=lut, planes=planes)


    def logic(c1, c2, mode, th1=0, th2=0, planes=[0]):
    core = vs.get_core()
    mode = mode.lower()
    if mode == 'and':
    expr = 'x y and'
    elif mode == 'andn':
    expr = 'x y not and'
    elif mode == 'or':
    expr = 'x y or'
    elif mode == 'xor':
    expr = 'x y xor'
    elif mode == 'min':
    expr = 'x {th1} + y {th2} + min'.format(th1=th1, th2=th2)
    elif mode == 'max':
    expr = 'x {th1} + y {th2} + max'.format(th1=th1, th2=th2)
    else:
    raise ValueError('"{}" is not a valid mode for logic (and, andn, or, xor, min, max)'.format(mode))
    expr = [expr if 0 in planes else '', expr if 1 in planes else '', expr if 2 in planes else '']
    return core.std.Expr([c1, c2], expr=expr)


    def get_luma(c):
    core = vs.get_core()
    return core.std.ShufflePlanes(clips=c, planes=[0], colorfamily=vs.GRAY)


    def merge_chroma(c1, c2):
    core = vs.get_core()
    return core.std.ShufflePlanes(clips=[c1, c2], planes=[0, 1, 2], colorfamily=vs.YUV)


    def invert(src, planes=[0, 1, 2]):
    core = vs.get_core()

    max_ = (2 ** src.format.bits_per_sample) - 1

    expr = '{} x -'.format(max_)
    expr = [expr if 0 in planes else '', expr if 1 in planes else '', expr if 2 in planes else '']
    inv = core.std.Expr(clips=[src], expr=expr)

    return inv


    def rsoften(clip, radius=5, kernel='bicubic', bits=None):
    core = vs.get_core()

    blur = core.fmtc.resample(clip, m4(clip.width//radius), m4(clip.height//radius), kernel=kernel)
    blur = core.fmtc.resample(clip, clip.width, clip.height, kernel=kernel)

    if blur.format.bits_per_sample != clip.format.bits_per_sample or bits is not None:
    blur = core.fmtc.bitdepth(blur, bits=clip.format.bits_per_sample)

    return blur


    def fit(clipa, clipb):
    core = vs.get_core()

    bd = clipb.format.bits_per_sample
    max_ = 2 ** bd - 1
    mid = (max_ + 1) // 2

    if clipb.format.num_planes > 1:
    if clipb.format.color_family == vs.RGB:
    color = [max_, max_, max_]
    else:
    color = [max_, mid, mid]
    else:
    color = [max_]

    if clipa.width > clipb.width:
    clipb = core.std.AddBorders(clip=clipb, left=0, right=clipa.width - clipb.width, color=color)
    elif clipa.width < clipb.width:
    clipb = core.std.CropRel(clip=clipb, left=0, right=clipb.width - clipa.width)

    if clipa.height > clipb.height:
    clipb = core.std.AddBorders(clip=clipb, top=0, bottom=clipa.height - clipb.height, color=color)
    elif clipa.height < clipb.height:
    clipb = core.std.CropRel(clip=clipb, top=0, bottom=clipb.height - clipa.height)

    return clipb


    def move(clips, x, y):
    core = vs.get_core()

    moved = None

    for clip in clips:
    if clip.format.num_planes == 1:
    color = [(2 ** clip.format.bits_per_sample) - 1]
    else:
    color = None

    if x != 0 or y != 0:
    if x >= 0:
    right = 0
    left = x
    else:
    right = abs(x)
    left = 0
    if y >= 0:
    top = 0
    bottom = y
    else:
    top = abs(y)
    bottom = 0

    clip = core.std.AddBorders(clip=clip, left=left, right=right, top=top, bottom=bottom, color=color)
    clip = core.std.CropRel(clip=clip, left=right, right=left, top=bottom, bottom=top)

    if clip is isinstance(list()):
    moved.append(clip)
    else:
    moved = clip

    return moved


    def get_decoder():
    core = vs.get_core()

    try:
    core.lsmas
    except NameError:
    try:
    core.ffms2
    except NameError:
    raise NameError('No suitable source filter was found, please, install either ffms2 or lsmas.')
    else:
    vsource = core.ffms2.Source
    else:
    vsource = core.lsmas.LWLibavSource

    return vsource


    def subtract(c1, c2, luma=126, planes=[0]):
    core = vs.get_core()

    expr = ('{luma} x + y -').format(luma=luma)
    expr = [(i in planes) * expr for i in range(c1.format.num_planes)]

    return core.std.Expr([c1, c2], expr)


    def starmask(src, mode=1):
    core = vs.get_core()

    clip = get_luma(src)

    if mode == 1:
    clean = core.rgvs.RemoveGrain(clip, 17)
    diff = core.std.MakeDiff(clip, clean)
    final = core.std.ShufflePlanes(diff, 0, vs.GRAY).resize.Bicubic(format=vs.YUV420P8)
    final = core.generic.Levels(final, 40, 168, 0.350, 0, 255)
    final = core.rgvs.RemoveGrain(final, [7, 0])
    final = core.generic.Prewitt(clip=final, min=4, max=16)
    else:
    clean = core.rgvs.RemoveGrain(core.rgvs.Repair(core.avs.deen(src, 'a3d', 4, 12, 0), src, 15), 21)
    coord = [int(s) for s in core.avs.mt_circle(1).split(' ')]
    pmask = core.avs.mt_edge(src, 'roberts', 0, 2, 0, 2).generic.Maximum(coordinates=coord).generic.Invert()
    fmask = core.std.MaskedMerge(clean, src, pmask)
    subt = subtract(fmask, src)
    final = core.generic.Deflate(core.avs.mt_edge(subt, 'roberts', 0, 0, 0, 0))

    return final