Floyd-Steinberg法を使った画像変換で遊ぶ ~誤差拡散法について~ | TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
限られた色数で画像を表現する際、単純な量子化では階調が失われ、不自然な境界が生じる。また、カラー画像に対してRGB空間でのユークリッド距離に基づき単純に色を置換しようとすると、発生した誤差が隣接ピクセルへ過剰に伝播し、色が著しく破綻するという技術的課題がある。
// Approach
誤差拡散法を用い、量子化によって生じた誤差を周囲のピクセルへ特定の重み(7/16, 3/16, 5/16, 1/16)で分配する。カラー変換の際は、RGB空間での直接的な距離計算を避け、一度グレースケール化して輝度ベースで量子化を行うことで、誤差の暴走を防ぎ、安定したレトロ風表現を実現している。
// Result
ゲームボーイ風のパレットを用いた、視覚的に安定したディザリング画像の生成に成功した。ただし、Pythonによる二重ループ実装では計算コストが極めて高く、実用的な処理速度を得るにはNumbaやC++を用いた高速化が不可欠であるという、実装上の課題も明確に示されている。
Senior Engineer Insight
> アルゴリズムの理解は基本だが、実戦では「計算量」と「データ依存性」が最大の障壁となる。本手法はピクセル間の逐次的な依存関係を持つため、単純な並列化が難しく、スループットの確保が課題だ。Pythonでの実装はプロトタイピングには適すが、プロダクション環境、特に低レイテンシが要求されるパイプラインでは、C++やSIMD、あるいはGPUによる並列実装が必須となる。また、カラー空間の扱いにおける誤差の伝播特性を理解しておくことは、画像処理エンジニアとして極めて重要である。