xv: bd: improve logo mask
this was bothering me way more than it should've
This commit is contained in:
parent
3ba1bc1f00
commit
03998c6009
1
.gitignore
vendored
1
.gitignore
vendored
@ -11,3 +11,4 @@ ffmpeg2pass*.log
|
|||||||
!mask_2.png
|
!mask_2.png
|
||||||
*.m2ts
|
*.m2ts
|
||||||
*.lwi
|
*.lwi
|
||||||
|
**/.vspreview/
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user