再加了一堆東西後這恐怕是不簡了, 感謝FCH菊苣提供建議,感謝LittlePox製作出V 1.1
(Ver. 1.1合并到楼下了--BY304)
感謝taro_06 的魯瑪碉堡給了我這套思路
https://docs.google.com/file/d/0B1rWQPg ... sp=sharing
算法和06_Taro的撸馬碉堡一樣,只是極簡化且只保留了F3KDB的部分
並且將F3Kgrain的動態噪聲控制部分拿掉,也就是說F3KDB出哪種就只能用哪種
但好處是直接由F3KDB進行16BIT處理,16BIT到8BIT的算法也直接用F3KDB的dither算法了
具體參數都已經簡化到一個程度了,應該很容易使用
內部處理始終為16bit,輸出輸入可為8bit,具體見腳本內部
有發現BUG直接在下方回報即可
LUMA1~3設定不同的grainY
CHROMA1~3設定不同的grainC
LSB設定是否為16BIT輸出
LSB_IN設定是否為16BIT輸入
就以上這些,很容易使用了吧
想用更完整功能的,就好好參閱06_Taro的魯瑪碉堡吧新增參數
rang,Y,Cb,Cr,dither_algo,dynamic_grain (int,int,int,int,int,bool) *(15,64,64,64,3,true)
以上這些同Flash3kyuv中的同名參數用法一樣
thr, elast (float,float ,must bigger than 0) *(1.00,3.00)
在Dither_limit_dif16 中的限制用參數
temp(int ,must bigger than 0) *(60)
作為處理前度的限制
Emask(int,0 or 1 or 2) *(1)
0為關閉mask ,1為使用TEdgeMask,2為使用tcanny
v1.5 -change Get_lsb to Dither_get_lsb
v1.4 -2013/8/4
-fix BC,false chroma problem
v1.3 -2013/7/26
-ADD PCrang & TVrang
-Separate lsb&msb
-mask Default 0
-Dither_limit_dif16(thr, Default 0.35
-ADD BlankClip ctrl
-ADD mask removegrain ctrl
-ADD ontop_grain
-better deal
v1.2 - 2013/7/16
-ADD Dither_limit_dif16(thr , elast)
-ADD Temp to ctrl effect
-AAD Emask 1 or 2 or 3
-AAD tcanny
v1.1 - 2013/7/13
-ADD Flash3kyuv (range,Y,Cb,Cr,dither_algo,dynamic_grain) support
powered by LittlePox
v1.0 - 2013/6/8
- First script
代码: 全选
###############################################
### ###
### Flash3kyuv_mod (Ver. 1.5) ###
### ###
### powered by: taro_06,LittlePox,eric888a ###
###############################################
###
### Fast debanding filter in 16-bit precision
###
### Based on Didee's GrainFactory3
### Original used by tp7, scripted by eric888a from taro_06's LumaDB
###
###
### +-----------+
### | CHANGELOG |
### +-----------+
###
### v1.5 -change Get_lsb to Dither_get_lsb
### -enable Gen_null_lsb Function
###
### v1.4 -fix BC,false chroma problem
###
### v1.3 -2013/7/26
### -ADD PCrang & TVrang
### -Separate lsb&msb
### -mask Default 0
### -Dither_limit_dif16(thr, Default 0.35
### -ADD BlankClip ctrl
### -ADD mask removegrain ctrl
### -ADD ontop_grain
### -better deal
###
###
### v1.2 - 2013/7/16
### -ADD Dither_limit_dif16(thr , elast)
### -ADD Temp to ctrl effect
### -AAD Emask 0,1,2
### -AAD tcanny
###
### v1.1 - 2013/7/13
###
### -ADD Flash3kyuv (range,Y,Cb,Crr,dither_algo,dynamic_grain) support
###
### powered by LittlePox
###
###
### v1.0 - 2013/6/8
### - First script
###
### +---------+
### | USAGE |
### +---------+
###
### !!!Add "SetMemoryMax(1024)" at the beginning of your script if you find it extremely slow, usually happening on high resolution processing!!!
###
### 8-bit input, 8-bit output, using internal dither down method
### f3KDB_MOD()
###
### 8-bit input, 16-bit output
### f3KDB_MOD(lsb=true)
###
### 16-bit input, 16-bit output
### f3KDB_MOD(lsb=true, lsb_in=true)
###
### 16-bit input, 8-bit output, using internal dithering down method
### f3KDB_MOD(lsb_in=true)
###
###
### See below for explanation of parameters
###
### +----------------+
### | REQUIREMENTS |
### +----------------+
###
### -> AddGrainC [v1.6.1]
### -> MaskTools2 [v2.0a48]
### -> dither [v1.15.0]
### -> RemoveGrain [v1.0pre]
### -> TEdgeMask [v0.9]
### -> f3kdb [v1.5.0]
### -> tcanny [v1.0]
### -> Smoothadjust [v2.62]
Function f3KDB_MOD(clip input,int "luma1",int "luma2",int "luma3",
\int "chroma1",int "chroma2",int "chroma3",int "temp",bool "lsb",
\bool "lsb_in",int "range",int "Y",int "Cb",int "Cr",int "dither_algo",
\bool "dynamic_grain",float "thr",float "elast",int "emask",bool "TVrange",
\bool "BC",int "ontop_grain",bool "mask_removegrain")
{
#-----------------------------------------------------------------------------------
lsb_in = Default( lsb_in, false )
lsb = Default( lsb, false )
emask = Default( emask, 0 )
thr = Default( thr, 0.35 )
elast = Default( elast, 3.00 )
temp = Default( temp, 60 )
luma1 = Default( luma1, 48 )
luma2 = Default( luma2, 24 )
luma3 = Default( luma3, 12 )
chroma1 = Default( chroma1, 48 )
chroma2 = Default( chroma2, 24 )
chroma3 = Default( chroma3, 12 )
_range = Default( range, 15 )
_Y = Default( Y, 64 )
_Cb = Default( Cb, 64 )
_Cr = Default( Cr, 64 )
da = Default( dither_algo, 3 )
dr = Default( dynamic_grain , true)
BC = Default( BC, true)
TVrange = Default( TVrange, true)
mask_removegrain = Default( mask_removegrain, true)
ontop_grain = Default( ontop_grain, 0 )
Y = ( luma1 == 0 ) && ( luma2 == 0 ) && ( luma3 == 0 ) ? 2 : 3
U = ( chroma1 == 0 ) && ( chroma2 == 0 ) && ( chroma3 == 0 ) ? 2 : 3
V = ( chroma1 == 0 ) && ( chroma2 == 0 ) && ( chroma3 == 0 ) ? 2 : 3
#-----------------------------------------------------------------------------------
yExprU = "0-0;255-65535;65535-65535"
cExprU = "0-0;128-32768;255-65535;65535-65535"
src16 = lsb_in ? input : TVrange ? input.Dither_convert_8_to_16()
\ : StackVertical(input.Gen_null_lsb(),input).SmoothCurve16(Ycurve="0-0;255-65535;65535-65535",
\ Ucurve="0-0;128-32768;255-65535;65535-65535",
\ Vcurve="0-0;128-32768;255-65535;65535-65535",
\ interp=0,limiter=false, TVrange=0, smooth=0, dither=-1)
src8 = !lsb_in ? input : TVrange ? input.DitherPost( mode=6 )
\ : input.SmoothCurve16( Ycurve= ( "0-0;65535-255" ),
\ Ucurve= ( "0-0;32768-128;65535-255"),
\ Vcurve= ( "0-0;32768-128;65535-255"),
\ interp=0, smooth=10,limiter=false, TVrange=0 ).Dither_get_lsb()
last =src8
#-----------------------------------------------------------------------------------
chroma = ( chroma1 == 0 ) && ( chroma2 == 0 ) && ( chroma3 == 0 ) ? false : true
thr_det = 2 + Round (Dither_max (thr - 0.35, 0) / 0.3)
td_lo = Dither_max (thr_det * 0.75, 1)
td_hi = Dither_max (thr_det, 1)
mexpr = Dither_make_expr_gate (td_lo, td_hi)
msk1 = TEdgeMask( link=2, preblur=true, valon=-1, u=chroma?1:0, v=chroma?1:0 )
msk2 = tcanny(sigma=1.2, mode=3)
msk = emask == 1 ? msk1.mt_lut (expr=mexpr, u=chroma?3:1,v=chroma?3:1):
\ msk2.mt_lut (expr=mexpr, u=chroma?3:1,v=chroma?3:1)
msk = msk1.mt_deflate(u=chroma?3:1, v=chroma?3:1)
msk = mask_removegrain ? msk1.Dither_removegrain_emul(20, chroma?20:-1):msk1
#-----------------------------------------------------------------------------------
gf_o = src16.f3kdb(range=_range,Y=_Y,Cb=_Cb,Cr=_Cr,output_mode=1,input_mode=1,input_depth=16,output_depth = 16,dither_algo=da,dynamic_grain=dr,keep_tv_range=TVrange)
gf_o = gf_o.Dither_limit_dif16 (src16, thr=thr , elast=elast, Y=Y, U=U, V=V)
#-----------------------------------------------------------------------------------
o = gf_o
o8 = TVrange ? gf_o.DitherPost( mode=6 )
\ : gf_o.SmoothCurve16( Ycurve= ( "0-0;65535-255" ),
\ Ucurve= ( "0-0;32768-128;65535-255"),
\ Vcurve= ( "0-0;32768-128;65535-255"),
\ interp=0, smooth=10,limiter=false, TVrange=0 ).Dither_get_lsb()
oblr = o8
ox = o8.width
oy = o8.height
sx1 = m4(ox/float(0.90))
sy1 = m4(oy/float(0.90))
sx1a = m4((ox+sx1)/2.0)
sy1a = m4((oy+sy1)/2.0)
sx2 = m4(ox/float(0.70))
sy2 = m4(oy/float(0.70))
sx2a = m4((ox+sx2)/2.0)
sy2a = m4((oy+sy2)/2.0)
sx3 = m4(ox/float(0.60))
sy3 = m4(oy/float(0.60))
sx3a = m4((ox+sx3)/2.0)
sy3a = m4((oy+sy3)/2.0)
#-----------------------------------------------------------------------------------
gL1_msb = BC ? BlankClip(o.Dither_get_msb,width=sx1, height=sy1, color_yuv=$808080):o.Dither_get_msb
gL1_lsb = BC ? BlankClip(o.Dither_get_lsb,width=sx1, height=sy1, color_yuv=$808080):o.Dither_get_lsb
gL1 = StackVertical(gL1_msb,gL1_lsb)
gL12= gL1.f3kdb(range=_range,Y=_Y,Cb=_Cb,Cr=_Cr,grainY=luma1,grainC=chroma1,dither_algo=da,dynamic_grain=dr,keep_tv_range=TVrange,
\ output_mode=1,input_mode=1,input_depth=16,output_depth = 16)
gL12_msb= gL12.Dither_get_msb
gL12_lsb= gL12.Dither_get_lsb
gs1_msb = (luma1!=0 && chroma1!=0)? gL12_msb.TemporalSoften(1, 255, 255, scenechange=255, mode=2)
\ : luma1!=0 ? gL12_msb.TemporalSoften(1, 255, 0, scenechange=255, mode=2)
\ : chroma1!=0 ? gL12_msb.TemporalSoften(1, 0, 255, scenechange=255, mode=2)
\ : gL12_msb
gs1_lsb = (luma1!=0 && chroma1!=0)? gL12_lsb.TemporalSoften(1, 255, 255, scenechange=255, mode=2)
\ : luma1!=0 ? gL12_lsb.TemporalSoften(1, 255, 0, scenechange=255, mode=2)
\ : chroma1!=0 ? gL12_lsb.TemporalSoften(1, 0, 255, scenechange=255, mode=2)
\ : gL12_lsb
gm1_msb = (temp == 0) ? gL12_msb
\ : (temp == 100) ? gs1_msb
\ : (luma1!=0 && chroma1!=0)? Merge(gL12_msb, gs1_msb, temp/300.)
\ : luma1!=0 ? MergeLuma(gL12_msb, gs1_msb, temp/300.)
\ : chroma1!=0 ? MergeChroma(gL12_msb, gs1_msb, temp/300.)
\ : gL12_msb
gm1_lsb = (temp == 0) ? gL12_lsb
\ : (temp == 100) ? gs1_lsb
\ : (luma1!=0 && chroma1!=0)? Merge(gL12_lsb, gs1_lsb, temp/300.)
\ : luma1!=0 ? MergeLuma(gL12_lsb, gs1_lsb, temp/300.)
\ : chroma1!=0 ? MergeChroma(gL12_lsb, gs1_lsb, temp/300.)
\ : gL12_lsb
gm1 =StackVertical(gm1_msb,gm1_lsb)
gL1=Dither_add16(gL1, gm1, dif=true, Y=Y, U=U, V=V)
gL1 = (sx1==ox && sy1==oy) ? gL1: gL1.Dither_resize16nr(ox,oy,a1=-0.2,a2=0.6)
#-----------------------------------------------------------------------------------
gL2_msb = BC ? BlankClip(o.Dither_get_msb,width=sx2, height=sy2, color_yuv=$808080):o.Dither_get_msb
gL2_lsb = BC ? BlankClip(o.Dither_get_lsb,width=sx2, height=sy2, color_yuv=$808080):o.Dither_get_lsb
gL2 = StackVertical(gL2_msb,gL2_lsb)
gL22 = gL2.f3kdb(range=_range,Y=_Y,Cb=_Cb,Cr=_Cr,grainY=luma2,grainC=chroma2,dither_algo=da,dynamic_grain=dr,keep_tv_range=TVrange,
\ output_mode=1,input_mode=1,input_depth=16,output_depth = 16)
gL22_msb= gL22.Dither_get_msb
gL22_lsb= gL22.Dither_get_lsb
gs2_msb = (luma2!=0 && chroma2!=0)? gL22_msb.TemporalSoften(1, 255, 255, scenechange=255, mode=2)
\ : luma2!=0 ? gL22_msb.TemporalSoften(1, 255, 0, scenechange=255, mode=2)
\ : chroma2!=0 ? gL22_msb.TemporalSoften(1, 0, 255, scenechange=255, mode=2)
\ : gL22_msb
gs2_lsb = (luma2!=0 && chroma2!=0)? gL22_lsb.TemporalSoften(1, 255, 255, scenechange=255, mode=2)
\ : luma2!=0 ? gL22_lsb.TemporalSoften(1, 255, 0, scenechange=255, mode=2)
\ : chroma2!=0 ? gL22_lsb.TemporalSoften(1, 0, 255, scenechange=255, mode=2)
\ : gL22_lsb
gm2_msb = (temp == 0) ? gL22_msb
\ : (temp == 100) ? gs2_msb
\ : (luma2!=0 && chroma2!=0)? Merge(gL22_msb, gs2_msb, temp/150.)
\ : luma2!=0 ? MergeLuma(gL22_msb, gs2_msb, temp/150.)
\ : chroma2!=0 ? MergeChroma(gL22_msb, gs2_msb, temp/150.)
\ : gL22_msb
gm2_lsb = (temp == 0) ? gL22_lsb
\ : (temp == 100) ? gs2_lsb
\ : (luma2!=0 && chroma2!=0)? Merge(gL22_lsb, gs2_lsb, temp/150.)
\ : luma2!=0 ? MergeLuma(gL22_lsb, gs2_lsb, temp/150.)
\ : chroma2!=0 ? MergeChroma(gL22_lsb, gs2_lsb, temp/150.)
\ : gL22_lsb
gm2 = StackVertical(gm2_msb,gm2_lsb)
gL2=Dither_add16(gL2, gm2, dif=true, Y=Y, U=U, V=V)
gL2 = (sx2==ox && sy2==oy) ? gL2: gL2.Dither_resize16nr(ox,oy,a1=-0.32,a2=0.66)
#-----------------------------------------------------------------------------------
gL3_msb = BC ? BlankClip(o.Dither_get_msb,width=sx3, height=sy3, color_yuv=$808080):o.Dither_get_msb
gL3_lsb = BC ? BlankClip(o.Dither_get_lsb,width=sx3, height=sy3, color_yuv=$808080):o.Dither_get_lsb
gL3 = StackVertical(gL3_msb,gL3_lsb)
gL32 = gL3.f3kdb(range=_range,Y=_Y,Cb=_Cb,Cr=_Cr,grainY=luma3,grainC=chroma3,dither_algo=da,dynamic_grain=dr,keep_tv_range=TVrange,
\ output_mode=1,input_mode=1,input_depth=16,output_depth = 16)
gL32_msb= gL32.Dither_get_msb
gL32_lsb= gL32.Dither_get_lsb
gs3_msb = (luma3!=0 && chroma3!=0)? gL32_msb.TemporalSoften(1, 255, 255, scenechange=255, mode=2)
\ : luma2!=0 ? gL32_msb.TemporalSoften(1, 255, 0, scenechange=255, mode=2)
\ : chroma2!=0 ? gL32_msb.TemporalSoften(1, 0, 255, scenechange=255, mode=2)
\ : gL32_msb
gs3_lsb = (luma3!=0 && chroma3!=0)? gL32_lsb.TemporalSoften(1, 255, 255, scenechange=255, mode=2)
\ : luma3!=0 ? gL32_lsb.TemporalSoften(1, 255, 0, scenechange=255, mode=2)
\ : chroma3!=0 ? gL32_lsb.TemporalSoften(1, 0, 255, scenechange=255, mode=2)
\ : gL32_lsb
gm3_msb = (temp == 0) ? gL32_msb
\ : (temp == 100) ? gs3_msb
\ : (luma3!=0 && chroma3!=0)? Merge(gL32_msb, gs3_msb, temp/100.)
\ : luma3!=0 ? MergeLuma(gL32_msb, gs3_msb, temp/100.)
\ : chroma3!=0 ? MergeChroma(gL32_msb, gs3_msb, temp/100.)
\ : gL32_msb
gm3_lsb = (temp == 0) ? gL32_lsb
\ : (temp == 100) ? gs3_lsb
\ : (luma3!=0 && chroma3!=0)? Merge(gL32_lsb, gs3_lsb, temp/100.)
\ : luma3!=0 ? MergeLuma(gL32_lsb, gs3_lsb, temp/100.)
\ : chroma3!=0 ? MergeChroma(gL32_lsb, gs3_lsb, temp/100.)
\ : gL32_lsb
gm3 = StackVertical(gm3_msb,gm3_lsb)
gL3=Dither_add16(gL3, gm3, dif=true, Y=Y, U=U, V=V)
gL3 = (sx3==ox && sy3==oy) ? gL3: gL3.Dither_resize16nr(ox,oy,a1=-0.6,a2=0.8)
#-----------------------------------------------------------------------------------
grainLayer = gL1
\ .Dither_merge16_8(gL2,
\ oblr.mt_lut("x "+string(24)+" < 0 x "+string(56)+" > 255 255 "+string(56)+" "+string(24)+" - / x "+string(24)+" - * ? ?", U=1,
\ V=1),luma=chroma,U=chroma?3:1, V=chroma?3:1)
\ .Dither_merge16_8(gL3,
\ oblr.mt_lut("x "+string(128)+" < 0 x "+string(160)+" > 255 255 "+string(160)+" "+string(128)+" - / x "+string(128)+" - * ? ?",
\ U= 1,V=1),luma=chroma, U=chroma?3:1, V=chroma?3:1)
grainlayer = (ontop_grain==0) ? grainLayer :
\ grainLayer.f3kdb(range=_range,Y=_Y,Cb=_Cb,Cr=_Cr,output_mode=1,input_mode=1,input_depth=16,output_depth =16,
\ grainY=ontop_grain,grainC=0,dither_algo=da,dynamic_grain=dr,keep_tv_range=TVrange)
#-----------------------------------------------------------------------------------
gf= o.Dither_add16(grainLayer, dif=true, U=chroma?3:2, V=chroma?3:2)
gf= gf.Dither_limit_dif16 (gf_o, thr=thr, elast=3.0, Y=3, U=3, V=3)
result16 = emask==0 ? gf :
\ Dither_merge16_8( gf, src16, msk, luma=true, u=chroma?3:4, v=chroma?3:4 )
result = lsb ? result16:TVrange ? gf.DitherPost( mode=6 )
\ : gf.SmoothCurve16( Ycurve= ( "0-0;65535-255" ),
\ Ucurve= ( "0-0;32768-128;65535-255"),
\ Vcurve= ( "0-0;32768-128;65535-255"),
\ interp=0, smooth=10,limiter=false, TVrange=0 ).Dither_get_lsb()
return result
}
# ==============================================
function m4(float x) {return( x<16?16:int(round(x/4.0)*4)) }
Function Gen_null_lsb (clip src){ return BlankClip(src, color_yuv=0) }