誤差拡散法(1)

2012 / 08 / 23 by
Filed under: Coding の素 
Bookmark this on Delicious
[`livedoor` not found]
[`yahoo` not found]

カラーイメージを2値化しながらも、自然な濃淡を感じさせる手法ハーフトーニング。
それを実現するための2つの方法のうちの2つ目、誤差拡散法について見てみます。

前々回見たディザ法のうちの「組織的ディザ法」というのは、名が体を表していないのではないか、ということを述べましたが、この誤差拡散法ってのもの、ちょっとどうかと思う名づけです。といっても英語の Error Diffusion を直訳したもんなんですけどね。
じゃあどう呼ぶのか? 「差分振り分け法」というのが適切なんじゃないかなぁと思います。

この方法はどのようなことをするのか。

まず閾値は 256 諧調の中央である 127 に固定です。
で、評価ピクセルの諧調値と閾値 127 の比較で対象のピクセルを白か黒か決めるんですが、その際に、併せて、ある計算式に基づいて差分を求めます。そしてその差分を近傍ピクセルに振り分ける、ということをします。
そして、差分を受け取ったピクセルは、評価時に、そのピクセル自体の諧調値と差分とを加えた値を閾値 127 と比較することになります。

その計算式というは以下のようなものです。

f は閾値と評価する値(当該ピクセルの諧調値とそのピクセルに振り分けられた差分の合計)。
e は近傍ピクセルに振り分ける差分値です。


if (f > 127) {
  // このピクセルは白
  g = 255;
} else {
  // このピクセルは黒
  g = 0;
}
e = f - g;

そして、この e をどの範囲の近傍ピクセルにどのような比率で振り分けるのか、それによって誤差拡散法はいくつかの種類に分けられます。

ところで、ビットマップデータは左上からZ状に走査していきますよね。
あるピクセルが評価されているときには、上および左側のピクセルはすでに評価完了しており、白か黒かは定まっています。
なので、この誤差拡散法は、近傍ピクセルに差分を振り分けるといっても、上および左のピクセルには振り分けません。あくまでもこれから評価される右および下のピクセルに対して差分値を振り分けます。これはどの誤差拡散法でも共通です。

続く



Comments

Tell me what you're thinking...
and oh, if you want a pic to show with your comment, go get a gravatar!





WP-SpamFree by Pole Position Marketing