@disallow_variable_format
@disallow_variable_resolution
def edge_cleaner(
clip: vs.VideoNode, strength: float = 10, rmode: int = 17,
hot: bool = False, smode: bool = False, planes: PlanesT = 0,
edgemask: EdgeDetectT = PrewittStd
) -> vs.VideoNode:
assert clip.format
if clip.format.color_family not in {vs.YUV, vs.GRAY}:
raise ValueError('edge_cleaner: format not supported')
edgemask = EdgeDetect.ensure_obj(edgemask, edge_cleaner)
planes = normalize_planes(clip, planes)
work_clip, *chroma = split(clip) if planes == [0] else (clip, )
assert work_clip.format
peak = get_peak_value(work_clip)
is_float = work_clip.format.sample_type == vs.FLOAT
if smode:
strength += 4
padded = padder.MIRROR(work_clip, 6, 6, 6, 6)
# warpsf is way too slow
if is_float:
padded = depth_func(padded, 16, vs.INTEGER, dither_type=DitherType.NONE)
warped = padded.warp.AWarpSharp2(blur=1, depth=cround(strength / 2), planes=planes)
warped = warped.std.Crop(6, 6, 6, 6)
if is_float:
warped = depth_func(
warped, work_clip.format.bits_per_sample, work_clip.format.sample_type, dither_type=DitherType.NONE
)
warped = repair(warped, work_clip, [
rmode if i in planes else 0 for i in range(work_clip.format.num_planes)
])
y_mask = get_y(work_clip)
mask = edgemask.edgemask(y_mask).std.Expr(
f'x {scale_mask(4, 8, work_clip)} < 0 x '
f'{scale_mask(32, 8, work_clip)} > {peak} x ? ?'
).std.InvertMask()
mask = box_blur(mask)
final = work_clip.std.MaskedMerge(warped, mask)
if hot:
final = repair(final, work_clip, 2)
if smode:
clean = removegrain(y_mask, 17)
diff = y_mask.std.MakeDiff(clean)
mask = edgemask.edgemask(
diff.std.Levels(
scale_mask(40, 8, work_clip),
scale_mask(168, 8, work_clip),
0.35
)
)
sc4 = scale_mask(4, 8, work_clip)
sc16 = scale_mask(16, 8, work_clip)
mask = removegrain(mask, 7).std.Expr(f'x {sc4} < 0 x {sc16} > {peak} x ? ?')
final = final.std.MaskedMerge(work_clip, mask)
if chroma:
return join([final, *chroma], clip.format.color_family)
return final