5
0

xv: bd: improve logo mask

this was bothering me way more than it should've
This commit is contained in:
louis f 2020-05-14 01:50:19 -04:00
parent 3ba1bc1f00
commit 03998c6009
Signed by: louis
GPG Key ID: 44D7E1DE4E23D6F2
6 changed files with 78 additions and 54 deletions

1
.gitignore vendored
View File

@ -11,3 +11,4 @@ ffmpeg2pass*.log
!mask_2.png !mask_2.png
*.m2ts *.m2ts
*.lwi *.lwi
**/.vspreview/

View File

@ -1,45 +1,47 @@
import vapoursynth as vs import vapoursynth as vs
from toolz.functoolz import compose
from typing import List
import sys import sys
sys.path.append("..") sys.path.append("..")
from xv_common import FadeRange, denoise, descale, w2x, deband, ncop_mask, finalize from xv_common import (FadeRange, Range, denoise, descale, w2x, deband,
from functools import partial mask_oped, mask_logo, finalize) # noqa: E402
from toolz.functoolz import compose
core = vs.core core = vs.core
core.max_cache_size = 1024 core.max_cache_size = 1024
OP = (1272, 3668) OP = (1272, 3668)
ED = (31889, 34046) ED = (31889, 34046)
NO_SCALE = [(34514, 34600)] LOGO: Range = (17300, 17436)
FORCE_SCALE = [(22384, 23376)] NO_SCALE: List[Range] = [(34514, 34600)]
FADE_RANGES = [FadeRange(ref=3700, range_=(3670, 3751)), # title FORCE_SCALE: List[Range] = [(22384, 23376)]
FadeRange(ref=17383, range_=(17300, 17436)) # logo FADE_RANGES: List[FadeRange] = [
FadeRange(ref=3700, range_=(3670, 3751)), # title
] ]
W2X_DENOISE = [ W2X_DENOISE: List[Range] = [
(OP[0]+1859, OP[0]+1896) # flashy OP scene (OP[0]+1859, OP[0]+1896) # flashy OP scene
] ]
DEBAND_HARD = [] DEBAND_HARD: List[Range] = []
DEBAND_HARDER = [] DEBAND_HARDER: List[Range] = []
src_ep = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00003.m2ts") 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_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_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_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_ep + src_pv
src = src.fmtc.bitdepth(bits=16) src = src.fmtc.bitdepth(bits=16)
den = denoise(src) 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( final = compose(
finalize, finalize,
ncop_mask, mask_logo(src=den, src_logo=src_logo, range=LOGO),
deband, mask_oped(src=den, op=OP, ed=ED, src_op=src_op, src_ed=src_ed),
w2x, deband(hard=DEBAND_HARD, harder=DEBAND_HARDER),
descale w2x(w2x_range=W2X_DENOISE),
)(den) descale(force_scale=FORCE_SCALE, no_scale=NO_SCALE, fade_ranges=FADE_RANGES)
)(den)
final.set_output() final.set_output()

View File

@ -1,45 +1,47 @@
import vapoursynth as vs import vapoursynth as vs
from toolz.functoolz import compose
from typing import List
import sys import sys
sys.path.append("..") sys.path.append("..")
from xv_common import FadeRange, denoise, descale, w2x, deband, ncop_mask, finalize from xv_common import (FadeRange, Range, denoise, descale, w2x, deband,
from functools import partial mask_oped, mask_logo, finalize) # noqa: E402
from toolz.functoolz import compose
core = vs.core core = vs.core
core.max_cache_size = 1024 core.max_cache_size = 1024
OP = (1726, 4124) OP = (1726, 4124)
ED = (31890, 34047) ED = (31890, 34047)
NO_SCALE = [(34495, 34590)] LOGO: Range = (18333, 18498)
FORCE_SCALE = [(25196, 26501)] NO_SCALE: List[Range] = [(34495, 34590)]
FADE_RANGES = [FadeRange(ref=4179, range_=(4126, 4207)), # title FORCE_SCALE: List[Range] = [(25196, 26501)]
FadeRange(ref=18421, range_=(18333, 18498)) # logo FADE_RANGES: List[FadeRange] = [
FadeRange(ref=4179, range_=(4126, 4207)), # title
] ]
W2X_DENOISE = [ W2X_DENOISE: List[Range] = [
(OP[0]+1859, OP[0]+1896) # flashy OP scene (OP[0]+1859, OP[0]+1896) # flashy OP scene
] ]
DEBAND_HARD = [] DEBAND_HARD: List[Range] = []
DEBAND_HARDER = [] DEBAND_HARDER: List[Range] = []
src_ep = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00005.m2ts") 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_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_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_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_ep + src_pv
src = src.fmtc.bitdepth(bits=16) src = src.fmtc.bitdepth(bits=16)
den = denoise(src) 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( final = compose(
finalize, finalize,
ncop_mask, mask_logo(src=den, src_logo=src_logo, range=LOGO),
deband, mask_oped(src=den, op=OP, ed=ED, src_op=src_op, src_ed=src_ed),
w2x, deband(hard=DEBAND_HARD, harder=DEBAND_HARDER),
descale w2x(w2x_range=W2X_DENOISE),
)(den) descale(force_scale=FORCE_SCALE, no_scale=NO_SCALE, fade_ranges=FADE_RANGES)
)(den)
final.set_output() final.set_output()

