ディザ法(1)

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

白と黒の2色だけで、カラーイメージの自然な濃淡を表現する方法。今回はディザ法について見てみます。

閾値法は、イメージデータの全ピクセルを同一の閾値で判定し、白か黒に置き換える方法でした。対してディザ法は、ピクセルごとに異なる閾値で判定し、白か黒に置き換える方法です。
如何にしてピクセルごとに異なる閾値を設定するのか。その設定手段により、ディザ法は以下の2つに分けられます。

  1. ランダム・ディザ法
  2. 組織的ディザ法

その他にもディザ法はあるっぽいんですが、この2つだけを扱います。

ランダム・ディザとはその名のとおり、各ピクセルごとにランダムで閾値を決定します。
コードにすると以下のような感じになりますか。

var threshold:int = Math.random() * 0xFF >> 0;
var gray:uint = BitmapData.getPixel(x, y) & 0xFF;
var replacedColor:uint = gray > threshold ? 0xFFFFFF : 0x000000;
BitmapData.setPixel(x, y, replacedColor);

組織的ディザ法は、英語では Ordered Dithering といい、4×4 のマトリックスを型紙として、ピクセルごとの閾値を決めます(マトリックスのサイズは4×4に限らないようですが、最も一般的なのが 4×4 のようなので、それだけを扱います)。このマトリックスはパターンとも呼ばれるようです。

マトリックスには 0 ~ 15 の異なる整数 16 個が1つずつ格納されます。つまり各ピクセルを 16 段階で評価して白か黒かに置き換えるわけですね。

ところでピクセルの諧調は 0 ~ 255 の 256 段階です。だからマトリックスの段階も 256 に合わせなければならない。
そのため、マトリックスの各要素を 16 倍し、さらに各段階の中央ということで 8 を加算する、という変換処理をおこなう必要があります。

あるいは逆にピクセルの段階をマトリックスの 16 に合わせるという考え方もアリですね。
その場合は、ピクセル階調の方を 16 で割れば良いのです。

このように段階をそろえたマトリックスとピクセルとを突き合わせるんですが、その突き合わせ方はというと、イメージデータを 4×4 の Rectangle に切り分けて、4×4 のマトリックスの、縦横同一座標の部分を突き合わせることになります。
要するにピクセルごとに走査するのではなく、4×4 の 16 ピクセル 1 ブロックごとに走査するんですね。そのため 4×4 のブロックごとに単一のパターンが繰り返されることになります。

組織的ディザ法」というページに、その突き合わせイメージが図で説明されています。

ところで 0 ~ 15 の数値は、マトリックスにどのような順番で格納されるのか。
それによって、組織的ディザ法は以下の6つの型に分かれるとのことです。

  1. Bayer 型
  2. ハーフトーン型
  3. screw 型
  4. screw 変形型
  5. 中間調強調型
  6. Dot Concentrate 型

この型リストは、上記で示した「組織的ディザ法」というページに示されています。

そんなわけで、6個のパターンを適用すると、イメージはどのように2値化されるのか、コード組んでみました。

Dither – wonderfl build flash online

比較対象になるよう、画像ファイルは英語版ウィキペディアの "Dither" で使われている画像をお借りしました。
ここにある dither 適用結果の画像と見比べてみてください。

ところで、全部ボタン押して確認してもらえれば、お分かりかと思いますが、この中で利用価値がありそうなのは Bayer 型だけっぽいです。
Bayer 型は灰色に見える部分が生成され、確かに自然な濃淡表現という感じがします。
でもそれ以外は、いわゆる新聞や雑誌など、印刷物のハーフトーンと呼ばれる、白地に黒い点が表示される感じで、自然な濃淡って感じじゃない。
それより何より、screw 型以降の4つは基本どれも同じっしょ。中央からぐるぐる外側に向かって段階値が増えていってるんですが、右回りなのか左回りなのか、幾つ飛びなのか、とかで、有意差と言ってよいほど違いがあると思えない。
だから Bayer 型だけ使えばイイんじゃないのかなぁ、と思います、

ところで、この「組織的ディザ法」って訳語、いまいち意味が通じないと思いません?
英語のは「マトリックスによって順番づけられたディザ法」ってニュアンスなんじゃないかと思うんですよねー。
なお、wikipedia の当該ページでは配列ディザという言い方をしていますが、こっちの方のがまだ妥当な気がします。



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