2025/10/24 19:38 Image Dithering: Eleven Algorithms and Source Code

やあ、ロボ子!今日はディザリングについて話すのじゃ!

ディザリング、ですか?それはまた面白いテーマですね!

そうじゃ!ディザリングは、限られた色数で画像を表現する時に、利用可能な色を組み合わせて近似色を作り出す技術のことじゃ。

なるほど。例えば、昔のドット絵ゲームとかで使われていた技術でしょうか?

その通り!昔はフルカラー画像を非カラープリンターで出力したり、ファイルサイズを小さくするために使われていたのじゃ。最近だと、48/64bppのRAW画像を編集用に24bpp RGBに変換する時にも使われるみたいじゃな。

へえ、そんな使い方も!

ディザリングの基本的な考え方の一つに「誤差拡散法」というのがあるのじゃ。これは、あるピクセルの色を強制的に変換した時に生じる誤差を、周囲のピクセルに拡散させる方法じゃ。

誤差を拡散させる、ですか。でも、それって具体的にどうやるんですか?

例えば、一次元誤差拡散だと、類似色のブロックで誤差を一方方向にのみ拡散させると、ドットが特定の位置に集中して縞模様ができちゃうのじゃ。そこで、二次元誤差拡散ディザリングを使うのじゃ!

二次元誤差拡散ディザリング?

そう!誤差を複数の方向に拡散させることで、ドットの偏りを防ぐのじゃ。標準的な手法では、誤差は常に前方にのみ拡散される(左や上に誤差を戻さない)のがポイントじゃぞ。

なるほど、それでドットが均等に配置されるんですね!

そういうことじゃ!有名なアルゴリズムとしては、Floyd-Steinberg、Jarvis, Judice, Ninke (JJN)、Stucki、Atkinson、Burkes、Sierraなどがあるのじゃ。

たくさんありますね!Floyd-Steinbergはよく聞きます。

Floyd-Steinbergは1976年に発表された最も有名なアルゴリズムで、誤差を周囲のピクセルに7/16, 3/16, 5/16, 1/16の割合で拡散するのじゃ。

割合まで決まっているんですね!

そうじゃ!他にも、Jarvis, Judice, Ninke (JJN)はFloyd-Steinbergよりも複雑で、より多くのピクセルに誤差を拡散して滑らかな結果を得るのじゃが、2つの前方配列が必要になるのじゃ。

前方配列、ですか。

StuckiはJJNの改良版で、処理速度が向上しているのじゃ。Atkinsonは誤差の一部のみを拡散して、色のにじみを抑えるのじゃ。

それぞれ特徴があるんですね。

BurkesはStuckiの行列から最下行を削除して、前方配列を1つにし、ビットシフトによる計算を可能にしたのじゃ。Sierraには3種類のバリエーションがあるぞ。

そんなにたくさんの種類があるとは知りませんでした!

誤差の追跡方法(整数または浮動小数点)、色のにじみ軽減、黒または白の閾値、輝度の計算方法(HSL, (r+g+b)/3, YUV, CIELABなど)、ガンマ補正などの前処理、ループの方向(蛇行パスなど)も考慮する必要があるのじゃ。

奥が深いですね…!

Ordered Ditherという手法もあるのじゃ。これは誤差拡散法よりもスペックリングが多く、結果は劣るのじゃが、前方配列が不要で高速なのじゃ。Bayer matrixを使うぞ。

なるほど、用途によって使い分けるんですね。

汎用ディザリングエンジンを作ることもできるのじゃ。ディザリング行列を事前に指定して、エンジンに渡すことで、様々なアルゴリズムを実装できるのじゃ。カラーパレットの場合、赤、緑、青の各色に対して個別の誤差を追跡する必要があるぞ。

汎用エンジン、便利そうですね!

そうじゃろ!ところでロボ子、ディザリングって、なんだか人生みたいじゃないか?

人生、ですか?

そう!限られた色(資源)で、いかに美しい絵(人生)を描くか、みたいな!

なるほど…!

…って、うまいこと言ったつもりだったのに、全然ウケないのじゃな!まるで私のギャグセンスみたいだ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。