View File

@ -1,2 +1,2 @@
from .scale import FadeRange, descale 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

View File

@ -1,13 +1,17 @@
import vapoursynth as vs import vapoursynth as vs
import vsutil
from kagefunc import adaptive_grain, retinex_edgemask from kagefunc import adaptive_grain, retinex_edgemask
from lvsfunc.misc import replace_ranges from lvsfunc.misc import replace_ranges
from mvsfunc import BM3D from mvsfunc import BM3D
from toolz.functoolz import curry
from typing import List, Tuple, Union from typing import List, Tuple, Union
from vardefunc import dcm from vardefunc import dcm
core = vs.core core = vs.core
Range = Union[int, Tuple[int, int]]
def denoise(clip: vs.VideoNode) -> vs.VideoNode: def denoise(clip: vs.VideoNode) -> vs.VideoNode:
denoisechroma = core.knlm.KNLMeansCL(clip, d=1, a=2, h=0.45, channels="UV", 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) planes=[0, 1, 2], colorfamily=vs.YUV)
def w2x(clip: vs.VideoNode, w2x_range: List[Union[int, Tuple[int, int]]] @curry
) -> vs.VideoNode: def w2x(clip: vs.VideoNode, w2x_range: List[Range]) -> vs.VideoNode:
rgb = clip.resize.Point(format=vs.RGBS, matrix_in_s="709") rgb = clip.resize.Point(format=vs.RGBS, matrix_in_s="709")
w2x = rgb.w2xnvk.Waifu2x(noise=1, scale=1, model=2) \ w2x = rgb.w2xnvk.Waifu2x(noise=1, scale=1, model=2) \
.resize.Point(format=clip.format.id, matrix_s="709") .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 return denoise
def deband(clip: vs.VideoNode, hard: List[Union[int, Tuple[int, int]]], @curry
harder: List[Union[int, Tuple[int, int]]]) -> vs.VideoNode: def deband(clip: vs.VideoNode, hard: List[Range],
harder: List[Range]) -> vs.VideoNode:
line = retinex_edgemask(clip).std.Binarize(9500).rgvs.RemoveGrain(3) \ line = retinex_edgemask(clip).std.Binarize(9500).rgvs.RemoveGrain(3) \
.std.Inflate() .std.Inflate()
nf3kdb = clip.neo_f3kdb.Deband(range=18, y=32, cb=24, cr=24, grainy=24, 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 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, op: Tuple[int, int], ed: Tuple[int, int], src_op: vs.VideoNode,
src_ed: vs.VideoNode) -> vs.VideoNode: src_ed: vs.VideoNode) -> vs.VideoNode:
credit_op_m = dcm(clip, src[op[0]:op[1]+1], 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) 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: def finalize(clip: vs.VideoNode) -> vs.VideoNode:
final = adaptive_grain(clip, 0.3) final = adaptive_grain(clip, 0.3)
final = final.fmtc.bitdepth(bits=10, dmode=3) final = final.fmtc.bitdepth(bits=10, dmode=3)

View File

@ -7,7 +7,10 @@ from lvsfunc.aa import upscaled_sraa
from lvsfunc.kernels import Bicubic from lvsfunc.kernels import Bicubic
from lvsfunc.misc import replace_ranges from lvsfunc.misc import replace_ranges
from lvsfunc.scale import descale as ldescale 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 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) return mask.resize.Bicubic(format=clip.format.id)
def descale(clip: vs.VideoNode, force_scale: List[Union[int, Tuple[int, int]]], @curry
no_scale: List[Union[int, Tuple[int, int]]], def descale(clip: vs.VideoNode, force_scale: List[Range],
fade_ranges: List[FadeRange], show_mask: bool = False no_scale: List[Range], fade_ranges: List[FadeRange],
) -> vs.VideoNode: show_mask: bool = False) -> vs.VideoNode:
dmask = partial(_really_dumb_inverse_mask, ranges=fade_ranges) dmask = partial(_really_dumb_inverse_mask, ranges=fade_ranges)
kernel = Bicubic(b=1/3, c=1/3) kernel = Bicubic(b=1/3, c=1/3)
heights = [871, 872, 873] heights = [871, 872, 873]