版面规则
提问时请注意:尽量详细描述操作过程、AVS脚本内容等,最好能写出片名,只贴图有时无法看出问题原因。
提示:发布原创内容请尽量使用附件上传。使用网盘会出现过期失效的问题,请注意。
eric888a
帖子: 26
注册时间: 2013-05-02 19:16

F3KDB自適應腳本 (Ver. 1.5)

這原本只是自己拿來用的,所以很簡陋,有需要的人湊合著用吧
再加了一堆東西後這恐怕是不簡了, 感謝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)                        }
上次由 eric888a 在 2013-08-26 21:31,总共编辑 20 次。
头像
dgwxx
管理猿
帖子: 771
注册时间: 2010-09-19 20:42
联系: 网站

Re: 極簡版F3KDB自適應腳本

感谢分享。收集进文档库了。
日常推 @dgwxx: 基本没什么技术的话题,欢迎没事看看消遣。
► 显示剧情透露 平庸的rip
► 显示剧情透露 “不知道”的五大理由
eric888a
帖子: 26
注册时间: 2013-05-02 19:16

Re: 極簡版F3KDB自適應腳本

少打了一小段東西,已補上,現在可正常使用
littlepox
帖子: 116
注册时间: 2012-08-26 16:56

极简版f3kdb自适应脚本1.1

原帖地址:已合并主题帖,原帖置于楼上--BY304

用作者的话说就是随手写了个拿出来分享的。因为带了edgemask和分段处理,所以比起纯f3kdb更有优势;但是精简过度了去掉了range/Y/Cb/Cr等参数而使用默认,在部分较好的源上可能破坏力还是过大。现在把这些参数加了回去:
range,默认15;
Y,默认64;
Cb,默认64;
Cr,默认64;
dither_algo,默认3,即采用fs dither,但是有说建议8bit下编码改为2(ordered dither)更好;
dynamic_grain,默认true,注意flash3kyuv_deband默认是false,但是f3kdb_mod 1.0里面是开启的,这里也设置为true,觉得开动态噪点浪费码率的自己设为false。

其实负责到底的话,应该第一次deband+三个分段参数单独设置,但是那样等于加上4*5=20个输入参数。。。有EP到这种地步的还是自己修改avsi代码来的快。

下载地址:http://pan.baidu.com/share/link?shareid ... 3657779105
头像
紙飛行機
帖子: 4
注册时间: 2012-11-10 19:48

Re: 极简版f3kdb自适应脚本1.1

阿卡林前来支持……
eric888a
帖子: 26
注册时间: 2013-05-02 19:16

Re: F3KDB自適應腳本 (Ver. 1.2)

更新Ver. 1.2
eric888a
帖子: 26
注册时间: 2013-05-02 19:16

Re: F3KDB自適應腳本 (Ver. 1.2)

up to v1.3
-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

回到 “AviSynth”