フロイド-スタインバーグ・ディザリング

フロイド-スタインバーグ・ディザリングFloyd–Steinberg dithering)は画像用ディザリングアルゴリズムであり、1976年、ロバート・フロイドと Louis Steinberg が発表した。画像操作関係のソフトウェアで広く用いられており、例えば最大256色までしか使えないGIF形式への変換の際に使われている。

原画像(左)、通常の変換(中)、フロイド-スタインバーグ・ディザリングを用いた変換(右)
ダビデ像の画像にフロイド-スタインバーグ・ディザリングを施した例

ピクセル量子化誤差をそれに隣接するピクセル群に拡散させることでディザリングを実現するアルゴリズムである。隣接ピクセルへの誤差の分配は次のようになる。

星印 (*) が現在見ているピクセルを表している。

このアルゴリズムでは、画像を左から右、上から下にスキャンし、ピクセルの値を1つずつ量子化していく。毎回の量子化誤差は隣接するピクセル群に分配されるが、既に量子化が済んだピクセルの値は変更しない。これにより、あるピクセルの値が量子化によって切り下げられたら、次のピクセルにその誤差が反映されて切り上げられることになり、全体として量子化誤差がゼロに近づくことになる。

実装によっては、水平のスキャン方向を毎回逆にすることもある(蛇行式または牛耕式)。

以下に擬似コードを示す。

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

元のピクセル値が発色可能な色と色のちょうど中間だった場合、誤差拡散係数は市松模様のようなパターンを生成するように設定されている。例えば50%の灰色は白と黒の市松模様となる。最適なディザリングにするには、丸め誤差が結果に影響することを防止するため、量子化誤差を十分な精度で求める必要がある。

例えばグレースケールにおいて色深度を16ビットから8ビットにする場合、find_closest_palette_color() は次のように単純な丸めをすればよい。

find_closest_palette_color(oldpixel) = oldpixel / 256 * 256

参考文献 編集

  • Floyd–Steinberg Dithering (Graphics course project, Visgraf lab, Brazil)
  • R.W. Floyd, L. Steinberg, An adaptive algorithm for spatial grey scale. Proceedings of the Society of Information Display 17, 75–77 (1976).

外部リンク 編集

  • PTRANS Stand-alone ANSI-C programming language implementation.