@limiter
def detail_mask_neo(
clip: vs.VideoNode,
sigma: float = 1.0,
detail_brz: float = 0.05,
lines_brz: float = 0.08,
edgemask: GenericMaskT = Prewitt,
rg_mode: RemoveGrain.Mode = remove_grain.Mode.MINMAX_MEDIAN_OPP,
) -> ConstantFormatVideoNode:
assert check_variable(clip, detail_mask_neo)
clip_y = get_y(clip)
blur_pf = gauss_blur(clip_y, sigma * 0.75)
blur_pref = bilateral(clip_y, blur_pf, sigma)
blur_pref_diff = ExprOp.SUB.combine(blur_pref, clip_y).std.Deflate()
blur_pref = Morpho.inflate(blur_pref_diff, iterations=4)
prew_mask = normalize_mask(edgemask, clip_y).std.Deflate().std.Inflate()
if detail_brz > 0:
blur_pref = Morpho.binarize(blur_pref, detail_brz)
if lines_brz > 0:
prew_mask = Morpho.binarize(prew_mask, lines_brz)
merged = ExprOp.ADD.combine(blur_pref, prew_mask)
return remove_grain(merged, rg_mode)