Log in

View Full Version : DeStripe for Vapoursynth?


Selur
20th October 2022, 18:57
Does anyone have a Vapoursynth port of DeStripe? (http://avisynth.nl/index.php/DeStripe)
function DeStripe(Clip C, int "rad", int "offset", int "thr")
{

rad = Default(rad, 2)
offset = Default(offset, 0)
thr_ = Default(thr, 256)


Blurred = Rad == 1 ? C.Mt_Convolution(Horizontal=" 1 1 1 ", vertical = " 1 ", u=1, v=1) : C
Blurred = Rad == 2 ? offset == 0 ? C.Mt_Convolution(Horizontal=" 1 1 1 1 1 ", vertical = " 1 ", u=1, v=1) : C.Mt_Convolution(Horizontal=" 1 0 1 0 1 ", vertical = " 1 ", u=1, v=1) : Blurred
Blurred = Rad == 3 ? offset == 0 ? C.Mt_Convolution(Horizontal=" 1 1 1 1 1 1 1 ", vertical = " 1 ", u=1, v=1) : offset == 1 ? C.Mt_Convolution(Horizontal=" 1 1 0 1 0 1 1 ", vertical = " 1 ", u=1, v=1) : C.Mt_Convolution(Horizontal=" 1 0 0 1 0 0 1 ", vertical = " 1 ", u=1, v=1) : Blurred
Blurred = Rad == 4 ? offset == 0 ? C.Mt_Convolution(Horizontal=" 1 1 1 1 1 1 1 1 1 ", vertical = " 1 ", u=1, v=1) : offset == 1 ? C.Mt_Convolution(Horizontal=" 1 1 1 0 1 0 1 1 1 ", vertical = " 1 ", u=1, v=1) : offset == 2 ? C.Mt_Convolution(Horizontal=" 1 1 0 0 1 0 0 1 1 ", vertical = " 1 ", u=1, v=1) : C.Mt_Convolution(Horizontal=" 1 0 0 0 1 0 0 0 1 ", vertical = " 1 ", u=1, v=1) : Blurred
Blurred = Rad == 5 ? offset == 0 ? C.Mt_Convolution(Horizontal=" 1 1 1 1 1 1 1 1 1 1 1 ", vertical = " 1 ", u=1, v=1) : offset == 1 ? C.Mt_Convolution(Horizontal=" 1 1 1 1 0 1 0 1 1 1 1 ", vertical = " 1 ", u=1, v=1) : offset == 2 ? C.Mt_Convolution(Horizontal=" 1 1 1 0 0 1 0 0 1 1 1 ", vertical = " 1 ", u=1, v=1) : offset == 3 ? C.Mt_Convolution(Horizontal=" 1 1 0 0 0 1 0 0 0 1 1 ", vertical = " 1 ", u=1, v=1) : C.Mt_Convolution(Horizontal=" 1 0 0 0 0 1 0 0 0 0 1 ", vertical = " 1 ", u=1, v=1) : Blurred
Diff = Mt_Makediff(C, Blurred)

THR=string(thr_)
MedianDiff = Rad == 1 ? MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 1 0 -1 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", u=1,v=1) : Diff
MedianDiff = Rad == 2 ? offset == 0 ? MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 1 0 -1 0 2 0 -2 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", u=1,v=1) : MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 2 0 -2 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", u=1,v=1) : MedianDiff
MedianDiff = Rad == 3 ? offset == 0 ? MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 1 0 -1 0 2 0 -2 0 3 0 -3 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", u=1,v=1) : offset == 1 ? MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 2 0 -2 0 3 0 -3 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", u=1,v=1) : MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 3 0 -3 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", u=1,v=1) : MedianDiff
MedianDiff = Rad == 4 ? offset == 0 ? MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", u=1,v=1) : offset == 1 ? MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", u=1,v=1) : offset == 2 ? MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 3 0 -3 0 4 0 -4 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", u=1,v=1) : MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 4 0 -4 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", u=1,v=1) : MedianDiff
MedianDiff = Rad == 5 ? offset == 0 ? MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", u=1,v=1) : offset == 1 ? MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", u=1,v=1) : offset == 2 ? MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", u=1,v=1) : offset == 3 ? MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 4 0 -4 0 5 0 -5 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", u=1,v=1) : MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 5 0 -5 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", u=1,v=1) : MedianDiff
ReconstructedMedian = mt_makediff(Diff, MedianDiff)
Mt_AddDiff(Blurred, ReconstructedMedian)

Return(Mergechroma(Last, C, 1))
} source:https://forum.doom9.org/showthread.php?t=154863&page=2#post1408276

The whole Convolution&Mt_Luts parts with are beyond me. :)

I gather that, one would use:
http://www.vapoursynth.com/doc/functions/video/expr.html
http://www.vapoursynth.com/doc/functions/video/convolution.html
somehow to convert the 'Mt_Convolution', 'MT_Luts', 'Mt_Makediff', calls,..

Cu Selur

Ps.: Latest ported version is part of https://github.com/Selur/VapoursynthScriptsInHybrid/blob/master/fromDoom9.py

