$$ s '= s + n(s,r)$$
,使得当我们将信号量化为$ m $步时,舍入将最终使信号失真更少。
我已经有一个函数可以从此处在线性世界中工作,其中$ n $是$ [-1,1] $上的对称三角分布(需要注意的是,对于$ s $接近$ 0 $或$ 1 $,我们切换到$ [-\ frac {1} {2},\ frac {1} {2}] $上的均匀分布),因为它的意思是$ 0 $并适当地舍入了舍入(演示错误地忽略了gamma:https: //www.shadertoy.com/view/Wts3zH)。写出的此函数是(按大小顺序从上到下匹配):
$$ n(s,r)\ cdot(m-1)= \ begin {cases}
r-\ frac {1} {2}&s \ leq \ frac {1} {2(m-1)} \ vee s \ geq 1- \ frac {1} {2(m-1)} \\
\ sqrt {2r}-1&r <\ frac {1} {2} \\
1-\ sqrt {2-2r}&r \ geq \ frac {1} {2} \\
\ end {cases} $$
但是,在sRGB文件中,我们必须处理伽玛。本质上,我们有一个可逆变换$ t $(通常$ t(x)= x ^ {2.4} $)在量化之前/之后应用,以分配更多的步骤来降低强度。
这意味着查看时的平均颜色不再(现在忽略量化):
$$ \ int_0 ^ 1 \ left(s + n(s,r)\ right)\ text {d} r = s $$
而是$
如何更改噪声函数$ n $,从而使抖动后的平均颜色再次变为$ s $,同时又保持三角形分布的属性
为记录起见,三角形分布给出的主要属性是舍入后的方差变为常数:
$$ \ int_0 ^ 1 \ left(\ left [(s + n(s,r))(m-1)\ right] /(m-1)-s \ right)^ 2 \ text {d} r = c $$
其中$ [x] $表示四舍五入到最接近的整数的$ x $。请注意,这仅在$ n $域的三角形部分中成立,因此当$ \ frac {1} {2(m-1)} \ leq s \ leq 1- \ frac {1} {2(m- 1)} $。
如果您想试一试,这里有一个演示可以向您展示抖动的错误,该错误具有伽玛校正:https://www.shadertoy.com/view / 3tf3Dn。
评论
我想现在我明白了你的问题。我不熟悉您实现提到的功能的语言,是否可以用“数学符号”显式地记下$ n(s,r)$? :)(顺便说一句:我假设$ r $在$ [0,1] $上是统一的,对吧?)@flawr您只需要查看dither_quantize。有c是$ s $,rng是$ r $,深度是$ m $,ci是$ s \ cdot(m-1)$,d是$ n(s,r)\ cdot(m-1)$。一种 ? b:如果a否则为c,则c表示b,clamp(x,lo,hi)为min(max(x,lo),hi)。最后,uint(x)基本上是$ \ lfloor x \ rfloor $。
@flawr这里不是特别干净的一件事是,我们不要忘记$ n(s,r)$也取决于$ m $,因为较少的量化步骤意味着噪声必须增大。是$ n(s,r)\ cdot(m-1)$不会像$ m $那样改变。
@flawr您可以通过另一种方式查看它,我在这里发布了它:math.stackexchange.com/questions/3200249/…。我将上述噪声函数与单位平方进行卷积,以求出在添加噪声后信号$ s $被量化为$ [s] $的概率。然后,您可以将整个量化操作视为将几个随机变量相加(例如,一个用于$ [s] -1 $的机会,一个用于$ [s] $的机会,一个用于$ [s] $ 1的机会)。 />