我目前正在尝试用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色调色板。然而,在添加错误像素之后,我是否创造了甚至不存在于调色板中的全新颜色?
但是将整个图像强制放回到最后的调色板中是否足以使其工作?
提前致谢!
答案 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
使用此调色板的结果更好,没有维基百科推荐的蛇形扫描。