Selur
30th October 2022, 07:34
Replacing Mt_Convolustion with core.std.Convolution an 'Mt_Makediff' with core.std.MakeDiff, I get:
def DeStripe(clip: vs.VideoNode, rad: int=2, offset: int=0, thr: int:256) -> vs.VideoNode:
if (rad == 1):
blurred = clip.std.Convolution(matrix=[ 1, 1, 1], planes=[0])
elif rad == 2:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1 1 1 1 1 ], planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1 0 1 0 1 ], planes=[0])
elif rad == 3:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1 1 1 1 1 1 1 ], planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1 1 0 1 0 1 1 ], planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1 0 0 1 0 0 1 ], planes=[0])
elif rad == 4:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1 1 1 1 1 1 1 1 1 ], planes=[0]
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1 1 1 0 1 0 1 1 1 ], planes=[0])
elif offset == 2:
blurred = clip.std.Convolution(matrix=[ 1 1 0 0 1 0 0 1 1 ], planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1 0 0 0 1 0 0 0 1 ], planes=[0])
else if rad == 5:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1 1 1 1 1 1 1 1 1 1 1 ], planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1 1 1 1 0 1 0 1 1 1 1 ], planes=[0])
elif offset == 2:
blurred = clip.std.Convolution(matrix=[ 1 1 1 0 0 1 0 0 1 1 1 ], planes=[0])
elif offset == 3:
blurred = clip.std.Convolution(matrix=[ 1 1 0 0 0 1 0 0 0 1 1 ], planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1 0 0 0 0 1 0 0 0 0 1 ], planes=[0])
diff = core.std.MakeDiff(clip, blurred)

thr_s=string(thr)
if rad == 1:
medianDiff = MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 1 0 -1 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", planes=[0])
if rad == 2:
if offset == 0:
medianDiff = MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 1 0 -1 0 2 0 -2 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", planes=[0])
else:
medianDiff = MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 2 0 -2 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", planes=[0])
if rad == 3:
if offset == 0:
medianDiff = MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 1 0 -1 0 2 0 -2 0 3 0 -3 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", planes=[0])
elif offset == 1:
medianDiff = MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 2 0 -2 0 3 0 -3 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", planes=[0])
else:
medianDiff = MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 3 0 -3 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", planes=[0])
if rad == 4:
if offset == 0:
medianDiff = MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", planes=[0])
elif offset == 1:
medianDiff = MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", planes=[0])
elif offset == 2:
medianDiff = MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 3 0 -3 0 4 0 -4 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", planes=[0])
else:
medianDiff = MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 4 0 -4 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", planes=[0])
if rad == 5:
if offset == 0:
medianDiff = MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 1 0 -1 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", planes=[0])
elif offset == 1:
medianDiff = MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 2 0 -2 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", planes=[0])
elif offset == 2:
medianDiff = MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 3 0 -3 0 4 0 -4 0 5 0 -5 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", planes=[0])
elif offset == 3:
medianDiff = MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 4 0 -4 0 5 0 -5 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", planes=[0])
else:
medianDiff = MT_Luts(Diff, Diff, mode="med", pixels = " 0 0 5 0 -5 0 " , expr = " X Y - X Y - X Y - abs 1 + * X Y - abs 1 + "+THR+" 1 >= "+THR+" 0.5 ^ "+THR+" ? + / - 128 +", planes=[0])
reconstructedMedian = core.std.MakeDiff(diff, medianDiff)

blurred = std.MergeDiff(blurred , reconstructedMedian )
return blurred
but I have no idea how to convert 'Mt_AddDiff(Blurred, ReconstructedMedian)' an ' MT_Luts( ... )' properly and whether the above otherwise is correct.

Cu Selur

kedautinh12
30th October 2022, 08:24
I remember mysteryx93 was complete port FrameRateConverter.avsi to FrameRateConverter.py. You can download and compare
https://github.com/mysteryx93/FrameRateConverter/releases

Selur
30th October 2022, 08:33
@kedautinh12: Looking through FrameRateConverter.avsi it doesn't seem to contain Mt_AddDiff or MT_Luts, so I'm not sure who it's port could help,...

kedautinh12
30th October 2022, 14:16
Ok, here had ported mt_lut to vapoursynth
https://forum.doom9.org/showthread.php?t=174502
https://gist.github.com/Frechdachs/b3a05afe2f7d25316a10cf7239d53d0c

kedautinh12
30th October 2022, 14:19
I think mergediff can replace mt_adddiff
http://www.vapoursynth.com/doc/functions/video/mergediff.html

Selur
30th October 2022, 14:31
Thanks!
Ah okay, then there is just MT_LUTs to replace. (I assume mt_lut and mt_luts are different things, at least in Avisynth they are afaik.) :P
I suspect that Expr from https://github.com/AkarinVS/vapoursynth-plugin could be used, but I got no idea how to use or adjust the 'pixels' options. :/ (-> created an issue entry: https://github.com/AkarinVS/vapoursynth-plugin/issues/16)

Selur
31st October 2022, 06:44
AkarinVS gave excellent help: https://github.com/AkarinVS/vapoursynth-plugin/issues/16#issuecomment-1296381025
Now I 'just' need to apply this device to convert the function.

Selur
31st October 2022, 07:38
Okay, thanks to akarin the mt_luts part-works now, but the convolution-part is still wrong:
# DeStripe works on YUVXXXP8 (I assume supporting PX would require scaling thr)
# requires https://github.com/AkarinVS/vapoursynth-plugin/releases
def DeStripe(clip: vs.VideoNode, rad: int=2, offset: int=0, thr: int=256) -> vs.VideoNode:
if (rad == 1):
blurred = clip.std.Convolution(matrix=[ 1, 1, 1 ], planes=[0])
elif rad == 2:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1 ], planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 1, 0, 1 ], planes=[0])
elif rad == 3:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1, 1, 1 ], planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1, 1, 0, 1, 0, 1, 1 ], planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 0, 1, 0, 0, 1 ], planes=[0])
elif rad == 4:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1, 1, 1, 1, 1 ], planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 0, 1, 0, 1, 1, 1 ], planes=[0])
elif offset == 2:
blurred = clip.std.Convolution(matrix=[ 1, 1, 0, 0, 1, 0, 0, 1, 1 ], planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 0, 0, 1, 0, 0, 0, 1 ], planes=[0])
elif rad == 5:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ], planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1 ], planes=[0])
elif offset == 2:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1 ], planes=[0])
elif offset == 3:
blurred = clip.std.Convolution(matrix=[ 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1 ], planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ], planes=[0])
diff = core.std.MakeDiff(clip, blurred)

