Files
sd-ie-lib/source/ie_processing/denoise.sex
T
Igor Elovikov 45027054c2 pcloud update
2020-07-10 13:38:46 +01:00

64 lines
1.4 KiB
Plaintext

declare_inputs("denoise")
INV_SQRT_OF_2PI = 0.39894228040143267793994605993439
INV_PI = 0.31830988618379067153776752674503
:: set MRAD = 8
:: set MRADQ = MRAD * MRAD
tolerance = 0.01
radius = floor(sigma * kSigma + 0.5)
radQ = radius * radius
invSigmaQx2 = 0.5 / (sigma * sigma)
invSigmaQx2PI = INV_PI * invSigmaQx2
invThresholdSqx2 = 0.5 / (threshold * threshold)
invThresholdSqrt2PI = INV_SQRT_OF_2PI / threshold
uv = get_float2("$pos")
size = get_float2("$size")
centrPx = samplelum(uv, 0, 0)
zBuff = 0.0
aBuff = 0.0
radius_ceil = -radius - tolerance
radius_floor = radius + tolerance
:: for dx in range(-MRAD, MRAD + 1)
pt = sqrt(radQ - {{ dx * dx | float }})
pt = ceil(pt)
use_iteration_dx = {{ dx | float }} > radius_ceil and {{ dx | float }} < radius_floor
pt_ceil = -pt - tolerance
pt_floor = pt + tolerance
:: for dy in range(-MRAD, MRAD + 1)
use_iteration_dy = {{ dy | float }} > pt_ceil and {{ dy | float }} < pt_floor
use_iteration = use_iteration_dx and use_iteration_dy
d = vector2({{ dx | float }}, {{ dy | float}})
blurFactor = exp( -(d ^ d) * invSigmaQx2 ) * invSigmaQx2PI
walkPx = samplelum(uv + d / size, 0, 0)
dc = walkPx - centrPx
deltaFactor = exp( - dc * dc * invThresholdSqx2) * invThresholdSqrt2PI * blurFactor
zBuff = zBuff + deltaFactor if use_iteration else zBuff
aBuff = aBuff + deltaFactor * walkPx if use_iteration else aBuff
:: endfor
:: endfor
res = aBuff / zBuff
_OUT_ = merge_float4(res, res, res, res)