Floyd-Steinberg用于像素着色器的抖动替代品

Agn*_*kas 11 image-processing glsl dithering pixel-shader

我知道Floyd-Steinberg抖动算法不能用像素着色器实现,因为该算法是严格顺序的.但也许存在一些高度并行的抖动算法,它的视觉输出类似于Floyd-Steinberg算法?

所以问题是 - 什么是抖动算法适合在像素着色器(最好是GLSL)上实现,输出质量(非常)类似于Floyd-Steinberg抖动?

BTW.允许多次传递算法,直到不超过2次传递,并且这些传递之间的CPU开销很小.

有任何想法吗 ?

编辑:
我需要从24位颜色到21位颜色抖动.
(也就是说 - 我需要将8位/通道转换为7位/通道.)

编辑2 也许我没有很好地解释问题.所以我会尝试扩展一些确切的问题.问题是这个 - 考虑一下我们有这张照片:
替代文字
我们有上面的图片,但用抖动算法处理:
替代文字
现在这是测试你的抖动对我有好处的程序:
1.在Photoshop中将这些图片作为一张图片加载2层.
2.选择"图层"混合模式为"差异".
3.对图层执行"合并可见"操作,以获得一个图层.
4.执行操作=>图像/调整/均衡

之后你必须得到这样的图像:
替代文字
正如你所看到的那样 - 单调红色的中间像素根本没有抖动.左右图像区域的抖动也有点不同.尝试用这种行为重建抖动算法.

Mar*_*som 5

您可以使用有序抖动。它看起来比 Floyd-Steinberg 更粗糙,但像素之间没有依赖性。

编辑:由于您只删除了一点,所以这几乎变得微不足道。有序抖动背后的原理是创建一种使过渡阈值产生偏差的模式;在这种情况下,偏差将为 0 或 1,图案将为 2x2 像素。这两项更改一起将使该模式比维基百科文章中的模式更不令人讨厌 - 您甚至可能比 Floyd-Steinberg 更喜欢它。

这是一些伪代码:

bias = (X xor Y) and 0x01
value = pixel + bias
if value > 255: value = 255
pixel = value and 0x7e
Run Code Online (Sandbox Code Playgroud)

编辑2:这是我的差异结果,尽我所能。如果不知道如何将 7 位值映射回 8 位,我就无法做得更好。

替代文本


Ned*_*der 2

如果从 8 位减少到 7 位,则几乎不会丢弃任何信息。你确定你还需要犹豫吗?

如果您需要抖动,添加随机噪声然后进行剪辑,这对您的应用程序来说非常有用。