消除抖动噪声的正确方法是什么?


9

当减小色彩深度并以2位噪声抖动(n =] 0.5,1.5 [并且output = floor(input *(2 ^ bits-1)+ n))时,值范围的两端(输入0.0和1.0 )很吵。希望它们是纯色的。

例如:https//www.shadertoy.com/view/llsfz4

噪音梯度 (上图是shadertoy的屏幕截图,描绘了一个渐变,并且两端分别为纯白色和黑色,但噪声较大)

当然,可以通过压缩值范围来解决问题,以便两端始终取整为单个值。不过,这感觉有点骇人听闻,我想知道是否有办法“适当地”实现此功能?


由于某种原因,shadertoy无法在我的浏览器上运行。您能张贴一张/一些简单的图像来说明您的意思吗?
西蒙F

1
它不应该更像n =]-1,1 [吗?
JarkkoL

@JarkkoL那么,将浮点转换为整数的公式为output = floor(input * intmax + n),其中n = 0.5,没有噪音,因为您希望(例如)> = 0.5向上舍入,但<0.5向下舍入。这就是为什么噪声“居中”于0.5的原因。
hotmultimedia

@SimonF添加了shadertoy的图像
hotmultimedia

1
看来您是在截断输出而不是舍入输出(如GPU一样)-舍入,至少可以得到合适的白色:shadertoy.com/view/MlsfD7(图片:i.stack.imgur.com/kxQWl.png
Mikkel Gjoel '17

Answers:


8

TL; DR:由于夹持,在0和1的边缘情况下2 * 1LSB三角pdf抖动中断。一种解决方案是在这些边缘情况下使用1位均匀抖动。

我要添加第二个答案,因为发现结果比我原先认为的要复杂一些。看来这个问题是“待办事项:需要限制?” 在我的代码中,因为我在2012年从规范化切换到三角抖动...。终于可以看一下了:)整个帖子中使用的解决方案/图像的完整代码:https : //www.shadertoy.com/view/llXfzS

首先,当我们使用2 * 1LSB三角pdf抖动将信号量化为3位时,这就是我们要研究的问题:

输出 -本质上是hotmultimedia展示的内容。

随着对比度的增加,问题中描述的效果变得显而易见:在边缘情况下,输出结果不会平均为黑/白(实际上,在这样做之前,其输出范围远远超过了0/1)。

在此处输入图片说明

查看图表可提供更多的见解:

在此处输入图片说明 (灰色线标记为0/1,灰色也是我们试图输出的信号,黄线是抖动/量化输出的平均值,红色是误差(信号平均值))。

有趣的是,平均输出不仅在极限处不是0/1,而且不是线性的(可能是由于噪声的三角形pdf)。观察下端,可以直观地看出输出为何会发散:当抖动信号开始包含负值时,钳位输出会更改输出的较低抖动部分的值(即负值),从而增加平均值。图示似乎井然有序(均匀,对称的2LSB抖动,平均值仍为黄色):

在此处输入图片说明

现在,如果仅使用1LSB归一化的抖动,则边缘情况完全没有问题,但是当然,我们失去了三角形抖动的良好特性(请参见本演示文稿)。

在此处输入图片说明

一个(实用的,经验的)解决方案(hack)将恢复为[-0.5; 0.5 [边缘抖动的均匀抖动:

float dithertri = (rnd.x + rnd.y - 1.0); //note: symmetric, triangular dither, [-1;1[
float dithernorm = rnd.x - 0.5; //note: symmetric, uniform dither [-0.5;0.5[

float sizt_lo = clamp( v/(0.5/7.0), 0.0, 1.0 );
float sizt_hi = 1.0 - clamp( (v-6.5/7.0)/(1.0-6.5/7.0), 0.0, 1.0 );

dither = lerp( dithernorm, dithertri, min(sizt_lo, sizt_hi) );

它在固定边沿的同时,在剩余范围内保持三角抖动不变:

在此处输入图片说明

因此,请不要回答您的问题:我不知道是否存在数学上更可靠的解决方案,并且同样渴望知道过去的大师们所做的事情:)在那之前,至少我们有一个骇人听闻的技巧来保持我们的代码正常运行。

编辑
我可能应该涵盖仅简单压缩信号的问题中给出的解决方法。因为在边缘情况下平均值不是线性的,所以简单地压缩输入信号不会产生理想的结果-尽管它确实可以修复端点: 在此处输入图片说明

参考文献


令人惊奇的是,边缘处的束带提供了完美的外观效果。我希望至少会有一些偏差:P
艾伦·沃尔夫

是的,我也很惊讶:)我相信它能奏效,因为我们线性地降低了抖动幅度,并且信号衰减的速率相同。因此,至少规模是匹配的...但是我同意有趣的是,直接混合分布似乎没有负面影响。
Mikkel Gjoel '17

@MikkelGjoel不幸的是,由于代码中的错误,您的信念是错误的。您为两者重新使用了相同的RNG,dithertridithernorm不是独立使用了RNG 。一旦您完成所有数学运算并取消所有条款,您就会发现自己根本就没有忍耐力!取而代之的是,该代码的作用就像是在处硬中断v < 0.5 / depth || v > 1 - 0.5/depth,立即切换到此处的均匀分布。并不是说它会消除您拥有的精美抖动,而是不必要地复杂了。修复错误实际上是不好的,您最终会得到更糟的抖动。只需使用硬截止值即可。
orlp

进行更深入的研究后,我在您的sharttoy中发现了另一个问题,即在对样本求平均时,您不进行伽玛校正(您在非线性的sRGB空间中求平均值)。如果您正确地处理了伽玛,很遗憾,我们发现您还没有完成。我们必须调整噪声以应对伽玛校正。这是显示问题的shadertoyshadertoy.com/view/3tf3Dn。我尝试了很多事情,但无法正常工作,所以我在这里发布了一个问题:computergraphics.stackexchange.com/questions/8793/…
orlp

3

我不确定我能否完全回答您的问题,但是我会补充一些想法,也许我们可以一起得出答案:)

