配列ディザリング

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動
白黒2値のみを使った場合、4x4の配列ディザリングにおける特徴的な17つのパターンをはっきりと見ることができる。なお上図においては、ディザリングされていないグレースケールのグラデーションの上に、対応する各ディザパターンが表示されている。

配列ディザリング(はいれつでぃざりんぐ)とは、画像をディザリングするアルゴリズムの一つである。このアルゴリズムは通常、色深度の小さいディスプレイに画像を表示するために使用される。たとえば、Microsoft Windowsは16色グラフィックモードにおいて配列ディザリングを使用する。このアルゴリズムを使った画像は、クロスハッチングのパターンが顕著に表れるのが特徴的である。

しきい値マップ[編集]

このアルゴリズムでは、表示されるピクセルにしきい値マップ「M」を適用することで色数を減らす。その結果、元のピクセルの色がそのディスプレイで使える色数の少ないパレットの色と比べてどのくらい離れているかにもよるが、一部のピクセルの色が変化する。

しきい値マップにはさまざまなサイズがある。

このマップは、回転や反転を行ったとしてもアルゴリズムの有効性に影響を与えない。両辺の長さが2の累乗になった、このようなしきい値マップは「インデックス配列」または「ベイヤー配列」とも呼ばれる[1]

任意のサイズのしきい値マップは、割と簡単な方法で制作できる。まず、各スロットを連続した整数で埋める。次に、マップ内の2つの連続した数同士の平均距離ができるだけ大きくなるように並べ替え、テーブルが端で「折り返される」ようにする[要出典]。次元が2の累乗であるしきい値マップの場合、マップは次の方法で再帰的に生成できる。

再帰式は、ビット演算のみを使用して明示的に計算できる[2]

M(i, j) = bit_reverse(bit_interleave(bitwise_xor(i, j), i)) / n ^ 2

事前計算によるしきい値マップ[編集]

ディザリングの実行に使用されるハードウェアの性能にもよるが、マップを 0 からまでの次元をもつ x の配列型として格納しておくよりも、マップのしきい値を事前に計算した方が便利な場合がある。これには、次の式が使用できる。

Mpre(i,j) = (Mint(i,j)+1) / n^2

これにより、標準のしきい値の配列が生成される。

例えば2×2マップの場合、

となる。これを用いて事前計算式のディザマップを生成すると、

となる。加えて言うと、事前計算の実行中に0.5での減算を行うことも可能である。

Mpre(i,j) = (Mint(i,j)+1) / n^2 - 0.5

これにより、次のような事前計算ディザマップが生成される。

さらに別の方式では、代わりに色の値の範囲を0—( x に対して)に変更する。ただし、この操作はピクセルごとに1度ずつ実行する必要があるため、しきい値マップを(浮動小数点数ではなく)整数として格納することが重要である場合にのみ実行すべきであることに注意してほしい。

アルゴリズム[編集]

配列ディザリングのアルゴリズムは画像を常に一定の尺度でレンダリングするが、しかしそれぞれのピクセルにおいては、しきい値マップのその場所にある対応する値を用いてそのピクセルの色の値がオフセットされるので、もししきい値を超えた場合はピクセルの値が異なる色に数値化されることになる。

ディザリングと言う観点からすると、単純なアルゴリズムを使うだけで十分その目的を満たす。例えば、すべてのピクセルに対応するしきい値を加算し、0-1の範囲にノーマライズした時に1を下回っていた場合はそのピクセルを黒として描き、そうでなかった場合は白として描く。あるいは同様に、ピクセルの値をしきい値と比較し、ピクセルの値がマップの配列の対応するセルの値よりも小さかった場合は、そのピクセルを黒として描き、そうでなかった場合は白として描く。

このようなアルゴリズムを使うと、画像全体の平均輝度がわずかに増加し、白に近いピクセルがディザリングされずにそのまま白に変換される結果となる。しかしこれは、グレースケールのパレット(もしくは相対的な色の距離が(ほぼ)一定であるパレット)を使用する場合は問題とはならない。人間の目は明るい色よりも暗い色の違いをより正確に認識するため、明るい方のわずかな色の違いを飛ばしても暗い方の色の違いが重視されるのはむしろ望ましい結果とすら言える。ただし、特に色数の少ないパレットや任意の色で構成されたパレットを使用してディザリングを行った場合は、誤ったディザリング結果が生成されることになるため、そうならないようにオフセットの値はきちんと設定した方が良い。

ディザリングされたカラースケールによってオリジナルの画像(140x140、図示せず)を模倣した物。オリジナル画像は140 x 140 = 19600色で構成されていたが、右の画像は左の画像に示された64色のみを使用している

アルゴリズムは、すべてのピクセルの各カラーチャンネル「c」に対して次の変換を実行する。

ここで、「M(i, j)」はi番目の行とj番目の列のしきい値マップ、「c」は変換された色、「r」は色空間での広がりの量である。RGBのカラーパレットを、各色(R、G、Bの3つ)が0から255までのオクテットで表された中から等しい間隔で選択された「23N」であると想定すると、一つの色は通常はこのような形で選択される。

しきい値マップから読み取られた値は、対象のカラーパレットにおける異なる色同士の差の中で一番小さいものとなるべく同じ範囲にスケーリングした方が良い。

アルゴリズムは単一のピクセルを操作するもので、条件分岐もないため、非常に高速で、リアルタイム変換に適している。さらに、ディザパターンの位置は常に表示フレームに対して同じであるため、誤差拡散法よりもジッターが発生しにくく、アニメーションに適している。パターンは誤差拡散法よりも反復的であるため、配列ディザリングを使用した画像の圧縮率は高くなる。配列ディザリングは、直線が真っ直ぐに変換され、揺らぎが少ないため、線画に適している。

選択するマップのサイズは、元画像のカラーパレットと変換後のカラーパレットの比率と同じか、それ以上の大きさである必要がある。たとえば、24bppの画像を15bppに(つまり、1チャンネルあたり256色から、1チャンネルあたり32色に)変換する場合、「256:32」は8倍の比率であるから、ディザパターンとして選択可能な最小のマップは「4x2」になる。これにより、入力のそれぞれの異なるトーンを異なるディザリングパターンで表現できる[要出典]

注釈[編集]

  1. ^ Bayer, Bryce (June 11–13, 1973). “An optimum method for two-level rendition of continuous-tone pictures”. IEEE International Conference on Communications 1: 11–15. オリジナルの2013-05-12時点におけるアーカイブ。. https://web.archive.org/web/20130512190753/http://white.stanford.edu:80/~brian/psy221/reader/Bayer.1973.pdf. 
  2. ^ Joel Yliluoma. “Arbitrary-palette positional dithering algorithm

参照[編集]

外部リンク[編集]