thr_s=str(thr)
partial_expr = lambda M, N: f" x x[{M},{N}] - x x[{M},{N}] - x x[{M},{N}] - abs 1 + * x x[{M},{N}] - abs 1 + {thr_s} 1 >= {thr_s} 0.5 pow {thr_s} ? + / - 128 + "
if rad == 1:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + "sort3 drop swap drop", ""])
elif rad == 2:
if offset == 0:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(0,2) + partial_expr(-2,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + "sort3 drop swap drop", ""])
elif rad == 3:
if offset == 0:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort7 drop drop drop swap drop drop drop", ""])
elif offset == 1:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort3 drop swap drop", ""])
elif rad == 4:
if offset == 0:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
elif offset == 1:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort7 drop swap drop swap drop drop drop", ""])
elif offset == 2:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort3 drop swap drop", ""])
elif rad == 5:
if offset == 0:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort11 drop drop drop drop drop swap drop drop drop drop drop", ""])
elif offset == 1:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
elif offset == 2:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort7 drop swap drop swap drop drop dro", ""])
elif offset == 3:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort3 drop swap drop", ""])
reconstructedMedian = core.std.MakeDiff(diff, medianDiff)

blurred = core.std.MergeDiff(blurred, reconstructedMedian)
return blurred

Would be nice if someone could give a short explanation how to convert Avisynth mt_convolution expressions to Vapoursynth. Thanks!

Cu Selur

kedautinh12
31st October 2022, 08:10
I think wrong from when you change mt_convolution(value of horizontal and vertizontal) to std.convolution(valua of matrix). I think you need read again document of both mt_convolution and std.convolution

And i think std.convolution can use mode="hv" will same mt_convolution
When mode is “s”, this must be an array of 9 or 25 numbers, for a 3x3 or 5x5 convolution, respectively.

When mode is not “s”, this must be an array of 3 to 25 numbers, with an odd number of elements.

Selur
31st October 2022, 08:29
Yes, I know that it's wrong, but there is no document regarding mt_convolution :/ http://avisynth.nl/index.php/MaskTools2/mt_convolution
So current state is:
# DeStripe works on YUVXXXP8 (I assume supporting PX would require scaling thr)
# requires https://github.com/AkarinVS/vapoursynth-plugin/releases
def DeStripe(clip: vs.VideoNode, rad: int=2, offset: int=0, thr: int=256) -> vs.VideoNode:
# offset < rad
if (rad == 1):
blurred = clip.std.Convolution(matrix=[ ??? ], planes=[0]) # Horizontal=" 1 1 1 "
elif rad == 2:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ ???], planes=[0]) # Horizontal=" 1 1 1 1 1 ", vertical = " 1
else:
blurred = clip.std.Convolution(matrix=[ ??? ], planes=[0]) # Horizontal=" 1 0 1 0 1 ", vertical = " 1 "
elif rad == 3:
if offset == 0:
blurred = clip.std.Convolution(matrix=[??? ], planes=[0]) # Horizontal=" 1 1 1 1 1 1 1 ", vertical = " 1 "
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ ???], planes=[0]) # Horizontal=" 1 1 0 1 0 1 1 ", vertical = " 1 "
else:
blurred = clip.std.Convolution(matrix=[ ??? ], planes=[0]) # Horizontal=" 1 0 0 1 0 0 1 ", vertical = " 1 "
elif rad == 4:
if offset == 0:
blurred = clip.std.Convolution(matrix=[??? ], planes=[0]) # Horizontal=" 1 1 1 1 1 1 1 1 1 ", vertical = " 1 "
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ ??? ], planes=[0]) # Horizontal=" 1 1 1 0 1 0 1 1 1 ", vertical = " 1 "
elif offset == 2:
blurred = clip.std.Convolution(matrix=[ ??? ], planes=[0]) # Horizontal=" 1 1 0 0 1 0 0 1 1 ", vertical = " 1 "
else:
blurred = clip.std.Convolution(matrix=[ ??? ], planes=[0]) # Horizontal=" 1 0 0 0 1 0 0 0 1 ", vertical = " 1 "
elif rad == 5:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ ??? ], planes=[0]) # Horizontal=" 1 1 1 1 1 1 1 1 1 1 1 ", vertical = " 1 "
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ ??? ], planes=[0]) # Horizontal=" 1 1 1 1 0 1 0 1 1 1 1 ", vertical = " 1 "
elif offset == 2:
blurred = clip.std.Convolution(matrix=[ ??? ], planes=[0]) # Horizontal=" 1 1 1 0 0 1 0 0 1 1 1 ", vertical = " 1 "
elif offset == 3:
blurred = clip.std.Convolution(matrix=[ ??? ], planes=[0]) # Horizontal=" 1 1 0 0 0 1 0 0 0 1 1 ", vertical = " 1 "
else:
blurred = clip.std.Convolution(matrix=[ ??? ], planes=[0]) # Horizontal=" 1 0 0 0 0 1 0 0 0 0 1 ", vertical = " 1 "
diff = core.std.MakeDiff(clip, blurred)