首先,问题的根源对我来说还不清楚:为什么您认为在每种其他颜色都带有噪点的情况下最好拥有干净的黑白?抖动后的理想结果是原始信号具有完全均匀的噪声。如果黑白不同,则您的噪声将取决于信号(不过这可能很好,因为它总是发生在固定颜色的地方)。

就是说,在某些情况下,无论是白色还是黑色都确实存在噪声(我不知道用例需要黑色和白色同时“干净”):在将添加的混合粒子渲染为四边形时,在纹理上,您不希望在整个四边形中添加噪点,因为这也会在纹理外部显示。一种解决方案是抵消噪声,因此,您无需添加[-0.5; 1.5 [,而是添加[-2.0; 0.0 [(即,减去2位噪声))。这是一个经验性的解决方案,但我不知道有一种更正确的方法。考虑一下,您可能还希望增强信号以补偿丢失的强度...

有点相关的是,蒂莫西·洛特斯(Timothy Lottes)在GDC演讲中谈到了如何在最需要频谱的部分整形噪声,以减少频谱亮端的噪声:http: //32ipi028l5q82yhj72224m8j-wpengine.netdna-ssl.com/wp-内容/上载/2016/03/GdcVdrLottes.pdf


(对不起,我不小心按下了Enter键,并且编辑时间限制已过期)示例中的用例就是其中一种情况:在3位显示设备上渲染浮点灰度图像。只需更改LSB,强度就会发生很大变化。我试图了解是否有任何“正确的方法”可以将最终值映射到纯色,例如压缩值范围并使最终值饱和。对此有什么数学解释?在示例公式中,输入值为1.0不会产生平均为7的输出,这让我感到困扰。
hotmultimedia

1

我已经将Mikkel Gjoel的将三角噪声抖动的想法简化为只需要一个RNG调用的简单函数。我已经删除了所有不必要的部分,因此应该很容易理解和理解。

// Dithers and quantizes color value c in [0, 1] to the given color depth.
// It's expected that rng contains a uniform random variable on [0, 1].
uint dither_quantize(float c, uint depth, float rng) {
    float cmax = float(depth) - 1.0;
    float ci = c * cmax;

    float d;
    if (ci < 0.5 || ci >= cmax - 0.5) {
        // Uniform distribution on [-0.5, 0.5] for edges.
        d = rng - 0.5;
    } else {
        // Symmetric triangular distribution on [-1, 1].
        d = (rng < 0.5) ? sqrt(2.0 * rng) - 1.0 : 1.0 - sqrt(2.0 - 2.0*rng);
    }

    return uint(clamp(ci + d + 0.5, 0.0, cmax));
}

对于想法和上下文,我将带您参考Mikkel Gjoel的回答。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.