Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- XXXSource("xxx.xxx")
- src = last
- src16 = src.U16
- #生成edge mask
- emask = src.tcanny(sigma=1.2, mode=1).mt_lut("x 3 <= 0 x 3 - 5 << ?", U=1, V=1).RemoveGrain(20, -1)
- #对噪点做non-linear sharpen的参数与lut公式
- s_str = 1.2
- s_reverse = s_str + 0.25
- s_divisor = 1.5
- s_indexR = 1.281
- sstring = "x 128 - abs "+String(s_divisor)+" / 1 "+String(s_indexR)+" / ^ "+String(s_str)+" * x 128 - x 128 - abs 0.001 + / * x 128 - 2 ^ x 128 - 2 ^ "+String(s_reverse)+" + / * 128 +"
- pre_nr = src.RemoveGrain(11, 0).RemoveGrain(4, 0) #对src做2种blur得到pre_nr(2重blur得到的差值锐化后有缩小噪点的功能)
- pre_nr16= pre_nr.U16
- dif_nr = mt_makediff(src, pre_nr, Y=3, U=1, V=1) #src与pre_nr做差后得到blur过程(噪点)
- #NRDB
- nr16 = pre_nr16.Dither_resize16(src.width, src.height, kernel="Gauss", fh=-1, fv=-1, a1=20, U=2, V=2) #对pre_nr继续做第3次16bit下的blur
- noise16 = makediff16(src16, nr16, U=1, V=1) #做差得16bit下的3次blur过程差值(噪点+细节)noise16
- deband = nr16.GradFun3(thr=0.25, radius=12, smode=2, mask=0, ampn=0, lsb=true, lsb_in=true) #对3重blur后的16bit的视频做deband(也就是NRDB,避免noise对deband造成干扰)
- db16 = Dither_add16(deband, noise16, U=2, V=2, dif=true) #将noise16加回deband的视频得到只有deband处理的视频
- #Contra-Sharpening
- db8 = db16.DitherPost(mode=0)
- sharp8 = dif_nr.mt_lut(sstring, U=1, V=1) #blur过程差值(噪点)的锐化及弱化处理
- dif_db = mt_makediff(pre_nr, db8, U=1, V=1).mt_lut(sstring, U=1, V=1) #deband过程差值(banding、细节)进行8bit下的锐化及弱化处理
- shfx8 = sharp8.Repair(dif_db, 1, -1) #用deband过程差值的锐化修复噪点的锐化(限制锐化强度不超过deband去除的)
- shfx8 = mt_lutxy(sharp8, shfx8, "x 128 - abs y 128 - abs < x y ?", U=1, V=1) #使Repair后的差值不超过Repair前
- shfx16 = shfx8.U16
- sharp16 = sharp8.U16.Dither_limit_dif16(shfx16, thr=2.5, U=1, V=1) #16bit下用Repair后的锐化diff限制Repair前的锐化diff
- d_lm8 = mt_lutxy(sharp8, shfx8, "x y != 255 0 ?", U=1, V=1) #用Repair前后不同之处生成mask
- shpFin = Dither_merge16_8(shfx16, sharp16, d_lm8, U=1, V=1) #用mask merge 16bit的2个clip,Repair有作用的地方取限制后的16bit diff,无作用的地方取8bit升成的16bit diff(达到16bit下Repair的作用)
- dark = db16.Dither_add16(shpFin, Y=3, U=2, V=2, dif=true) #将处理过后的用于锐化的噪点16bit diff加回deband的16bit clip,用于画面暗部
- bright = src.GrainStabilize1(temp=70, radius=3, adapt=-1, p=pre_nr, diff_nr=dif_nr).STPresso(tthr=0) #对src的噪点做stabilize以降低所需码率,用于画面亮部
- flat = ALMerge(dark, bright, pre_nr, U=3, V=3) #用ALMerge取dark和bright进行明暗的加权后得到所处理过的画面平面区域
- Dither_merge16_8(flat, src16, emask, luma=true, U=3, V=3) #用edge mask merge以保护画面边缘部分,只取平面部分的处理
- #Down10(stack=false) #降为10bit Interleave输出给x264
- #DitherPost() #降为8bit输出
- FUNCTION makediff16(clip a, clip b, int "Y", int "U", int "V"){
- Y = Default(Y, 3)
- U = Default(U, 3)
- V = Default(V, 3)
- addend = b.Dither_lut16("65536 x -", Y=Y==3?3:1, U=U==3?3:1, V=V==3?3:1)
- wrap = b.Dither_lut16("x 0 == 1 0 ?", Y=Y==3?3:1, U=U==3?3:1, V=V==3?3:1)
- diff = Dither_add16(a, addend, Y=Y==3?3:1, U=U==3?3:1, V=V==3?3:1, dif=true)
- \ .Dither_add16(wrap, Y=Y==3?3:1, U=U==3?3:1, V=V==3?3:1, dif=false)
- diff = ( Y==2 || U==2 || V==2 ) ? mt_lutxy( diff, a, Y=(Y==2?4:2), U=(U==2?4:2), V=(V==2?4:2) ) : diff
- diff = ( Y==4 || U==4 || V==4 ) ? mt_lutxy( diff, b, Y=(Y==4?4:2), U=(U==4?4:2), V=(V==4?4:2) ) : diff
- return ( Y<=0 || U<=0 || V<=0 ) ? diff.Dither_lut16( Y=(Y<=0?Y:2), U=(U<=0?U:2), V=(V<=0?V:2) )
- \ : diff
- }
- Function GrainStabilize1(clip input, int "temp", int "radius", int "adapt", int "rep", bool "luma", bool "chroma", clip "p", clip "diff_nr"){
- temp = Default(temp, 50)
- radius = Default(radius, 1)
- adapt = Default(adapt, 64)
- rep = Default(rep, 3)
- luma = Default(luma, true)
- chroma = Default(chroma, true)
- Assert( input.IsYV12, "GrainStabilize: only support YV12 colorspace!" )
- Assert( temp>=0 && temp<=100, "GrainStabilize: invalid value for temp(0~100)!" )
- Assert( adapt>=-1 && adapt<=255, "GrainStabilize: invalid value for adapt(-1~255)!" )
- Y = luma ? 3 : 2
- U = chroma ? 3 : 2
- V = chroma ? 3 : 2
- pre_nr = Defined(p) ? p : input.RemoveGrain(luma?20:0, chroma?20:0)
- diff_nr = Defined(diff_nr) ? diff_nr : mt_makediff(input, pre_nr, Y=Y, U=U, V=V)
- diff_sb = (luma&&chroma) ? diff_nr.TemporalSoften(radius, 255, 255, scenechange=255, mode=2)
- \ : luma ? diff_nr.TemporalSoften(radius, 255, 0, scenechange=255, mode=2)
- \ : chroma ? diff_nr.TemporalSoften(radius, 0, 255, scenechange=255, mode=2)
- \ : diff_nr
- diff_mg = (temp == 0) ? diff_nr
- \ : (temp == 100) ? diff_sb
- \ : (luma&&chroma) ? Merge(diff_nr, diff_sb, temp/100.)
- \ : luma ? MergeLuma(diff_nr, diff_sb, temp/100.)
- \ : chroma ? MergeChroma(diff_nr, diff_sb, temp/100.)
- \ : diff_nr
- stabled = rep==0 ? mt_adddiff(pre_nr, diff_mg, Y=Y, U=U, V=V)
- \ : mt_adddiff(pre_nr, diff_mg, Y=Y, U=U, V=V).Repair(input, mode=rep)
- Lmask = adapt==0 ? input.RemoveGrain(19, -1)
- \ : adapt==255 ? input.mt_invert(U=1, V=1).RemoveGrain(19, -1)
- \ : input.mt_lut("x "+string(adapt)+" - abs 255 * "+string(adapt)+" 128 - abs 128 + /", U=1, V=1).RemoveGrain(19, -1)
- return adapt==-1 ? stabled
- \ : mt_merge(input, stabled, Lmask, luma=chroma, Y=Y, U=U, V=V)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement