From 03998c6009e058156b5919d175f361eb285a8886 Mon Sep 17 00:00:00 2001 From: louis Date: Thu, 14 May 2020 01:50:19 -0400 Subject: [PATCH] xv: bd: improve logo mask this was bothering me way more than it should've --- .gitignore | 3 +- Symphogear/XV [BD]/05/ep5.vpy | 44 +++++++++++++----------- Symphogear/XV [BD]/06/ep6.vpy | 44 +++++++++++++----------- Symphogear/XV [BD]/xv_common/__init__.py | 2 +- Symphogear/XV [BD]/xv_common/filter.py | 26 +++++++++++--- Symphogear/XV [BD]/xv_common/scale.py | 13 ++++--- 6 files changed, 78 insertions(+), 54 deletions(-) diff --git a/.gitignore b/.gitignore index fb4b74f..194f4ad 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ cudnn_data/ ffmpeg2pass*.log !mask_2.png *.m2ts -*.lwi \ No newline at end of file +*.lwi +**/.vspreview/ diff --git a/Symphogear/XV [BD]/05/ep5.vpy b/Symphogear/XV [BD]/05/ep5.vpy index dd1046d..5eb2fd0 100644 --- a/Symphogear/XV [BD]/05/ep5.vpy +++ b/Symphogear/XV [BD]/05/ep5.vpy @@ -1,45 +1,47 @@ import vapoursynth as vs +from toolz.functoolz import compose +from typing import List + import sys sys.path.append("..") -from xv_common import FadeRange, denoise, descale, w2x, deband, ncop_mask, finalize -from functools import partial -from toolz.functoolz import compose +from xv_common import (FadeRange, Range, denoise, descale, w2x, deband, + mask_oped, mask_logo, finalize) # noqa: E402 core = vs.core core.max_cache_size = 1024 OP = (1272, 3668) ED = (31889, 34046) -NO_SCALE = [(34514, 34600)] -FORCE_SCALE = [(22384, 23376)] -FADE_RANGES = [FadeRange(ref=3700, range_=(3670, 3751)), # title - FadeRange(ref=17383, range_=(17300, 17436)) # logo +LOGO: Range = (17300, 17436) +NO_SCALE: List[Range] = [(34514, 34600)] +FORCE_SCALE: List[Range] = [(22384, 23376)] +FADE_RANGES: List[FadeRange] = [ + FadeRange(ref=3700, range_=(3670, 3751)), # title ] -W2X_DENOISE = [ - (OP[0]+1859, OP[0]+1896) # flashy OP scene +W2X_DENOISE: List[Range] = [ + (OP[0]+1859, OP[0]+1896) # flashy OP scene ] -DEBAND_HARD = [] -DEBAND_HARDER = [] +DEBAND_HARD: List[Range] = [] +DEBAND_HARDER: List[Range] = [] src_ep = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00003.m2ts") src_pv = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00004.m2ts")[:-24] src_op = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00007.m2ts")[24:-24] src_ed = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00008.m2ts")[24:-24] +src_logo = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00005.m2ts")[18416] src = src_ep + src_pv src = src.fmtc.bitdepth(bits=16) den = denoise(src) -descale = partial(descale, force_scale=FORCE_SCALE, no_scale=NO_SCALE, fade_ranges=FADE_RANGES) -w2x = partial(w2x, w2x_range=W2X_DENOISE) -deband = partial(deband, hard=DEBAND_HARD, harder=DEBAND_HARDER) -ncop_mask = partial(ncop_mask, src=den, op=OP, ed=ED, src_op=src_op, src_ed=src_ed) final = compose( - finalize, - ncop_mask, - deband, - w2x, - descale - )(den) + finalize, + mask_logo(src=den, src_logo=src_logo, range=LOGO), + mask_oped(src=den, op=OP, ed=ED, src_op=src_op, src_ed=src_ed), + deband(hard=DEBAND_HARD, harder=DEBAND_HARDER), + w2x(w2x_range=W2X_DENOISE), + descale(force_scale=FORCE_SCALE, no_scale=NO_SCALE, fade_ranges=FADE_RANGES) +)(den) + final.set_output() diff --git a/Symphogear/XV [BD]/06/ep6.vpy b/Symphogear/XV [BD]/06/ep6.vpy index c36a02c..87aa9cf 100644 --- a/Symphogear/XV [BD]/06/ep6.vpy +++ b/Symphogear/XV [BD]/06/ep6.vpy @@ -1,45 +1,47 @@ import vapoursynth as vs +from toolz.functoolz import compose +from typing import List + import sys sys.path.append("..") -from xv_common import FadeRange, denoise, descale, w2x, deband, ncop_mask, finalize -from functools import partial -from toolz.functoolz import compose +from xv_common import (FadeRange, Range, denoise, descale, w2x, deband, + mask_oped, mask_logo, finalize) # noqa: E402 core = vs.core core.max_cache_size = 1024 OP = (1726, 4124) ED = (31890, 34047) -NO_SCALE = [(34495, 34590)] -FORCE_SCALE = [(25196, 26501)] -FADE_RANGES = [FadeRange(ref=4179, range_=(4126, 4207)), # title - FadeRange(ref=18421, range_=(18333, 18498)) # logo +LOGO: Range = (18333, 18498) +NO_SCALE: List[Range] = [(34495, 34590)] +FORCE_SCALE: List[Range] = [(25196, 26501)] +FADE_RANGES: List[FadeRange] = [ + FadeRange(ref=4179, range_=(4126, 4207)), # title ] -W2X_DENOISE = [ - (OP[0]+1859, OP[0]+1896) # flashy OP scene +W2X_DENOISE: List[Range] = [ + (OP[0]+1859, OP[0]+1896) # flashy OP scene ] -DEBAND_HARD = [] -DEBAND_HARDER = [] +DEBAND_HARD: List[Range] = [] +DEBAND_HARDER: List[Range] = [] src_ep = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00005.m2ts") src_pv = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00006.m2ts")[:-24] src_op = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00007.m2ts")[24:-24] src_ed = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00008.m2ts")[24:-24] +src_logo = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00005.m2ts")[18416] src = src_ep + src_pv src = src.fmtc.bitdepth(bits=16) den = denoise(src) -descale = partial(descale, force_scale=FORCE_SCALE, no_scale=NO_SCALE, fade_ranges=FADE_RANGES) -w2x = partial(w2x, w2x_range=W2X_DENOISE) -deband = partial(deband, hard=DEBAND_HARD, harder=DEBAND_HARDER) -ncop_mask = partial(ncop_mask, src=den, op=OP, ed=ED, src_op=src_op, src_ed=src_ed) final = compose( - finalize, - ncop_mask, - deband, - w2x, - descale - )(den) + finalize, + mask_logo(src=den, src_logo=src_logo, range=LOGO), + mask_oped(src=den, op=OP, ed=ED, src_op=src_op, src_ed=src_ed), + deband(hard=DEBAND_HARD, harder=DEBAND_HARDER), + w2x(w2x_range=W2X_DENOISE), + descale(force_scale=FORCE_SCALE, no_scale=NO_SCALE, fade_ranges=FADE_RANGES) +)(den) + final.set_output() diff --git a/Symphogear/XV [BD]/xv_common/__init__.py b/Symphogear/XV [BD]/xv_common/__init__.py index 0a15376..748d585 100644 --- a/Symphogear/XV [BD]/xv_common/__init__.py +++ b/Symphogear/XV [BD]/xv_common/__init__.py @@ -1,2 +1,2 @@ from .scale import FadeRange, descale -from .filter import denoise, w2x, deband, ncop_mask, finalize +from .filter import Range, denoise, w2x, deband, mask_oped, mask_logo, finalize diff --git a/Symphogear/XV [BD]/xv_common/filter.py b/Symphogear/XV [BD]/xv_common/filter.py index 47345b8..2834703 100644 --- a/Symphogear/XV [BD]/xv_common/filter.py +++ b/Symphogear/XV [BD]/xv_common/filter.py @@ -1,13 +1,17 @@ import vapoursynth as vs +import vsutil from kagefunc import adaptive_grain, retinex_edgemask from lvsfunc.misc import replace_ranges from mvsfunc import BM3D +from toolz.functoolz import curry from typing import List, Tuple, Union from vardefunc import dcm core = vs.core +Range = Union[int, Tuple[int, int]] + def denoise(clip: vs.VideoNode) -> vs.VideoNode: denoisechroma = core.knlm.KNLMeansCL(clip, d=1, a=2, h=0.45, channels="UV", @@ -18,8 +22,8 @@ def denoise(clip: vs.VideoNode) -> vs.VideoNode: planes=[0, 1, 2], colorfamily=vs.YUV) -def w2x(clip: vs.VideoNode, w2x_range: List[Union[int, Tuple[int, int]]] - ) -> vs.VideoNode: +@curry +def w2x(clip: vs.VideoNode, w2x_range: List[Range]) -> vs.VideoNode: rgb = clip.resize.Point(format=vs.RGBS, matrix_in_s="709") w2x = rgb.w2xnvk.Waifu2x(noise=1, scale=1, model=2) \ .resize.Point(format=clip.format.id, matrix_s="709") @@ -31,8 +35,9 @@ def w2x(clip: vs.VideoNode, w2x_range: List[Union[int, Tuple[int, int]]] return denoise -def deband(clip: vs.VideoNode, hard: List[Union[int, Tuple[int, int]]], - harder: List[Union[int, Tuple[int, int]]]) -> vs.VideoNode: +@curry +def deband(clip: vs.VideoNode, hard: List[Range], + harder: List[Range]) -> vs.VideoNode: line = retinex_edgemask(clip).std.Binarize(9500).rgvs.RemoveGrain(3) \ .std.Inflate() nf3kdb = clip.neo_f3kdb.Deband(range=18, y=32, cb=24, cr=24, grainy=24, @@ -47,7 +52,8 @@ def deband(clip: vs.VideoNode, hard: List[Union[int, Tuple[int, int]]], return debanded -def ncop_mask(clip: vs.VideoNode, src: vs.VideoNode, +@curry +def mask_oped(clip: vs.VideoNode, src: vs.VideoNode, op: Tuple[int, int], ed: Tuple[int, int], src_op: vs.VideoNode, src_ed: vs.VideoNode) -> vs.VideoNode: credit_op_m = dcm(clip, src[op[0]:op[1]+1], @@ -58,6 +64,16 @@ def ncop_mask(clip: vs.VideoNode, src: vs.VideoNode, return core.std.MaskedMerge(clip, src, credit_m) +@curry +def mask_logo(clip: vs.VideoNode, src: vs.VideoNode, src_logo: vs.VideoNode, + range: Range) -> vs.VideoNode: + mask = vsutil.get_y(src_logo).std.Binarize(19).fmtc.bitdepth(bits=16) + mask = vsutil.iterate(mask, core.std.Inflate, 5) + merge = core.std.MaskedMerge(clip, src, mask) + merge = replace_ranges(clip, merge, [range]) + return merge + + def finalize(clip: vs.VideoNode) -> vs.VideoNode: final = adaptive_grain(clip, 0.3) final = final.fmtc.bitdepth(bits=10, dmode=3) diff --git a/Symphogear/XV [BD]/xv_common/scale.py b/Symphogear/XV [BD]/xv_common/scale.py index 2ded784..a0ac645 100644 --- a/Symphogear/XV [BD]/xv_common/scale.py +++ b/Symphogear/XV [BD]/xv_common/scale.py @@ -7,7 +7,10 @@ from lvsfunc.aa import upscaled_sraa from lvsfunc.kernels import Bicubic from lvsfunc.misc import replace_ranges from lvsfunc.scale import descale as ldescale -from typing import List, NamedTuple, Tuple, Union +from toolz.functoolz import curry +from typing import List, NamedTuple, Tuple + +from .filter import Range core = vs.core @@ -58,10 +61,10 @@ def _really_dumb_inverse_mask(clip: vs.VideoNode, reupscaled: vs.VideoNode, return mask.resize.Bicubic(format=clip.format.id) -def descale(clip: vs.VideoNode, force_scale: List[Union[int, Tuple[int, int]]], - no_scale: List[Union[int, Tuple[int, int]]], - fade_ranges: List[FadeRange], show_mask: bool = False - ) -> vs.VideoNode: +@curry +def descale(clip: vs.VideoNode, force_scale: List[Range], + no_scale: List[Range], fade_ranges: List[FadeRange], + show_mask: bool = False) -> vs.VideoNode: dmask = partial(_really_dumb_inverse_mask, ranges=fade_ranges) kernel = Bicubic(b=1/3, c=1/3) heights = [871, 872, 873]