thr_s=str(thr)
partial_expr = lambda M, N: f" x x[{M},{N}] - x x[{M},{N}] - x x[{M},{N}] - abs 1 + * x x[{M},{N}] - abs 1 + {thr_s} 1 >= {thr_s} 0.5 pow {thr_s} ? + / - 128 + "
if rad == 1:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + "sort3 drop swap drop", ""])
elif rad == 2:
if offset == 0:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(0,2) + partial_expr(-2,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + "sort3 drop swap drop", ""])
elif rad == 3:
if offset == 0:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort7 drop drop drop swap drop drop drop", ""])
elif offset == 1:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort3 drop swap drop", ""])
elif rad == 4:
if offset == 0:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
elif offset == 1:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort7 drop swap drop swap drop drop drop", ""])
elif offset == 2:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort3 drop swap drop", ""])
elif rad == 5:
if offset == 0:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort11 drop drop drop drop drop swap drop drop drop drop drop", ""])
elif offset == 1:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
elif offset == 2:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort7 drop swap drop swap drop drop dro", ""])
elif offset == 3:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort3 drop swap drop", ""])
reconstructedMedian = core.std.MakeDiff(diff, medianDiff)

blurred = core.std.MergeDiff(blurred, reconstructedMedian)
return blurred

Hopefully, someone is willed to explain how to do the mt_convolution to std.Convolution conversion.

Cu Selur

kedautinh12
31st October 2022, 09:23
I findout old post explain how to change horizontal and vertizontal to matrix but only 3 number, more i can't findout
https://forum.doom9.org/showthread.php?p=1608840#post1608840

Selur
31st October 2022, 10:24
Hmm,.. reading http://www.vapoursynth.com/doc/functions/video/convolution.html I guess using ", mode='v'" or ", mode='v'" should fix the issue.

# DeStripe works on YUVXXXPY
# requires https://github.com/AkarinVS/vapoursynth-plugin/releases
#
# int rad: search radius (default: 1, range: 1-5)
# int thr: blur threshold, wil be scaled by bit depth (default: 256, range: 1-256)
# boolean vertical: transposes the source for the filtering, to handle vertical lines instead of horizontal ones. (default: False)
def DeStripe(clip: vs.VideoNode, rad: int=2, offset: int=0, thr: int=256, vertical=False) -> vs.VideoNode:

if (rad < 1) or (rad > 5):
raise vs.Error('rad not valid (range: 1-5)')
if (offset < 0) or (offset > (rad-1)):
raise vs.Error('rad not valid (range: 0-(rad-1)')

thr = 256 << (clip.format.bits_per_sample - 8) # scale thr by bit depth
if vertical:
clip = core.std.Transpose(clip)

if (rad == 1):
blurred = clip.std.Convolution(matrix=[ 1, 1, 1 ], mode='v', planes=[0])
elif rad == 2:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1 ], mode='v', planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 1, 0, 1 ], mode='v', planes=[0])
elif rad == 3:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1, 1, 1 ], mode='v', planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1, 1, 0, 1, 0, 1, 1 ], mode='v', planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 0, 1, 0, 0, 1 ], mode='v', planes=[0])
elif rad == 4:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1, 1, 1, 1, 1 ], mode='v', planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 0, 1, 0, 1, 1, 1 ], mode='v', planes=[0])
elif offset == 2:
blurred = clip.std.Convolution(matrix=[ 1, 1, 0, 0, 1, 0, 0, 1, 1 ], mode='v', planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 0, 0, 1, 0, 0, 0, 1 ], mode='v', planes=[0])
elif rad == 5:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ], mode='v', planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1 ], mode='v', planes=[0])
elif offset == 2:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1 ], mode='v', planes=[0])
elif offset == 3:
blurred = clip.std.Convolution(matrix=[ 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1 ], mode='v', planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ], mode='v', planes=[0])
diff = core.std.MakeDiff(clip, blurred)

thr_s=str(thr)
partial_expr = lambda M, N: f" x x[{M},{N}] - x x[{M},{N}] - x x[{M},{N}] - abs 1 + * x x[{M},{N}] - abs 1 + {thr_s} 1 >= {thr_s} 0.5 pow {thr_s} ? + / - 128 + "
if rad == 1:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + "sort3 drop swap drop", ""])
elif rad == 2:
if offset == 0:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(0,2) + partial_expr(-2,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + "sort3 drop swap drop", ""])
elif rad == 3:
if offset == 0:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort7 drop drop drop swap drop drop drop", ""])
elif offset == 1:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort3 drop swap drop", ""])
elif rad == 4:
if offset == 0:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
elif offset == 1:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort7 drop swap drop swap drop drop drop", ""])
elif offset == 2:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort3 drop swap drop", ""])
elif rad == 5:
if offset == 0:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort11 drop drop drop drop drop swap drop drop drop drop drop", ""])
elif offset == 1:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
elif offset == 2:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort7 drop swap drop swap drop drop dro", ""])
elif offset == 3:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort3 drop swap drop", ""])
reconstructedMedian = core.std.MakeDiff(diff, medianDiff)

blurred = core.std.MergeDiff(blurred, reconstructedMedian)

if vertical:
blurred = core.std.Transpose(clip)

return blurred

Selur
31st October 2022, 10:29
", mode='v'" seems to work!
@kedautinh12: Thanks for the help!

Cu Selur

