Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ###### Contra-Sharpen mod 3.0 ###### by mawen1250 ###### 2012.09.03 ######
- Function CSmod(clip filtered, clip "source", clip "pclip", float "strength", float "divisor", float "index", float "ss_w", float "ss_h",
- \ bool "chroma", int "preblur", bool "prec", bool "secure", bool "limit", bool "choversh", bool "Slimit", bool "SlimitY", bool "Tlimit",
- \ bool "ssrep", int "preR", int "Smethod", int "Smode", float "Szrp", float "Spwr", float "SdmpLo", float "SdmpHi", int "RGmode", int "RGmodeU",
- \ int "Repmode", int "RepmodeU", int "Sovershoot", int "Sundershoot", int "Tovershoot", int "Tundershoot", float "Soft", int "Soothe",
- \ string "filter_ss", int "blksize", int "overlap", int "thSAD", int "thSCD1", int "thSCD2", bool "truemotion", bool "MVglobal",
- \ int "pel", int "pelsearch", int "search", int "searchparam", int "MVsharp", int "DCT", bool "usepasf", string "kernel", bool "ss_hq",
- \ string "ssmethod", int "thr", bool "ssout", bool "ssoutc")
- {
- defsrc = Defined(source)
- defpclp = Defined(pclip )
- defRGm = Defined(RGmode)
- deffss = Defined(filter_ss)
- AA = deffss ? filter_ss=="AA" : false
- sw = filtered.width()
- sh = filtered.height()
- HD = (sw > 1024 || sh > 576) ? true : false
- chroma = Default(chroma, false )
- ss_w = Default(ss_w, 1.50 ) #Super sampling multiplier of width.
- ss_h = Default(ss_h, 1.50 ) #Super sampling multiplier of height.
- ss_w = max (ss_w, 1.00 )
- ss_h = max (ss_h, 1.00 )
- ss_hq = Default(ss_hq, ss_w*ss_h>=2.25) #True using nnedi3_rpow2 in super sampling, false using non-ringing Spline64Resize.
- ssout = Default(ssout, false ) #Output in super sampling resolution.
- ssoutc = Default(ssoutc, true ) #Whether to output correct chroma when (chroma==false && ss_hq==false && ssout==true).
- ssrep = Default(ssrep, false ) #When limiting sharpening to source clip, whether to repair in super sampling resolution.
- preblur = Default(preblur, 1 ) #Pre-filtering, 1 uses Minblur, 2 uses Minblur(Uses SBR by default) mixed with Minblur+FluxSmoothT, 3 uses Minblur(Uses SBR by default)+FluxSmoothT.
- prec = Default(prec, preblur>=1) #Whether to use preblur in chroma plane
- preR = Default(preR, preblur>=2?0:ss_w*ss_h<3?1:2) #Preblur setting, 1-3 sets radius of MinBlur, 0 uses SBR instead of normal MinBlur.
- usepasf = Default(usepasf, false ) #Whether to use pre-filtered clip as input(filtered) clip, which will reduce noise/halo/ring from input clip.
- limit = Default(limit, true ) #Whether to limit sharpening to source clip, only takes effect when (Defined(source) || Defined(filter_ss) || usepasf) == true.
- thr = Default(thr, 0 ) #When limiting sharpening to source clip, allow sharpening more than the source in [thr].
- RGmode = Default(RGmode, HD?20:11)
- RGmodeU = Default(RGmodeU, defRGm?RGmode:11)
- Repmode = Default(Repmode, AA?13:1)
- RepmodeU = Default(RepmodeU,Repmode)
- ssout = (ss_w > 1.0 || ss_h > 1.0) ? ssout : false
- ssrep = (ss_w > 1.0 || ss_h > 1.0) ? ssrep : false
- ssoutc = (!chroma && ssout) ? ssoutc : false
- ssrep = ssout ? true : ssrep
- filter_ss= deffss ? AA ? "SangNom(aa=48).TurnRight().SangNom(aa=48).TurnLeft()" : filter_ss : NOP() #When defining filter_ss="AA", will automatically use SangNom for anti-aliasing in super sampling clip, and will automatically set Repmode to 13.
- limit = defsrc || deffss || usepasf ? limit : false
- Smethod = Default(Smethod, limit?1:3) #Sharpen Method - 1: 3x3 kernel, 2: Min/Max, 3: Min/Max + 3x3 kernel.
- secure = Default(secure, true ) #Mode to avoid banding & oil painting (or face wax) effect of sharpening.(from LSFmod Smode=5)
- Smode = Default(Smode, 3 ) #Sharpen Mode - 1: Linear, 2: Non-linear 1, 3:Non-linear 2(from LSFmod).
- divisor = Default(divisor, 1.5 )
- index = Default(index, 0.8 )
- strength = Default(strength,100 )
- Szrp = Default(Szrp, 16 )
- Spwr = Default(Spwr, 4 )
- SdmpLo = Default(SdmpLo, 4 )
- SdmpHi = Default(SdmpHi, 48 )
- miSpwr = 1.0/Spwr
- Slimit = Default(Slimit, !limit ) #Spatial limit with overshoot and undershoot. Disabled when (limit==true && thr==0).
- Sovershoot = Default(Sovershoot, Round(strength/100))
- Sundershoot = Default(Sundershoot, Sovershoot )
- choversh = Default(choversh, true ) #When (chroma==true && limit==true && thr>=1 && choversh==false), luma will sharpen more than source, chroma will not.
- Tlimit = Default(Tlimit, false ) #Use MC Temporal limit at the end of sharpening(only process luma).(from MCTD)
- Tovershoot = Default(Tovershoot, Round(strength/50 ))
- Tundershoot = Default(Tundershoot, Tovershoot )
- SlimitY = Default(SlimitY, !Tlimit ) #It will automatically set Slimit=true, SlimitY=false to use Spatial limit on chroma when Tlimit=true.
- Soft = Default(Soft, limit? 0:-2) #Soft the sharpening effect (-1 = old autocalculate, -2 = new autocalculate, 0 = disable, (0, 100] = enable). Disabled when (limit==true && thr==0).(from LSFmod)
- Soothe = Default(Soothe, limit? -1:24) #Soothe temporal stabilization, 0-100 sets minimum percent of the original sharpening to keep, -1 disables Soothe. Disabled when (chroma==true && Tlimit=true).
- blksize = Default(blksize, HD ? 16 : 8 )
- overlap = Default(overlap, HD ? 8 : 4 )
- thSAD = Default(thSAD, 300 )
- thSCD1 = Default(thSCD1, 300 )
- thSCD2 = Default(thSCD2, 100 )
- truemotion = Default(truemotion, false )
- MVglobal = Default(MVglobal, true )
- pel = Default(pel, 2 )
- pelsearch = Default(pelsearch, 2 )
- search = Default(search, 2 )
- searchparam = Default(searchparam, 2 )
- MVsharp = Default(MVsharp, 2 )
- DCT = Default(DCT, 0 )
- ss_w = max(ss_w, 1.0)
- ss_h = max(ss_h, 1.0)
- wss = Round(sw*ss_w/8)*8
- hss = Round(sh*ss_h/8)*8
- rfactor = max(Round(sqrt(ss_w*ss_h)/2)*2, 2)
- ssmethod = Defined(ssmethod) ? ssmethod
- \ : ss_hq ? """nnedi3_rpow2(rfactor=rfactor, qual=2, cshift="Spline64Resize", fwidth=wss, fheight=hss)"""
- \ : "CSmod_nrSpline64Resize(wss, hss, chroma=chroma||ssoutc)"
- #You can define your own super sampling method with ssmethod.
- ch21 = chroma ? 2 : 1
- ch31 = chroma ? 3 : 1
- Slimit = limit && thr==0 ? false : Slimit
- Soft = limit && thr==0 ? 0
- \ : Soft <= -2 ? (1.0+(2.0/(ss_w+ss_h))) * sqrt(strength)
- \ : Soft == -1 ? sqrt( (((ss_w+ss_h)/2.0-1.0)*100.0) ) * 10
- \ : Soft <= 100 ? Soft : 100
- Soothe = Tlimit ? -1 : Soothe
- strength = Smode == 1 ? strength/50.0 : Smode == 2 ? strength/20.0 : strength/100.0
- preR = preR <= 0 ? 0 : preR >= 3 ? 3 : preR
- Sovershoot = Sovershoot < 0 ? 0 : Sovershoot
- Sundershoot = Sundershoot < 0 ? 0 : Sundershoot
- Tovershoot = Tovershoot < 0 ? 0 : Tovershoot
- Tundershoot = Tundershoot < 0 ? 0 : Tundershoot
- #super sampling with filtering
- source = defsrc ? source : filtered
- filtered_os = filtered
- filtered_ss = (ss_w > 1.0 || ss_h > 1.0) ? Eval("filtered."+ssmethod) : filtered
- filtered = (ss_w > 1.0 || ss_h > 1.0) ? filtered_ss : filtered
- source_ss = (ss_w > 1.0 || ss_h > 1.0) ? defsrc ? Eval("source."+ssmethod) : filtered : source
- filtered = (ss_w > 1.0 || ss_h > 1.0) && deffss ? Eval("filtered."+filter_ss) : filtered
- filtered_ds = (ss_w > 1.0 || ss_h > 1.0) && deffss ? filtered.CSmod_nrSpline64Resize(sw, sh, chroma=chroma) : filtered_os
- Assert( (isFrameBased(filtered_os)), """CSmod: input clip "filtered" must be Frame Based!""" )
- Assert( (isFrameBased(source)), """CSmod: input clip "source" must be Frame Based!""" )
- Assert( (source.width() == sw && source.height() == sh), """CSmod: resolution of "filtered" and "source" must match!""" )
- #pre-filtering before sharpening
- spatial = filtered.MinBlur(preR, chroma ? (prec ? 3 : 2) : 1)
- temporal = spatial .FluxsmoothT(7).Repair(spatial, 1, prec ? 1 : -1)
- temporal = chroma&&!prec ? temporal.MergeChroma(filtered) : temporal
- mixed = temporal.merge(spatial,0.251)
- pre = defpclp ? pclip
- \ : preblur==1 ? spatial
- \ : preblur==2 ? mixed
- \ : preblur>=3 ? temporal
- \ : filtered
- #You can define your own pre-filter clip with pclip.
- pre_ds = (pre.width() == sw && pre.height() == sh) ? pre : pre.CSmod_nrSpline64Resize(sw, sh, chroma=chroma)
- pre = (ss_w > 1.0 || ss_h > 1.0) ? (pre.width() == wss && pre.height() == hss) ? pre : Eval("pre."+ssmethod) : pre_ds
- #whether to use pre-filtered clip as main clip
- filtered = usepasf ? pre : filtered
- filtered_ds = usepasf ? pre_ds : filtered_ds
- #unsharp
- dark_limit = pre.mt_inpand(U=ch31, V=ch31)
- bright_limit = pre.mt_expand(U=ch31, V=ch31)
- minmaxavg = Smethod == 1 ? NOP() : mt_average(dark_limit, bright_limit, U=ch31, V=ch31)
- method = Smethod == 1 ? Defined(kernel) ? Eval("pre. "+kernel) : pre .removegrain(RGmode, chroma ? RGmodeU : -1)
- \ : Smethod == 2 ? minmaxavg
- \ : Defined(kernel) ? Eval("minmaxavg."+kernel) : minmaxavg.removegrain(RGmode, chroma ? RGmodeU : -1)
- method = secure ? method.mt_lutxy(pre,"x y < x 1 + x y > x 1 - x ? ?", U=ch31, V=ch31) : method
- #making difference clip of sharpening
- sharpdiff = mt_makediff(pre, method, U=ch31,V=ch31)
- #sharpening diff generate mode
- sharpdiff = Smode == 1 ? sharpdiff.mt_lut("x 128 - "+string(strength)+" * 128 +", U=ch31, V=ch31)
- \ : Smode == 2 ? sharpdiff.mt_lut("x 128 == x x 128 - "+String(divisor)+" / Abs "+String(index)+" ^ "+String(strength)+" * x 128 > 1 -1 ? * 128 + ?", U=ch31, V=ch31)
- \ : Smode == 3 ? sharpdiff.mt_lut("x 128 == x x 128 - abs "+string(Szrp)+" / "+string(miSpwr)+" ^ "+string(Szrp)+" * "+string(strength)+" * x 128 > 1 -1 ? * x 128 - 2 ^ "+string(Szrp)+" 2 ^ "+string(SdmpLo)+" + * x 128 - 2 ^ "+string(SdmpLo)+" + "+string(Szrp)+" 2 ^ * / * 1 "+string(SdmpHi)+" 0 == 0 "+string(Szrp)+" "+string(SdmpHi)+" / 4 ^ ? + 1 "+string(SdmpHi)+" 0 == 0 x 128 - abs "+string(SdmpHi)+" / 4 ^ ? + / * 128 + ?", U=ch31, V=ch31)
- \ : sharpdiff
- # x==128 ? x : (abs(x-128)/Szrp)^(miSpwr)*Szrp*strength*(x>128 ? 1 : -1) * ((x-128)^2*(Szrp^2+SdmpLo) / ((x-128)^2+SdmpLo)*Szrp^2) * ((1+ SdmpHi==0 ? 0 : (Szrp/SdmpHi)^4) / (1+ SdmpHi==0 ? 0 : (abs(x-128)/SdmpHi)^4)) + 128
- #spatial limit
- sclp = Slimit&&(chroma||SlimitY) ? mt_adddiff(filtered, sharpdiff, U=ch31, V=ch31) : NOP()
- sclp = Slimit ? sclp.mt_clamp(bright_limit, dark_limit, Sovershoot, Sundershoot, Y=SlimitY?3:2, U=ch31, V=ch31) : NOP()
- #Soft
- sharpdiff = Slimit&&(chroma||SlimitY) ? mt_makediff(sclp, filtered, U=ch31, V=ch31) : sharpdiff
- sharpdiff = Soft == 0 ? sharpdiff : mt_lutxy(sharpdiff, sharpdiff.removegrain(19, chroma ? 19 : -1), "x 128 - abs y 128 - abs > y "+string(Soft)+" * x "+string(100-Soft)+" * + 100 / x ?", U=ch31, V=ch31)
- #Soothe
- sharpdiff2 = (Soothe >= 0 && Soothe <= 100) ? sharpdiff.temporalsoften(1,255,chroma ? 255 : 0,32,2) : NOP()
- sharpdiff = (Soothe >= 0 && Soothe <= 100) ? mt_lutxy(sharpdiff, sharpdiff2, "x 128 - y 128 - * 0 < x 128 - 100 / "+string(Soothe)+" * 128 + x 128 - abs y 128 - abs > x "+string(Soothe)+" * y 100 "+string(Soothe)+" - * + 100 / x ? ?", U=ch31, V=ch31) : sharpdiff
- #the difference achieved by filtering
- allD = limit ? ssrep && (ss_w > 1.0 || ss_h > 1.0) ? mt_makediff(source_ss, filtered, U=ch31, V=ch31)
- \ : mt_makediff(source, filtered_ds, U=ch31, V=ch31) : NOP()
- #limiting sharpening to source clip
- sharpdiff = !ssrep && (ss_w > 1.0 || ss_h > 1.0) ? sharpdiff.CSmod_nrSpline64Resize(sw, sh, chroma=chroma) : sharpdiff
- ssDD = limit ? sharpdiff.repair(allD, mode=Repmode, modeU=chroma ? RepmodeU : -1) : sharpdiff
- ssDD = limit && thr >= 1 ? sharpdiff.mt_lutxy(ssDD,"x 128 - abs y 128 - abs " + string(thr) + " + <= x y 128 < y " + string(thr) + " - y " + string(thr) + " + ? ?", U=choversh?ch31:ch21, V=choversh?ch31:ch21) : ssDD
- ssDD = limit && thr == 0 || (limit && !choversh) ? ssDD.mt_lutxy(sharpdiff, "x 128 - abs y 128 - abs < x y ?", Y=(limit && thr >= 1 && !choversh)?2:3, U=ch31, V=ch31) : ssDD
- ssDD = ssrep && (ss_w > 1.0 || ss_h > 1.0) && !ssout ? ssDD.CSmod_nrSpline64Resize(sw, sh, chroma=chroma) : ssDD
- #add difference clip to clip "filtered" of ss/original resolution
- sclp = ssout ? mt_adddiff(filtered, ssDD, U=ch31, V=ch31) : mt_adddiff(filtered_ds, ssDD, U=ch31, V=ch31)
- #temporal limit
- pre_ds = ssout ? pre : pre_ds
- source = ssout ? source_ss : source
- pMVS = Tlimit ? pre_ds.MSuper(hpad=0, vpad=0, pel=pel, sharp=MVsharp, chroma=false) : NOP()
- f1v = Tlimit ? MAnalyse(pMVS, isb=false, delta=1, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=DCT, global=MVglobal, chroma=false) : NOP()
- b1v = Tlimit ? MAnalyse(pMVS, isb=true, delta=1, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=DCT, global=MVglobal, chroma=false) : NOP()
- f1c = Tlimit ? MCompensate(source, pMVS, f1v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : NOP()
- b1c = Tlimit ? MCompensate(source, pMVS, b1v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : NOP()
- Tmax = Tlimit ? source.mt_logic(f1c, "max", U=1, V=1).mt_logic(b1c, "max", U=1, V=1) : NOP()
- Tmin = Tlimit ? source.mt_logic(f1c, "min", U=1, V=1).mt_logic(b1c, "min", U=1, V=1) : NOP()
- sclp = Tlimit ? sclp.mt_clamp(Tmax, Tmin, Tovershoot, Tundershoot, U=2, V=2) : sclp
- end = chroma ? sclp
- \ : ssout ? ssoutc ? sclp.MergeChroma(filtered_ss)
- \ : sclp
- \ : sclp.MergeChroma(filtered_os)
- return end
- }
- Function MinBlur(clip clp, int "r", int "uv"){
- r = Default(r, 1)
- uv = Default(uv, 3)
- uv2 = (uv==2) ? 1 : uv
- rg4 = (uv==3) ? 4 : -1
- rg11 = (uv==3) ? 11 : -1
- rg20 = (uv==3) ? 20 : -1
- medf = (uv==3) ? 1 : -200
- uvm2 = (r==2) ? (uv==3?3:uv==2?0:-1) : nop()
- uvm3 = (r==3) ? (uv==3?3:uv==2?0:-1) : nop()
- RG11D = (r==0) ? mt_makediff(clp, clp.sbr(uv=uv2), U=uv2, V=uv2)
- \ : (r==1) ? mt_makediff(clp, clp.removegrain(11, rg11), U=uv2, V=uv2)
- \ : (r==2) ? mt_makediff(clp, clp.removegrain(11, rg11).removegrain(20, rg20), U=uv2, V=uv2)
- \ : mt_makediff(clp, clp.removegrain(11, rg11).removegrain(20, rg20).removegrain(20, rg20), U=uv2, V=uv2)
- RG4D = (r<=1) ? mt_makediff(clp, clp.removegrain(4, rg4 ), U=uv2, V=uv2)
- \ : (r==2) ? mt_makediff(clp, clp.Quantile(radius_y=2, radius_u=uvm2, radius_v=uvm2), U=uv2, V=uv2)
- \ : mt_makediff(clp, clp.Quantile(radius_y=3, radius_u=uvm3, radius_v=uvm3), U=uv2, V=uv2)
- DD = mt_lutxy(RG11D, RG4D, "x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?", U=uv2, V=uv2)
- return clp.mt_makediff(DD, U=uv, V=uv)
- }
- Function sbr(clip c, int "uv") {
- uv = Default(uv, 1)
- uv2 = (uv==2) ? 1 : uv
- rg11 = (uv==3) ? 11 : -1
- rg11D = mt_makediff(c, c.removegrain(11, rg11), U=uv2, V=uv2)
- rg11DD = mt_lutxy(rg11D, rg11D.removegrain(11, rg11), "x y - x 128 - * 0 < 128 x y - abs x 128 - abs < x y - 128 + x ? ?", U=uv2, V=uv2)
- return c.mt_makediff(rg11DD, U=uv, V=uv)
- }
- Function CSmod_nrSpline64Resize(clip input, int "target_width", int "target_height", float "src_left", float "src_top", float "src_width", float "src_height", bool "chroma", val "nr") {
- w = input.Width
- h = input.Height
- target_width = Default(target_width, w)
- target_height = Default(target_height, h)
- src_left = Default(src_left, 0)
- src_top = Default(src_top, 0)
- src_width = Default(src_width, w)
- src_height = Default(src_height, h)
- chroma = Default(chroma, true)
- nr = Default(nr, true)
- Assert( IsFloat(nr) || IsBool(nr), """CSmod_nrSpline64Resize: "nr" should be either bool or float!""" )
- res_mul = Float( target_width * target_height ) / Float( w * h )
- res_mul = min( max( res_mul, 1 ), 2.25 )
- nr_weight = IsFloat(nr) ? nr
- \ : nr /* == True */ ? Spline( res_mul, 1, 0, 2.25, 1, 3.5, 0, true )
- \ : /* == False */ 0
- nr_weight = min( max( nr_weight, 0 ), 1 )
- try {
- inputp = chroma ? input.IsYV12 ? input
- \ : input.ConvertToYV12
- \ : input.ConvertToY8
- } catch ( error_msg ) {
- inputp = input.IsYV12 ? input
- \ : input.ConvertToYV12
- }
- resize = inputp.Spline64Resize(target_width, target_height, src_left, src_top, src_width, src_height)
- nrres = inputp.GaussResize(target_width, target_height, src_left, src_top, src_width, src_height, p=100)
- resize = resize.GetCSP == "Y8" ? resize.ConvertToYV12 : resize
- nrres = nrres .GetCSP == "Y8" ? nrres .ConvertToYV12 : nrres
- resize = nr_weight == 0 ? resize
- \ : nr_weight == 1 ? resize.Repair(nrres, 1, chroma ? 1 : -1)
- \ : chroma ? Merge (resize, resize.Repair(nrres, 1, 1), nr_weight)
- \ : MergeLuma(resize, resize.Repair(nrres, 1, -1), nr_weight)
- return resize
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement