SharpenComplex2 source
From Avisynth wiki
(Difference between revisions)
Raffriff42 (Talk | contribs) m (Category:Script_Source->Scripts) |
|||
Line 15: | Line 15: | ||
# edgethr is the threshold for an edge on an arbitrary scale, default 0.2 | # 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 | # if debug is true, then the edge mask is returned instead | ||
− | |||
# for the stacked 16-bit version, there's no debug parameter | # 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_in if true treats the input as a stacked 16-bit clip, default true | ||
Line 21: | Line 20: | ||
# (output is the same format as the input by default) | # (output is the same format as the input by default) | ||
# mode is for the DitherPost mode, default 0 (see Dither docs) | # mode is for the DitherPost mode, default 0 (see Dither docs) | ||
− | |||
# recommendation: just use a regular unsharp filter, don't bother with this | # 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 | # unless you're going to set the unsharp amount/kernels (in which case this | ||
Line 30: | Line 28: | ||
# though, if the source is banding-prone or with non-default unsharp | # though, if the source is banding-prone or with non-default unsharp | ||
# amounts/kernels. | # amounts/kernels. | ||
− | |||
# requirements: MaskTools v2 (for both the regular and 16-bit functions) | # requirements: MaskTools v2 (for both the regular and 16-bit functions) | ||
# Dither package (16-bit only) | # Dither package (16-bit only) |
Latest revision as of 18:41, 14 January 2020
source: http://pastebin.com/bYCeusjT
# [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) }