Floyd-Steinberg-Dithering如何运作?

时间:2014-04-17 11:07:34

标签: image dithering

我目前正在尝试用Java实现Floyd-Steinberg-Dithering算法。在几次尝试失败后,我在阅读Wikipedia上列出的伪代码后遇到了一个问题。

for each y from top to bottom
for each x from left to right
  oldpixel  := pixel[x][y]
  newpixel  := find_closest_palette_color(oldpixel)
  pixel[x][y]  := newpixel
  quant_error  := oldpixel - newpixel
  pixel[x+1][y  ] := pixel[x+1][y  ] + 7/16 * quant_error
  pixel[x-1][y+1] := pixel[x-1][y+1] + 3/16 * quant_error
  pixel[x  ][y+1] := pixel[x  ][y+1] + 5/16 * quant_error
  pixel[x+1][y+1] := pixel[x+1][y+1] + 1/16 * quant_error

我想要实现的是将图像压缩成16色调色板。然而,在添加错误像素之后,我是否创造了甚至不存在于调色板中的全新颜色?

但是将整个图像强制放回到最后的调色板中是否足以使其工作?

提前致谢!

2 个答案:

答案 0 :(得分:1)

请注意,量化误差仅添加到尚未映射到调色板的像素(量化)!

这意味着在添加错误之后,这些像素也将被映射,并且它们的错误会向前传播到其他未处理的像素上。

在算法结束时,每个像素都将被映射,最后剩余的错误将被丢弃。

因此,在量化操作结束时,调色板外不应有任何像素。

答案 1 :(得分:0)

我使用了修改过的算法:

 for each y from 0 to ImageHeight-1
    for each x from 1 to ImageWidth-1
        oldpixel  := pixel[x][y]
        newpixel  := find_closest_palette_color(oldpixel)
        pixel[x][y]  := newpixel
        quant_error  := oldpixel - newpixel
        pixel[x+1][y  ] := pixel[x+1][y  ] + 7/16 * quant_error
        pixel[x-1][y+1] := pixel[x-1][y+1] + 3/16 * quant_error
        pixel[x  ][y+1] := pixel[x  ][y+1] + 5/16 * quant_error
        pixel[x+1][y+1] := pixel[x+1][y+1] + 1/16 * quant_error

and i have used this 16 colors palette:
               **B    G    R**
 black:          0,   0,   0
 blue:         127,   0,   0
 green:          0, 127,   0
 cyan:         127, 127,   0
 red:            0,   0, 127
 magenta:      127,   0,   0
 brown:        127,   0, 127
 gray:         191, 191, 191
 dark gray:     63,  63,  63
 light blue:   255,   0,   0
 light green:    0, 255,   0
 light cyan:   255, 255,   0
 light red:      0,   0, 255
 pink:         255,   0, 255
 yellow:         0, 255, 255
 white:        255, 255, 255

使用此调色板的结果更好,没有维基百科推荐的蛇形扫描。