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

时间:2010-10-30 08:58:32

标签: image-processing glsl pixel-shader dithering

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

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

顺便说一句。允许多次传递算法,直到不超过2次传递,并且这些传递之间的CPU开销很小。

有什么想法吗?

编辑:我需要从24位颜色抖动到21位颜色。
(即 - 我需要将8位/通道转换为7位/通道。)

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

之后你必须得到这样的形象:
alt text
如你所见 - 单调红色的中间像素根本没有抖动。 左右图像区域的抖动也有点不同。尝试用这种行为重建抖动算法。

2 个答案:

答案 0 :(得分:4)

您可以使用ordered dither。它看起来比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

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

alt text

答案 1 :(得分:2)

如果你从8位减少到7位,你几乎不丢弃信息。你确定你甚至需要抖动吗?

如果您需要抖动,添加随机噪音然后剪辑,它将对您的应用程序有很大帮助。