kedautinh12
31st October 2022, 14:48
I findout another way Destripe for Vapoursynth: descale wrapper fixing anime cross-conversion
https://github.com/YomikoR/VapourSynth-Destripe

kedautinh12
11th November 2022, 16:56
I think you can change mode='v' to 'h' and got new function script DetripeV
https://github.com/Dogway/Avisynth-Scripts/blob/b459cfe956e91a2dff1a4ac1adec85e09daf22ef/EX%20mods/DeStripe.avsi#L64

Example about DestripeV can do
https://forum.doom9.org/showthread.php?p=1963907#post1963907

Selur
11th November 2022, 17:23
Hmm,... so like this?
# DeStripe works on YUVXXXPY
# "low frequency" stripes/bands removal filter
# requires https://github.com/AkarinVS/vapoursynth-plugin/releases
#
# int rad: search radius (default: 1, range: 1-5)
# int thr: blur threshold, wil be scaled by bit depth (default: 256, range: 1-256)
# boolean vertical: transposes the source for the filtering, to handle vertical lines instead of horizontal ones. (default: False)
# str hvmode: whether to use vertival or hoizontal convolution
def DeStripe(clip: vs.VideoNode, rad: int=2, offset: int=0, thr: int=256, vertical=False, hvmode: str='v') -> vs.VideoNode:

if (rad < 1) or (rad > 5):
raise vs.Error('rad not valid (range: 1-5)')
if (offset < 0) or (offset > (rad-1)):
raise vs.Error('rad not valid (range: 0-(rad-1)')
if (hvmode != 'v' and mode != 'h'):
raise vs.Error("mode kein either be 'h' or 'v'")

thr = thr << (clip.format.bits_per_sample - 8) # scale thr by bit depth
if vertical:
clip = core.std.Transpose(clip)

if (rad == 1):
blurred = clip.std.Convolution(matrix=[ 1, 1, 1 ], mode=hvmode, planes=[0])
elif rad == 2:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1 ], mode=hvmode, planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 1, 0, 1 ], mode=hvmode, planes=[0])
elif rad == 3:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1, 1, 1 ], mode=hvmode, planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1, 1, 0, 1, 0, 1, 1 ], mode=hvmode, planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 0, 1, 0, 0, 1 ], mode=hvmode, planes=[0])
elif rad == 4:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1, 1, 1, 1, 1 ], mode=hvmode, planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 0, 1, 0, 1, 1, 1 ], mode=hvmode, planes=[0])
elif offset == 2:
blurred = clip.std.Convolution(matrix=[ 1, 1, 0, 0, 1, 0, 0, 1, 1 ], mode=hvmode, planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 0, 0, 1, 0, 0, 0, 1 ], mode=hvmode, planes=[0])
elif rad == 5:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ], mode=hvmode, planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1 ], mode=hvmode, planes=[0])
elif offset == 2:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1 ], mode=hvmode, planes=[0])
elif offset == 3:
blurred = clip.std.Convolution(matrix=[ 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1 ], mode=hvmode, planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ], mode=hvmode, planes=[0])
diff = core.std.MakeDiff(clip, blurred)

thr_s=str(thr)
partial_expr = lambda M, N: f" x x[{M},{N}] - x x[{M},{N}] - x x[{M},{N}] - abs 1 + * x x[{M},{N}] - abs 1 + {thr_s} 1 >= {thr_s} 0.5 pow {thr_s} ? + / - 128 + "
if rad == 1:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + "sort3 drop swap drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,1) + partial_expr(0,-1) + "sort3 drop swap drop", ""])
elif rad == 2:
if offset == 0:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(0,2) + partial_expr(-2,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,1) + partial_expr(0,-1) + partial_expr(0,2) + partial_expr(0,-1) + "sort5 drop drop swap drop drop", ""])
else:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + "sort3 drop swap drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,2) + partial_expr(0,-2) + "sort3 drop swap drop", ""])
elif rad == 3:
if offset == 0:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort7 drop drop drop swap drop drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,1) + partial_expr(0,1) + partial_expr(0,2) + partial_expr(0,.1) + partial_expr(0,3) + partial_expr(0,-3) + "sort7 drop drop drop swap drop drop drop", ""])
elif offset == 1:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,2) + partial_expr(0,-2) + partial_expr(0,3) + partial_expr(0,-3) + "sort5 drop drop swap drop drop", ""])
else:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort3 drop swap drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,3) + partial_expr(0,-3) + "sort3 drop swap drop", ""])
elif rad == 4:
if offset == 0:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,1) + partial_expr(0,-1) + partial_expr(0,2) + partial_expr(0,-2) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0,4) + partial_expr(0,-4) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
elif offset == 1:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort7 drop swap drop swap drop drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(0,-2) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0,4) + partial_expr(0,-4) + "sort7 drop swap drop swap drop drop drop", ""])
elif offset == 2:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0,4) + partial_expr(0,-4) + "sort5 drop drop swap drop drop", ""])
else:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort3 drop swap drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,4) + partial_expr(0,4) + "sort3 drop swap drop", ""])
elif rad == 5:
if offset == 0:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort11 drop drop drop drop drop swap drop drop drop drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,1) + partial_expr(0,-1) + partial_expr(0,2) + partial_expr(0,-2) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0,4) + partial_expr(0,-4) + partial_expr(0,5) + partial_expr(0,-5) + "sort11 drop drop drop drop drop swap drop drop drop drop drop", ""])
elif offset == 1:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,2) + partial_expr(0,-2) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0.4) + partial_expr(0,-4) + partial_expr(0,5) + partial_expr(0,-5) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
elif offset == 2:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort7 drop swap drop swap drop drop dro", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0,4) + partial_expr(0,-4) + partial_expr(0,5) + partial_expr(0,-5) + "sort7 drop swap drop swap drop drop dro", ""])
elif offset == 3:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,4) + partial_expr(0,-4) + partial_expr(0,5) + partial_expr(0,-5) + "sort5 drop drop swap drop drop", ""])
else:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort3 drop swap drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,5) + partial_expr(0,-5) + "sort3 drop swap drop", ""])
reconstructedMedian = core.std.MakeDiff(diff, medianDiff)

