@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: RemoveGrainModeT = RemoveGrainMode.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)