Log in

View Full Version : nnedi3_rpow2 function for VapourSynth


YamashitaRen
22nd September 2015, 01:37
Since jackoneill moved his nnedi3_rpow2 function to /dev/null, I decided to take the plunge and write my own function in python : https://gist.github.com/YamashitaRen/020c497524e794779d9c
The nnedi3 plugin is required for nnedi3_rpow2 : http://forum.doom9.org/showthread.php?t=166434
The znedi3 plugin is required for znedi3_rpow2 : https://github.com/sekrit-twc/znedi3
The nnedi3cl plugin is required for nnedi3cl_rpow2 : https://forum.doom9.org/showthread.php?t=174902
The eedi2 plugin is required for eedi2_rpow2 : http://forum.doom9.org/showthread.php?t=171136

It has been greatly inspired by jackoneill's plugin.

Shifted output should be correct but I'm no expert in programming and function hadn't been tested extensively so you never know...
Comparisons with zimg/fmtconv/old_nnedi3_rpow2 are warmly welcome.

Usage is :

nnedi3_rpow2(clip,rfactor,correct_shift="zimg",nsize=0,nns=3,qual=1,etype=0,pscrn=2,opt=True)
znedi3_rpow2(clip,rfactor,correct_shift="zimg",nsize=0,nns=3,qual=1,etype=0,pscrn=2,opt=True)
nnedi3cl_rpow2(clip,rfactor,correct_shift="zimg",nsize=0,nns=3,qual=1,etype=0,pscrn=2,opt=True)
eedi3_rpow2(clip,rfactor,correct_shift="zimg",alpha=0.2,beta=0.25,gamma=20,nrad=2,mdis=20,hp=0,ucubic=1,cost3=1,vcheck=2,vthresh0=32,vthresh1=64,vthresh2=4,sclip=None)
eedi2_rpow2(clip,rfactor,correct_shift="zimg",mthresh=10,lthresh=20,vthresh=20,estr=2,dstr=4,maxd=24,map=0,nt=50,pp=1)
By default it corrects the shift with "zimg".
It can correct it with "fmtconv" too.
Or it can not correct it if you use another value.

Example :

import vapoursynth as vs
import edi_rpow2 as edi
core = vs.get_core()
clip = yourclip
clip = core.resize.Bicubic(clip=clip,format=vs.YUV420P16,dither_type="error_diffusion")
clip = edi.znedi3_rpow2(clip=clip,rfactor=2)
clip = core.resize.Spline36(clip=clip,width=clip.width*2/3,height=clip.height*2/3)
edi_rpow2.py has to be in the site-packages directory of your python3 path.

Are_
22nd September 2015, 14:47
Well, I did some test and found:
- If input bits > 8 errors out about nnedi3 parameters, consider using None for dynamic parameters.
- Output is always 8 bit regardless the bitdepth of the input.
- If rfactor >= 8 outputs has incorrect dimensions, like one step to big.

I coded (too, doh) this script in python but never uploaded it (https://gist.github.com/4re/342624c9e1a144a696c6), but I did a very literal translation form the .cpp code, not sure if it is right or not, I felt like a monkey lol.
Output as far as I know is exact to the original, just in case you want to check it against yours.

YamashitaRen
22nd September 2015, 15:04
Thanks for your feedback !

1) Okay, I'll try that.
2) Wow, forgot that we're living in a world where 8 bits isn't "everything".
3) Curious, I'll have to investigate that.

Thanks for your script, it will indeed be interesting to look at it.

edit :
1) and 2) are fixed
edit :
3) is fixed

YamashitaRen
23rd September 2015, 16:53
Wow, shame on me, 3) was a maths mistake !
Shift wasn't corrected too. Reason : http://stackoverflow.com/questions/12043913/python-and-powers-math

Now everything "should" be fine, thanks again for your advices :)

YamashitaRen
14th October 2015, 15:58
eedi3_rpow2 and eedi2_rpow2 functions have been added :)
I'm using the same old "correct_shift" for all the functions. Hope it will be... correct.

lansing
26th January 2016, 21:47
You're missing the parameters to set new height and width of the video

YamashitaRen
28th January 2016, 09:06
You can use core.resize ;)
Don't forget to process in 16bits, so you will not lose any precision.

DJ-1
20th February 2017, 00:00
So what's the deal with resizing here?
In the avisynth version off nnedi3 resize also have a option of secondary scale..i.e: spline , Lanczsos, Gauss etc etc

Here just shows core.resize nnedi3 rprow2 line with Lanzsos.

What are the main differences between how this works and how the avisynth did?
Cheers.

Sent from my HTC 10 using Tapatalk

YamashitaRen
20th February 2017, 11:58
Avisynth version may resize the image and shift the subpixels at the same time.

Here you double your image resolution with nnedi3_rpow2 then scale back the image to the resolution of your choice with the filter of your choice (could be fmtc.resample or core.resize).

DJ-1
15th May 2017, 08:44
Does this include the rpow2 c-shift that the avisynth version did?

I don't see c-shift in the script

Cheers.

Sent from my HTC_M10h using Tapatalk

YamashitaRen
15th May 2017, 08:48
Yeah there is no cshift. Though there is a correct_shift argument...

DJ-1
15th May 2017, 08:50
I assume that's the vapoursynth equal to the old avisynth thing then?
Basically re centre the chrome offset?
Cheers.

Sent from my HTC_M10h using Tapatalk

YamashitaRen
15th May 2017, 08:51
Yeah, it's the name I used for that.

Btw, default mode is now zimg since it's bundled with vapoursynth.

DJ-1
15th May 2017, 09:19
Is that correct-shift argument auto done under the hood? ( unseen in the script) or is it just the gui I using not have it implement maybe?

Should I see it in script..?

Thanks.

Sent from my HTC_M10h using Tapatalk

YamashitaRen
15th May 2017, 11:16
It's there : https://gist.github.com/YamashitaRen/020c497524e794779d9c/2a20385e50804f8b24f2a2479e2c0f3c335d4853#file-edi_rpow2-py-L75
It will be automatically used as long as you don't start tinkering with the "correct_shift" argument.

YamashitaRen
21st May 2018, 23:24
Added znedi3 and nnedi3cl support. Thanks to Selur and theChaosCoder for forcing me to wake up from my slumber.
Went back to the original "scale the whole picture" process instead of "scale the width then scale the height" process after some talk with _08 and torque.

Archive from OP, this is the process I was using previously :
However, I decided to "double width n times then double height n times" instead of "doubling the whole picture (width and height) n times".
It should make the function more efficient than otherwise, but it means that output will be different than old nned3_rpow2 plugin too...
If you have something against it, say it loud and clear.

jackoneill
8th November 2020, 13:16
Is it supposed to always output 4:4:4 no matter what subsampling the input has? https://gist.github.com/YamashitaRen/020c497524e794779d9c#file-edi_rpow2-py-L92