blurred = core.std.MergeDiff(blurred, reconstructedMedian)

if vertical:
blurred = core.std.Transpose(clip)

return blurred

Cu Selur

kedautinh12
11th November 2022, 17:45
No, don't use both v and h in mode. DestripeH same old Destripe only use mode='v' and DetripeV only use mode='h'. You will understand when seen scripts from Dogway
https://github.com/Dogway/Avisynth-Scripts/blob/master/EX%20mods/DeStripe.avsi

Selur
11th November 2022, 17:52
Okay, so mode stays the same and depending on the whether 'v' or 'h' is used the expressions flip?
def DeStripe(clip: vs.VideoNode, rad: int=2, offset: int=0, thr: int=256, vertical=False, hvmode: str='v') -> vs.VideoNode:

if (rad < 1) or (rad > 5):
raise vs.Error('rad not valid (range: 1-5)')
if (offset < 0) or (offset > (rad-1)):
raise vs.Error('rad not valid (range: 0-(rad-1)')
if (hvmode != 'v' and mode != 'h'):
raise vs.Error("mode kein either be 'h' or 'v'")

thr = thr << (clip.format.bits_per_sample - 8) # scale thr by bit depth
if vertical:
clip = core.std.Transpose(clip)

if (rad == 1):
blurred = clip.std.Convolution(matrix=[ 1, 1, 1 ], mode='v', planes=[0])
elif rad == 2:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1 ], mode='v', planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 1, 0, 1 ], mode='v', planes=[0])
elif rad == 3:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1, 1, 1 ], mode='v', planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1, 1, 0, 1, 0, 1, 1 ], mode='v', planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 0, 1, 0, 0, 1 ], mode='v', planes=[0])
elif rad == 4:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1, 1, 1, 1, 1 ], mode='v', planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 0, 1, 0, 1, 1, 1 ], mode='v', planes=[0])
elif offset == 2:
blurred = clip.std.Convolution(matrix=[ 1, 1, 0, 0, 1, 0, 0, 1, 1 ], mode='v', planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 0, 0, 1, 0, 0, 0, 1 ], mode='v', planes=[0])
elif rad == 5:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ], mode='v', planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1 ], mode='v', planes=[0])
elif offset == 2:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1 ], mode='v', planes=[0])
elif offset == 3:
blurred = clip.std.Convolution(matrix=[ 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1 ], mode='v', planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ], mode='v', planes=[0])
diff = core.std.MakeDiff(clip, blurred)

thr_s=str(thr)
partial_expr = lambda M, N: f" x x[{M},{N}] - x x[{M},{N}] - x x[{M},{N}] - abs 1 + * x x[{M},{N}] - abs 1 + {thr_s} 1 >= {thr_s} 0.5 pow {thr_s} ? + / - 128 + "
if rad == 1:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + "sort3 drop swap drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,1) + partial_expr(0,-1) + "sort3 drop swap drop", ""])
elif rad == 2:
if offset == 0:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(0,2) + partial_expr(-2,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,1) + partial_expr(0,-1) + partial_expr(0,2) + partial_expr(0,-1) + "sort5 drop drop swap drop drop", ""])
else:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + "sort3 drop swap drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,2) + partial_expr(0,-2) + "sort3 drop swap drop", ""])
elif rad == 3:
if offset == 0:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort7 drop drop drop swap drop drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,1) + partial_expr(0,1) + partial_expr(0,2) + partial_expr(0,.1) + partial_expr(0,3) + partial_expr(0,-3) + "sort7 drop drop drop swap drop drop drop", ""])
elif offset == 1:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,2) + partial_expr(0,-2) + partial_expr(0,3) + partial_expr(0,-3) + "sort5 drop drop swap drop drop", ""])
else:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort3 drop swap drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,3) + partial_expr(0,-3) + "sort3 drop swap drop", ""])
elif rad == 4:
if offset == 0:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,1) + partial_expr(0,-1) + partial_expr(0,2) + partial_expr(0,-2) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0,4) + partial_expr(0,-4) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
elif offset == 1:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort7 drop swap drop swap drop drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(0,-2) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0,4) + partial_expr(0,-4) + "sort7 drop swap drop swap drop drop drop", ""])
elif offset == 2:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0,4) + partial_expr(0,-4) + "sort5 drop drop swap drop drop", ""])
else:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort3 drop swap drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,4) + partial_expr(0,4) + "sort3 drop swap drop", ""])
elif rad == 5:
if offset == 0:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort11 drop drop drop drop drop swap drop drop drop drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,1) + partial_expr(0,-1) + partial_expr(0,2) + partial_expr(0,-2) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0,4) + partial_expr(0,-4) + partial_expr(0,5) + partial_expr(0,-5) + "sort11 drop drop drop drop drop swap drop drop drop drop drop", ""])
elif offset == 1:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,2) + partial_expr(0,-2) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0.4) + partial_expr(0,-4) + partial_expr(0,5) + partial_expr(0,-5) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
elif offset == 2:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort7 drop swap drop swap drop drop dro", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0,4) + partial_expr(0,-4) + partial_expr(0,5) + partial_expr(0,-5) + "sort7 drop swap drop swap drop drop dro", ""])
elif offset == 3:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,4) + partial_expr(0,-4) + partial_expr(0,5) + partial_expr(0,-5) + "sort5 drop drop swap drop drop", ""])
else:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort3 drop swap drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,5) + partial_expr(0,-5) + "sort3 drop swap drop", ""])
reconstructedMedian = core.std.MakeDiff(diff, medianDiff)

