1

現在、Java で Floyd-Steinberg-Dithering アルゴリズムを実装しようとしています。数回失敗した後、ウィキペディアにリストされている疑似コードを読んだ後、質問に出くわしました。

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 色の​​パレットに押しつぶすことです。しかし、ピクセルにエラーを追加した後、パレットにも存在しない完全に新しい色を作成していませんか?

しかし、最後に画像全体を強制的にカラー パレットに戻せば、これで十分でしょうか?

前もって感謝します!

4

2 に答える 2

1

量子化されたエラーは、まだパレットにマッピング (量子化) されていないピクセルにのみ追加されることに注意してください!

これは、エラーが追加された後、これらのピクセルもマップされ、そのエラーが他の未処理のピクセルに伝播されることを意味します。

アルゴリズムの最後に、すべてのピクセルがマッピングされ、最終的に残ったエラーが破棄されます。

その結果、量子化操作の最後に、パレットの外側にピクセルを持たないようにする必要があります。

于 2014-04-17T11:22:05.600 に答える
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

結果は、ウィキペディアで推奨されている蛇行スキャンを使用せずに、このパレットを使用した方が優れていました。

于 2015-12-16T17:31:46.037 に答える