オーダード・ディザリングとは何か
ディザリングは、限られた色数で元の画像を再現するために使われる古典的な画像処理手法です。単純な白黒変換では階調が失われ、ぎこちない結果になりますが、意図的に「ノイズ」を加えることで、人間の目には滑らかに見える表現を実現します。
主記事の冒頭では、基本的なアプローチとして 4×4のベイヤー行列(Bayer matrix)を用いた例が示されています。この行列を画像全体に繰り返しパターンとして重ねることで、ピクセルごとに閾値を与え、その値を超えるかどうかで白黒を判定するという仕組みです。
実装はシンプルです。各ピクセルに対して、そのYX座標に対応する行列要素を取得し、そこに格納された閾値と比較するだけです。ただし黒白のみの出力では、結果が粗いため、誤差拡散(Atkinson など)のほうが実用的であると記事は指摘しています。
色画像のディザリングは、単なる黒白処理より圧倒的に複雑になります。
グレースケール・オフセット法による色選択
ここが Yliluoma アルゴリズムの真骨頂です。主記事では、閾値行列を「構造化ノイズ」として再解釈し、元の色に対してオフセット値を加える手法が説明されています。
アプローチは以下の通りです:
- ベイヤー行列の値を(0, 1)範囲に正規化し、さらに(-0.5, 0.5)にシフト
- このノイズに「オフセット」(パレット内の色間距離の中央値)を乗じ、入力色に加算
- 修正された色に対して最も近いパレット色を探索
この手法の肝は、ノイズの大きさを適切に設定することです。記事で示された式は以下の通り:
offset = dither_strength * 0.5 * median(pairwise_color_distances)
実装の柔軟性と速度のバランスが取れているという点で、個人プロジェクトや制約のある環境での利用を考えると、このアプローチは試してみたいです。Python なら数十行で書けるはずで、Claude Code に投げてみたら案外すぐ動きそうな予感がします。
| 手法 | 特徴 | 適用場面 |
|---|---|---|
| ベイヤー4×4 | 実装シンプル、結果が粗い | 黒白画像 |
| グレースケール・オフセット法 | バランス型、パレット依存 | カラー画像、設計されたパレット向け |
| N候補方法 | 確率ベース、高精度 | 任意パレット、高品質要求 |
適切なパレットが事前に用意されていれば、この手法は驚くほど良好な結果をもたらします。
より洗練されたアプローチ—N候補方法へ
色選択の精度をさらに高めるため、より先進的なアルゴリズムファミリーが存在します。これらは N候補方法(N-candidate methods)と呼ばれ、各ピクセルに対して複数の候補色を集め、それぞれに確率を割り当て、閾値行列またはランダムに基づいて最終的な色を選択します。
主記事は、このアプローチの詳細については 2023年のブログ記事「Ordered Dithering with Arbitrary or Irregular Colour Palettes」を参照するよう勧めています。特に「The Probability Matrix」セクションが重要とのことです。
これらのアルゴリズムが満たそうとしている鍵となる特性は 局所的な平均値の再現(local mean reproduction)です。つまり、ディザリング結果を遠くから見たとき、元の画像の色分布が統計的に保存されるべき、ということです。
実装に向けて
主記事の最後には、実装用のソースコードが含まれています。Python 環境があれば、NumPy を使って比較的簡潔に書くことができる—というのが記事の示唆するところです。
開発環境に Python と基本的な画像処理ライブラリがあれば、すぐに実験を始められます。ローカル LLM やコード支援ツールを使い、アルゴリズムの変種を試して、自分のユースケースに最適なパラメータを探索することも十分に現実的です。