예제 #1
0
def morpho_mask(clip: vs.VideoNode):
    # y, u, v = split(clip)
    y = get_y(clip)
    # stats = y.std.PlaneStats()
    # agm3 = core.adg.Mask(stats, 3)
    # agm6 = core.adg.Mask(stats, 6)

    ymax = maxm(y, sw=40, mode='ellipse')
    ymin = minm(y, sw=40, mode='ellipse')
    # umax = maxm(u, sw=16, mode='ellipse')
    # umin = minm(u, sw=16, mode='ellipse')
    # vmax = maxm(v, sw=12, mode='ellipse')
    # vmin = minm(v, sw=12, mode='ellipse')

    thr = 3.2 * 256
    ypw0 = y.std.Prewitt()
    ypw = ypw0.std.Binarize(thr).rgvs.RemoveGrain(11)

    rad = 3
    thr = 2.5 * 256
    yrangesml = core.std.Expr([ymax[3], ymin[3]], 'x y - abs')
    yrangesml = yrangesml.std.Binarize(thr).std.BoxBlur(0, 2, 1, 2, 1)

    rad = 16
    thr = 4 * 256
    yrangebig0 = core.std.Expr([ymax[rad], ymin[rad]], 'x y - abs')
    yrangebig = yrangebig0.std.Binarize(thr)
    yrangebig = minm(yrangebig,
                     sw=rad * 3 // 4,
                     threshold=65536 // ((rad * 3 // 4) + 1),
                     mode='ellipse')[-1]
    yrangebig = yrangebig.std.BoxBlur(0, rad // 4, 1, rad // 4, 1)

    rad = 30
    thr = 1 * 256
    ymph = core.std.Expr([
        y,
        maxm(ymin[rad], sw=rad, mode='ellipse')[rad],
        minm(ymax[rad], sw=rad, mode='ellipse')[rad]
    ], 'x y - z x - max')
    ymph = ymph.std.Binarize(384)
    ymph = ymph.std.Minimum().std.Maximum()
    ymph = ymph.std.BoxBlur(0, 4, 1, 4, 1)

    grad_mask = zzf.combine([ymph, yrangesml, ypw])
    # grain_mask = core.std.Expr([yrangebig, grad_mask, ypw0.std.Binarize(2000).std.Maximum().std.Maximum()], '65535 y - x min z -').std.BoxBlur(0,16,1,16,1)

    return grad_mask, yrangebig
예제 #2
0
def zzdeband(clip: vs.VideoNode,
             denoised: bool = False,
             mask: int = 0,
             f3kdb_args: Dict[str, Any] = {},
             placebo_args: Dict[str, Any] = {}) -> Union[vs.VideoNode, Any]:
    """
    Written by Zastin, *CAUTIOUSLY* modified by puny little me

    This is all pure black magic to me,
    so I'm just gonna pretend I didn't see anything.
    """
    import zzfunc as zzf

    plcbo_args: Dict[str, Any] = dict(iterations=3,
                                      threshold=5,
                                      radius=16,
                                      grain=0)
    plcbo_args.update(placebo_args)

    dumb3kdb_args: Dict[str, Any] = dict(radius=16, threshold=[30, 0], grain=0)
    dumb3kdb_args.update(f3kdb_args)

    brz = 256 if denoised else 384

    clip_depth = get_depth(clip)
    if clip_depth != 16:
        clip = depth(clip, 16)

    clip_y = plane(clip, 0)

    ymax = maxm(clip_y, sw=30, mode='ellipse')
    ymin = minm(clip_y, sw=30, mode='ellipse')

    # edge detection
    thr = 3.2 * 256
    ypw0 = clip_y.std.Prewitt()
    ypw = ypw0.std.Binarize(thr).rgvs.RemoveGrain(11)
    if mask == 1:
        return ypw

    # range masks (neighborhood max - min)
    rad, thr = 3, 2.5 * 256
    yrangesml = core.std.Expr([ymax[3], ymin[3]], 'x y - abs')
    yrangesml = yrangesml.std.Binarize(thr).std.BoxBlur(0, 2, 1, 2, 1)
    if mask == 2:
        return yrangesml

    rad, thr = 14, 6.5 * 256
    yrangebig0 = core.std.Expr([ymax[rad], ymin[rad]], 'x y - abs')
    yrangebig = yrangebig0.std.Binarize(thr)
    yrangebig = minm(yrangebig,
                     sw=rad * 3 // 4,
                     threshold=65536 // ((rad * 3 // 4) + 1),
                     mode='ellipse')[-1]
    yrangebig = yrangebig.std.BoxBlur(0, rad // 4, 1, rad // 4, 1)
    if mask == 3:
        return yrangebig

    # morphological masks (shapes)
    rad = 30
    ymph = core.std.Expr([
        clip_y,
        maxm(ymin[rad], sw=rad, mode='ellipse')[rad],
        minm(ymax[rad], sw=rad, mode='ellipse')[rad]
    ], 'x y - z x - max')
    ymph = ymph.std.Binarize(brz)
    ymph = ymph.std.Minimum().std.Maximum()
    ymph = ymph.std.BoxBlur(0, 4, 1, 4, 1)
    if mask == 4:
        return ymph

    grad_mask = zzf.combine([ymph, yrangesml, ypw])
    if mask == 5:
        return grad_mask

    ydebn_strong = clip_y.placebo.Deband(1, **plcbo_args)
    ydebn_normal = vdf.deband.dumb3kdb(clip_y, **dumb3kdb_args)
    ydebn = ydebn_strong.std.MaskedMerge(ydebn_normal, grad_mask)
    ydebn = ydebn.std.MaskedMerge(clip_y, yrangebig)

    merged = join([ydebn, plane(clip, 1), plane(clip, 2)])
    return merged if clip_depth == 16 else depth(merged, clip_depth)
예제 #3
0
def masked_deband(clip: vs.VideoNode,
                  denoised: bool = False,
                  deband_args: Dict[str, Any] = {}) -> vs.VideoNode:
    """
    Written by Zastin, *CAUTIOUSLY* modified by puny little me

    This is all pure black magic to me,
    so I'm just gonna pretend I didn't see anything.
    """
    import zzfunc as zzf

    placebo_args: Dict[str, Any] = dict(iterations=2,
                                        threshold=4.0,
                                        radius=12,
                                        grain=4.0)
    placebo_args |= deband_args

    brz = 256 if denoised else 384

    assert clip.format is not None

    clip_depth = clip.format.bits_per_sample
    if clip_depth != 16:
        clip = depth(clip, 16)

    clip_y = plane(clip, 0)
    stats = clip_y.std.PlaneStats()
    agm3 = core.adg.Mask(stats, 3)

    ymax = maxm(clip_y, sw=30, mode='ellipse')
    ymin = minm(clip_y, sw=30, mode='ellipse')

    # edge detection
    thr = 3.2 * 256
    ypw0 = clip_y.std.Prewitt()
    ypw = ypw0.std.Binarize(thr).rgvs.RemoveGrain(11)

    # range masks (neighborhood max - min)
    rad, thr = 3, 2.5 * 256
    yrangesml = core.std.Expr([ymax[3], ymin[3]], 'x y - abs')
    yrangesml = yrangesml.std.Binarize(thr).std.BoxBlur(0, 2, 1, 2, 1)

    rad, thr = 16, 4 * 256
    yrangebig0 = core.std.Expr([ymax[rad], ymin[rad]], 'x y - abs')
    yrangebig = yrangebig0.std.Binarize(thr)
    yrangebig = minm(yrangebig,
                     sw=rad * 3 // 4,
                     threshold=65536 // ((rad * 3 // 4) + 1),
                     mode='ellipse')[-1]
    yrangebig = yrangebig.std.BoxBlur(0, rad // 4, 1, rad // 4, 1)

    # morphological masks (shapes)
    rad, thr = 30, 1 * 256
    ymph = core.std.Expr([
        clip_y,
        maxm(ymin[rad], sw=rad, mode='ellipse')[rad],
        minm(ymax[rad], sw=rad, mode='ellipse')[rad]
    ], 'x y - z x - max')
    ymph = ymph.std.Binarize(brz)
    ymph = ymph.std.Minimum().std.Maximum()
    ymph = ymph.std.BoxBlur(0, 4, 1, 4, 1)

    grad_mask = zzf.combine([ymph, yrangesml, ypw])
    grain_mask = core.std.Expr([
        yrangebig, grad_mask,
        ypw0.std.Binarize(2000).std.Maximum().std.Maximum()
    ],
                               expr='65535 y - x min z -').std.BoxBlur(
                                   0, 16, 1, 16, 1)

    ydebn_strong = clip_y.placebo.Deband(1, **placebo_args)

    ydebn_normal = clip_y.f3kdb.Deband(16, 41, 0, 0, 0, 0, output_depth=16)
    ydebn = ydebn_strong.std.MaskedMerge(ydebn_normal, grad_mask)
    ydebn = ydebn.std.MaskedMerge(clip_y, yrangebig)

    strong_grain = ydebn_strong.grain.Add(0.25, constant=True, seed=69420)
    normal_grain = ydebn.std.MaskedMerge(
        ydebn.grain.Add(0.1, constant=True, seed=69420), agm3)
    y_final = normal_grain.std.MaskedMerge(strong_grain, grain_mask)
    merged = join([y_final, plane(clip, 1), plane(clip, 2)])
    return merged if clip_depth == 16 \
        else depth(merged, clip_depth)