弗洛伊德-斯坦伯格抖动算法的像素着色器替代方案

13
我知道Floyd-Steinberg抖动算法不能用像素着色器实现,因为该算法是严格顺序的。但也许存在一些高度并行的抖动算法,其视觉输出类似于Floyd-Steinberg算法?
所以问题是 - 有哪些适合在像素着色器(最好是GLSL)上实现,并且输出质量(非常)类似于Floyd-Steinberg抖动的抖动算法?
顺便说一句,多通道算法允许直到不超过2个通道,这些通道之间的CPU开销很小。
有什么想法吗?
编辑:我需要从24位颜色转换为21位颜色的抖动。(也就是说,我需要将8位/通道转换为7位/通道。)

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

之后,您必须获得这样的图像:
alt text
如您所见-单调红色的中间像素根本没有被抖动。 而左右图像区域的抖动略有不同。请尝试重构具有这种行为的抖动算法。


我很难理解你的结果。差异图表明你的 Floyd-Steinberg 输出包含值为 0 和 255 的组件,但这在 7 位中没有意义;它应该是 0 和 254,或者是 1 和 255。除非你正在使用从 0 到 126 的偶数颜色和从 129 到 255 的奇数颜色? - Mark Ransom
问题在于我不知道位的精确映射,这就是为什么我创建了这样的问题 - 重新研究程序X的抖动算法。 - Agnius Vasiliauskas
如果您能够发布结果图像,我们可能就能够找出位的映射关系。 - Mark Ransom
你的Floyd-Steinberg代码似乎也存在问题。输入图像的蓝色和绿色通道处处相同,所以算法应该在绿色和蓝色通道上产生相同的结果 - 但实际并非如此。 - Mark Ransom
其实我正在研究Photoshop渐变抖动算法,所以如果你有Photoshop - 只需使用抖动选项制作渐变即可。 - Agnius Vasiliauskas
2个回答

5
你可以使用有序抖动。它看起来比Floyd-Steinberg更粗糙,但像素之间没有依赖关系。 编辑:由于你只是删除一个位,这几乎变得微不足道。有序抖动的原理是创建一个偏向转换阈值的模式;在这种情况下,偏差将为0或1,模式将为2x2像素。这两个变化结合起来将使模式比维基百科文章中的模式 less obnoxious - 你甚至可能会喜欢它比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


有序抖动并不适用,因为它的视觉输出与Floyd-Steinberg抖动非常不同。(要看到巨大差异,请尝试将有序抖动和Steinberg抖动应用于单色区域较大的图像,并比较结果) - Agnius Vasiliauskas
@0x69,我在回答中承认输出的粗糙。您能告诉我们您正在生成什么位深度以及是否使用任何调色板吗? - Mark Ransom
@0x69,我也有一个编辑。我认为你会喜欢它,特别是在单调的颜色区域。 - Mark Ransom
能否提供真正的GLSL抖动代码,或者展示一下使用我的测试程序后得到的最终图像呢?请看我的第二次编辑。 - Agnius Vasiliauskas
我会给你加一分赞扬,但是我不能给你赏金点,因为:1.你的摇动有些不规则。 - Agnius Vasiliauskas
但我不能给你赏金点,因为:
  1. 你的有序抖动有些不规则(图案不连续)
  2. 抖动模式没有延伸到图像的边缘(应该是这样的-可以从测试图像中看到)。
  3. 正如我在原帖中所说,这个问题不是关于有序抖动,而是关于 Floyd-Steinberg 的替代方案或至少类似于随机噪声的抖动。
- Agnius Vasiliauskas

2

如果你从8位减少到7位,你几乎不会丢失任何信息。你确定你需要使用抖动吗?

如果你确实需要使用抖动,可以添加随机噪声,然后裁剪,这对你的应用程序来说就足够好了。


这是最接近我所做的,也没有更好的答案,因此我会将其标记为接受的答案。 - Agnius Vasiliauskas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接