Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # [insert rant about how I can't register on Doom9]
- # port of MPC-HC's Sharpen Complex 2 to Avisynth
- # http://forum.doom9.org/showthread.php?t=158385
- # (I'm assuming it works correctly because MPC-HC refuses to run in Wine)
- # previous version: http://pastebin.com/gamRgbgD
- # only processes luma
- # str0 is the non-edge unsharp amount, default 2.0
- # str1 is the edge unsharp amount, default 1.125
- # k0 is the non-edge blur kernel, default "3 14 3"
- # k1 is the edge blur kernel, default "1 1 1"
- # the kernels must have odd lengths (as required by mt_convolution)
- # edgethr is the threshold for an edge on an arbitrary scale, default 0.2
- # if debug is true, then the edge mask is returned instead
- # for the stacked 16-bit version, there's no debug parameter
- # lsb_in if true treats the input as a stacked 16-bit clip, default true
- # lsb if true leaves the output as stacked 16-bit, otherwise it's dithered
- # (output is the same format as the input by default)
- # mode is for the DitherPost mode, default 0 (see Dither docs)
- # recommendation: just use a regular unsharp filter, don't bother with this
- # unless you're going to set the unsharp amount/kernels (in which case this
- # script actually becomes useful; the default edge/non-edge filters are
- # sufficiently similar to be pointless). the 16-bit version is an extra serving
- # of pointlessness because it's almost visually identical to the 8-bit version
- # with the default settings and it's significantly slower; it might be useful
- # though, if the source is banding-prone or with non-default unsharp
- # amounts/kernels.
- # requirements: MaskTools v2 (for both the regular and 16-bit functions)
- # Dither package (16-bit only)
- function SharpenComplex2(clip src,float "str0",float "str1",string "k0",string "k1",float "edgethr",bool "debug")
- {
- str0=default(str0,2.0) # corresponds to CoefFlou
- str1=default(str1,1.125) # corresponds to Sharpen_val1 * 9
- k0=default(k0,"3 14 3") # ~ Gaussian blur with sigma^2=0.3
- k1=default(k1,"1 1 1") # ~ Gaussian blur with sigma^2=1/3=0.333...
- #the 3 14 3 kernel is derived from assuming linear interpolation in the original
- #code; you can set it to other kernels based on other interpolators, but bear in
- #mind that blurrier interpolators lead to more sharpening
- edgethr=default(edgethr,0.2) # corresponds to SharpenEdge
- src
- unsharp0=mt_lutxy(src,mt_convolution(k0,k0),"x x y - "+string(str0)+" * +",chroma="copy")
- unsharp1=mt_lutxy(src,mt_convolution(k1,k1),"x x y - "+string(str1)+" * +")
- sobelh=mt_convolution("-1 0 1","1 2 1",saturate=false,total=1.)
- sobelv=mt_convolution("1 2 1","-1 0 1",saturate=false,total=1.)
- edgemask=mt_lutxy(sobelh,sobelv,"x x * y y * + 0.5 ^ 255 / "+string(edgethr)+" > 255 0 ?")
- default(debug,false) ? edgemask.grayscale : mt_merge(unsharp0,unsharp1,edgemask)
- }
- function SharpenComplex2_16(clip src,float "str0",float "str1",string "k0",string "k1",float "edgethr",bool "lsb_in",bool "lsb",int "mode")
- {
- str0=default(str0,2.0)
- str1=default(str1,1.125)
- k0="impulse "+default(k0,"3 14 3")
- k1="impulse "+default(k1,"1 1 1")
- edgethr=default(edgethr,0.2)
- lsb_in=default(lsb_in,true)
- lsb=default(lsb,lsb_in)
- mode=default(mode,0)
- lsb_in ? src : src.Dither_convert_8_to_16
- o=last
- w=width()
- h=height()/2
- blur0=Dither_resize16(w,h,kernel=k0,fh=-1,fv=-1,center=false,u=1,v=1)
- blur1=Dither_resize16(w,h,kernel=k1,fh=-1,fv=-1,center=false,u=1,v=1)
- unsharp0=Dither_add16(last,Dither_lut16(Dither_add16(last,Dither_lut16(blur0,"65535 x -"),dif=true),string(str0)+" x 32767 - * 32768 +"),dif=true)
- unsharp1=Dither_add16(last,Dither_lut16(Dither_add16(last,Dither_lut16(blur1,"65535 x -"),dif=true),string(str1)+" x 32767 - * 32768 +"),dif=true)
- #this is why Dither needs subtraction and multiplication utility functions
- #edge mask computation doesn't require higher precision
- #(more like there's no lutxy for 16-bit)
- lsb_in?src.DitherPost(mode=-1):src
- sobelh=mt_convolution("-1 0 1","1 2 1",saturate=false,total=1.)
- sobelv=mt_convolution("1 2 1","-1 0 1",saturate=false,total=1.)
- edgemask=mt_lutxy(sobelh,sobelv,"x x * y y * + 0.5 ^ 255 / "+string(edgethr)+" > 255 0 ?")
- Dither_merge16_8(unsharp0,unsharp1,edgemask)
- MergeLuma(o,last)
- lsb ? last : DitherPost(mode=mode)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement