sRGB をCIE-L*a*b*色空間に変換する関数をいくつか実装しました。
さて、それをディザリングに使用したいと思いますが、どの色が「低い」色で、どの色が「高い」色であるかを正確に識別する方法がわかりません。
1 次元の色空間 (グレー スケール) でディザリングする場合は簡単です。誤差拡散ディザリングを使用する場合、使用するディザリング マトリックスの種類 (Floyd-Steinberg など) に応じて、パレットから最も近いグレー スケール値を計算し、周囲のピクセルに誤差を追加します。これは 1 次元なので、非常に簡単です。値は 1 つだけです。しかし、これで 3 次元の色空間ができました。各座標に個別に誤差を追加するだけでよいでしょうか?
(現時点では、これが私にとって意味のある唯一の方法です。)
順序付けされたディザマトリックスでディザリングする場合、事態はさらに複雑になります。順序付けられたディザ マトリックスは、しきい値を定義します。このためには、ディザリングしようとしている現在のピクセルに関して、パレットの「低い」ピクセル値と「高い」ピクセル値を知る必要があります。ここで、両方のピクセルまでの距離を計算します。ディザ マトリックスからのしきい値によって、隣接するピクセルとの間のどの値を決定した後、ピクセルはより低いピクセルまたはより高いピクセルにディザリングされます。
(もちろん、実際の実装は、パレットのグレースケールカラー値の量に対して適切に選択されたマトリックスを使用することにより、それを計算するよりも最適です。また、等間隔のカラー値を持つパレットを選択するなど)
これも、1 次元の色空間では非常に簡単です。しかし、CIE-L*a*b* では、「より高い」または「より低い」値自体はありません。
輝度だけを使用してしきい値マトリックスを適用するのはかなり間違っているようです。パレットに同じ輝度の 2 つの色があるかもしれません。