blurred = core.std.MergeDiff(blurred, reconstructedMedian)

if vertical:
blurred = core.std.Transpose(clip)

return blurred
The version before only used always 'v' or always 'h' not mix,..

Cu Selur

kedautinh12
11th November 2022, 18:16
Hmm,... so like this?
# DeStripe works on YUVXXXPY
# "low frequency" stripes/bands removal filter
# requires https://github.com/AkarinVS/vapoursynth-plugin/releases
#
# int rad: search radius (default: 1, range: 1-5)
# int thr: blur threshold, wil be scaled by bit depth (default: 256, range: 1-256)
# boolean vertical: transposes the source for the filtering, to handle vertical lines instead of horizontal ones. (default: False)
# str hvmode: whether to use vertival or hoizontal convolution
def DeStripe(clip: vs.VideoNode, rad: int=2, offset: int=0, thr: int=256, vertical=False, hvmode: str='v') -> vs.VideoNode:

if (rad < 1) or (rad > 5):
raise vs.Error('rad not valid (range: 1-5)')
if (offset < 0) or (offset > (rad-1)):
raise vs.Error('rad not valid (range: 0-(rad-1)')
if (hvmode != 'v' and mode != 'h'):
raise vs.Error("mode kein either be 'h' or 'v'")

thr = thr << (clip.format.bits_per_sample - 8) # scale thr by bit depth
if vertical:
clip = core.std.Transpose(clip)

if (rad == 1):
blurred = clip.std.Convolution(matrix=[ 1, 1, 1 ], mode=hvmode, planes=[0])
elif rad == 2:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1 ], mode=hvmode, planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 1, 0, 1 ], mode=hvmode, planes=[0])
elif rad == 3:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1, 1, 1 ], mode=hvmode, planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1, 1, 0, 1, 0, 1, 1 ], mode=hvmode, planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 0, 1, 0, 0, 1 ], mode=hvmode, planes=[0])
elif rad == 4:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1, 1, 1, 1, 1 ], mode=hvmode, planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 0, 1, 0, 1, 1, 1 ], mode=hvmode, planes=[0])
elif offset == 2:
blurred = clip.std.Convolution(matrix=[ 1, 1, 0, 0, 1, 0, 0, 1, 1 ], mode=hvmode, planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 0, 0, 1, 0, 0, 0, 1 ], mode=hvmode, planes=[0])
elif rad == 5:
if offset == 0:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ], mode=hvmode, planes=[0])
elif offset == 1:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1 ], mode=hvmode, planes=[0])
elif offset == 2:
blurred = clip.std.Convolution(matrix=[ 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1 ], mode=hvmode, planes=[0])
elif offset == 3:
blurred = clip.std.Convolution(matrix=[ 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1 ], mode=hvmode, planes=[0])
else:
blurred = clip.std.Convolution(matrix=[ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ], mode=hvmode, planes=[0])
diff = core.std.MakeDiff(clip, blurred)

thr_s=str(thr)
partial_expr = lambda M, N: f" x x[{M},{N}] - x x[{M},{N}] - x x[{M},{N}] - abs 1 + * x x[{M},{N}] - abs 1 + {thr_s} 1 >= {thr_s} 0.5 pow {thr_s} ? + / - 128 + "
if rad == 1:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + "sort3 drop swap drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,1) + partial_expr(0,-1) + "sort3 drop swap drop", ""])
elif rad == 2:
if offset == 0:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(0,2) + partial_expr(-2,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,1) + partial_expr(0,-1) + partial_expr(0,2) + partial_expr(0,-1) + "sort5 drop drop swap drop drop", ""])
else:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + "sort3 drop swap drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,2) + partial_expr(0,-2) + "sort3 drop swap drop", ""])
elif rad == 3:
if offset == 0:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort7 drop drop drop swap drop drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,1) + partial_expr(0,1) + partial_expr(0,2) + partial_expr(0,.1) + partial_expr(0,3) + partial_expr(0,-3) + "sort7 drop drop drop swap drop drop drop", ""])
elif offset == 1:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,2) + partial_expr(0,-2) + partial_expr(0,3) + partial_expr(0,-3) + "sort5 drop drop swap drop drop", ""])
else:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + "sort3 drop swap drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,3) + partial_expr(0,-3) + "sort3 drop swap drop", ""])
elif rad == 4:
if offset == 0:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,1) + partial_expr(0,-1) + partial_expr(0,2) + partial_expr(0,-2) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0,4) + partial_expr(0,-4) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
elif offset == 1:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort7 drop swap drop swap drop drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(0,-2) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0,4) + partial_expr(0,-4) + "sort7 drop swap drop swap drop drop drop", ""])
elif offset == 2:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0,4) + partial_expr(0,-4) + "sort5 drop drop swap drop drop", ""])
else:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(4,0) + partial_expr(-4,0) + "sort3 drop swap drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,4) + partial_expr(0,4) + "sort3 drop swap drop", ""])
elif rad == 5:
if offset == 0:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(1,0) + partial_expr(-1,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort11 drop drop drop drop drop swap drop drop drop drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,1) + partial_expr(0,-1) + partial_expr(0,2) + partial_expr(0,-2) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0,4) + partial_expr(0,-4) + partial_expr(0,5) + partial_expr(0,-5) + "sort11 drop drop drop drop drop swap drop drop drop drop drop", ""])
elif offset == 1:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(2,0) + partial_expr(-2,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,2) + partial_expr(0,-2) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0.4) + partial_expr(0,-4) + partial_expr(0,5) + partial_expr(0,-5) + "sort9 drop drop drop drop swap drop drop drop drop", ""])
elif offset == 2:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(3,0) + partial_expr(-3,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort7 drop swap drop swap drop drop dro", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,3) + partial_expr(0,-3) + partial_expr(0,4) + partial_expr(0,-4) + partial_expr(0,5) + partial_expr(0,-5) + "sort7 drop swap drop swap drop drop dro", ""])
elif offset == 3:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(4,0) + partial_expr(-4,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort5 drop drop swap drop drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,4) + partial_expr(0,-4) + partial_expr(0,5) + partial_expr(0,-5) + "sort5 drop drop swap drop drop", ""])
else:
if hvmode == 'v':
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(5,0) + partial_expr(-5,0) + "sort3 drop swap drop", ""])
else:
medianDiff = core.akarin.Expr(diff, [partial_expr(0,0) + partial_expr(0,5) + partial_expr(0,-5) + "sort3 drop swap drop", ""])
reconstructedMedian = core.std.MakeDiff(diff, medianDiff)

