-- f3kdb based grain generator
-- luma adaptive
-- temporal stabilization modifiable
Download:
f3kgrain_v0.2.avsi
OR
[syntax lang="avisynth" lines="f" filename="f3kgrain_v0.2.avsi"]###################################################
### ###
### f3kgrain ###
### ###
### by 06_taro - astrataro@gmail.com ###
### ###
### v0.2 - 14 March 2012 ###
### ###
###################################################
###
### Fast luma-adaptive grain generator
###
### Temporal soften strength of grain is changeable ( it can only be set on/off in f3kdb )
###
###
### +---------+
### | USAGE |
### +---------+
###
### f3kgrain()
###
### See below for explanation of parameters
###
### +----------------+
### | REQUIREMENTS |
### +----------------+
###
### -> f3kdb [v1.5.0]
### -> MaskTools2 [v2.0a48]
### -> RemoveGrain [v1.0pre]
###
### +-----------+
### | CHANGELOG |
### +-----------+
###
### v0.2 - 14 March 2012
### - Synchronize argument names with parameter names of f3kdb v1.5.0
###
### v0.1 - 02 Mar 2012
### - First release
###
Function f3kgrain(clip input, int "luma", int "chroma", int "mode", int "temp", int "adapt"){
luma = Default(luma, 64) # Luma grain strength
chroma = Default(chroma, 64) # Chroma grain strength
mode = Default(mode, 1) # random_algo_dither mode
temp = Default(temp, 50) # Temporal stabilization for grain (the higher, the more calm) [0=nervous,...,100=static]
adapt = Default(adapt, 64) # Brightness threshold for adaptative grain mask [-1=off, 0=input, 1...254, 255=invert]
# The higher, the less grain in dark areas & the more grain in bright areas
Assert( temp>=0 && temp<=100, "f3kgrain: invalid value for temp(0~100)!" )
Assert( adapt>=-1 && adapt<=255, "f3kgrain: invalid value for adapt(-1~255)!" )
Y = luma==0 ? 2 : 3
U = chroma==0 ? 2 : 3
V = chroma==0 ? 2 : 3
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)
ad = input.f3kdb(Y=0, Cb=0, Cr=0, grainY=luma, grainC=chroma, dynamic_grain=true, random_algo_grain=mode)
grain = mt_makediff(ad, input, Y=Y, U=U, V=V)
gsoft = (luma!=0 && chroma!=0) ? grain.TemporalSoften(1, 255, 255, scenechange=255, mode=2)
\ : luma!=0 ? grain.TemporalSoften(1, 255, 0, scenechange=255, mode=2)
\ : chroma!=0 ? grain.TemporalSoften(1, 0, 255, scenechange=255, mode=2)
\ : grain
gmerge = (temp == 0) ? grain
\ : (temp == 100) ? gsoft
\ : (luma!=0 && chroma!=0) ? Merge(grain, gsoft, temp/100.)
\ : luma!=0 ? MergeLuma(grain, gsoft, temp/100.)
\ : chroma!=0 ? MergeChroma(grain, gsoft, temp/100.)
\ : grain
adsoft = mt_adddiff(input, gmerge, Y=Y, U=U, V=V)
return adapt==-1 ? adsoft : mt_merge(adsoft, input, Lmask, luma=chroma!=0, Y=Y, U=U, V=V)
}
[/syntax]