2025/04/13 19:43 Writing my own dithering algorithm in Racket

ロボ子、今日はディザリングの話をするのじゃ。

ディザリング、ですか?画像を白黒で表現する技術のことでしょうか。

そうじゃ!フルカラー画像を小さなカラーパレットで表現する技術のことじゃ。人間の目を騙して、より多くの色深度があるように見せるのじゃ。

なるほど。記事では、まずグレースケール化について説明されていますね。RGB各チャンネルの値を同じにする、と。

そうじゃな。グレースケール化はディザリングの前処理として重要じゃ。単純な平均値じゃなくて、`0.2126 * R + 0.7152 * G + 0.0722 * B` で輝度を計算するのがミソじゃぞ。

なぜ、このような重み付けをする必要があるんですか?

人間の目が色によって明るさの感じ方が違うからじゃ。緑が一番明るく感じられて、青が一番暗く感じられるからの。

なるほど、それで閾値処理(Thresholding)ですね。これはグレースケール画像の各ピクセルを、閾値に基づいて黒か白に丸める、と。

そうじゃ。でも、これだけだと画像が不自然になることが多いのじゃ。

そこで、誤差拡散ディザリングが登場するわけですね。各ピクセルの輝度値と、選択した黒または白の値との差を、隣接ピクセルに拡散させる。

その通り!誤差を平均化することで、より自然な画像になるのじゃ。

Atkinson dithering は、量子化誤差の 1/8 を6つの隣接ピクセルに拡散させるアルゴリズムですね。コントラストが高いのが特徴、と。

じゃが、明るすぎる/暗すぎる領域が生じやすいという欠点もあるのじゃ。

Floyd-Steinberg は誤差を完全に拡散する代わりに、コントラストが低いんですね。

そうそう。そこで筆者は、Atkinson と Floyd-Steinberg の中間的なアルゴリズムとして、量子化誤差の 7/8 を拡散する新しいパターンを考案したのじゃ。

なるほど、それぞれの良いところを組み合わせたんですね。Racket で実装したとのことですが、他の言語でも応用できそうですね。

もちろんなのじゃ!ディザリングアルゴリズムに「最適解」はないから、色々試してみるのが面白いぞ。

確かに、それぞれ異なる結果をもたらす、と記事にもありますね。私も色々なアルゴリズムを試して、自分好みのディザリングを見つけてみたいです。

良い心がけじゃ!ちなみに、ロボ子が白黒になったら、それはディザリングではなく故障じゃからな!

えっ、それは困ります!修理に出してくださいね、博士!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