blurred = core.std.MergeDiff(blurred, reconstructedMedian)

if vertical:
blurred = core.std.Transpose(clip)

return blurred

Cu Selur

I think this is right version. Sr for don't look your script clearly

Selur
11th November 2022, 18:52
okay. :)

_Al_
12th November 2022, 23:21
strictly looking just at patterns, it could be simplified:

def DeStripe(clip: vs.VideoNode, rad: int=2, offset: int=0, thr: int=256, vertical=False, hvmode: str='v') -> vs.VideoNode:

if rad not in range(1,6):
raise vs.Error('rad not a valid integer, must be 1 to 5)
if offset not in range(0,rad):
raise vs.Error('offset not a valid integer, must be 0 to rad-1)
if (hvmode != 'v' and mode != 'h'):
raise vs.Error("mode kein either be 'h' or 'v'")

thr = thr << (clip.format.bits_per_sample - 8) # scale thr by bit depth
if vertical:
clip = core.std.Transpose(clip)

MAP = {
1: ([1,1,1],),
2: ([1,1,1,1,1], [1,0,1,0,1]),
3: ([1,1,1,1,1,1,1], [1,1,0,1,0,1,1], [1,0,0,1,0,0,1]),
4: ([1,1,1,1,1,1,1,1,1 ], [1,1,1,0,1,0,1,1,1], [1,1,0,0,1,0,0,1,1], [1,0,0,0,1,0,0,0,1]),
5: ([1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,0,1,0,1,1,1,1], [1,1,1,0,0,1,0,0,1,1,1], [1,1,0,0,0,1,0,0,0,1,1], [1,0,0,0,0,1,0,0,0,0,1])
}
blurred = clip.std.Convolution(matrix=MAP[rad][offset], mode='v', planes=[0])
diff = core.std.MakeDiff(clip, blurred)

thr_s=str(thr)
partial_expr = lambda M, N: f" x x[{M},{N}] - x x[{M},{N}] - x x[{M},{N}] - abs 1 + * x x[{M},{N}] - abs 1 + {thr_s} 1 >= {thr_s} 0.5 pow {thr_s} ? + / - 128 + "

matrix_length = len(MAP[rad][offset])
start = offset*2 + 1
pattern = [(0,0), (0,1), (0,-1), (0,2), (0,-2), (0,3), (0,-3), (0,4), (0,-4), (0,5), (0,-5)]
pattern = pattern[0:matrix_length]
pattern = [(0,0)] + pattern[start:]
expr = ''
for pair in pattern:
if hvmode == 'v':
pair = tuple(reversed(pair))
expr += partial_expr(*pair)
expr = expr + f'sort{matrix_length} ' + 'drop '*int(matrix_length/2) + 'swap ' + 'drop '*int(matrix_length/2)

medianDiff = core.akarin.Expr(diff, [expr, ''])
reconstructedMedian = core.std.MakeDiff(diff, medianDiff)
blurred = core.std.MergeDiff(blurred, reconstructedMedian)

if vertical:
blurred = core.std.Transpose(blurred)

return blurred

kedautinh12
13th November 2022, 02:20
I think you take script from here is right version
https://forum.doom9.org/showthread.php?p=1978181#post1978181

Selur
13th November 2022, 08:06
strictly looking just at patterns, it could be simplified:
Nice! Thanks.

Cu Selur

_Al_
14th November 2022, 16:26
instead of:
expr = expr + f'sort{matrix_length} ' + 'drop '*int(matrix_length/2) + 'swap ' + 'drop '*int(matrix_length/2)
there should be:
expr = expr + f'sort{len(pattern)} ' + 'drop '*int(len(pattern)/2) + 'swap ' + 'drop '*int(len(pattern)/2)

Selur
14th November 2022, 18:56
Thanks, updated: https://github.com/Selur/VapoursynthScriptsInHybrid/edit/master/fromDoom9.py