2つの色がどれくらい「似ているか」を数値にしたい。色は (R, G, B) の3つ組なのだから、3次元空間の距離を測ればよさそうに見える。
ところがこれが、人間の感覚とよく食い違う。
問い: 同じ距離なのに、違って見えるのはなぜか
RGB 空間で同じ距離だけ離れた色のペアを並べると、緑どうしのペアは「ほぼ同じ色」に見え、青どうしのペアは「けっこう違う」と感じたりする。人間の眼は緑の変化に鈍感で(というより緑の解像度が高くて)、色相によって感度がまるで違う。
つまり RGB 空間は、知覚的に歪んだ地図だ。地図上の1cmが、場所によって実際の1kmだったり10kmだったりする。
均等な地図を作り直す
そこで「知覚的に均等な色空間」が設計されてきた。CIELAB が古典で、近年は OKLab がよく使われる。設計目標は一つ:
空間内のユークリッド距離が、人間の感じる色差に(できるだけ)比例すること。
変換は非線形になる。眼の応答が非線形(明るさに対しておよそ立方根的)だから、それを織り込んで空間の方を歪めておくわけだ。歪んだ感覚 × 歪めた地図 = まっすぐな距離、という構図。
減色で差が見える
この違いが劇的に効くのが減色(色数を減らす処理)だ。写真を16色に落とすとき、「各画素をパレットの中で一番近い色に置き換える」という操作をする。この「一番近い」を測る空間で結果が変わる。
- RGB 距離: 肌のグラデーションが不自然に段付きになったり、空の青が緑がかった色に飛んだりする。数値上は最近傍でも、見た目は「遠い」色が選ばれてしまう。
- 知覚空間の距離: 同じパレット数でも、置き換えが「見た目に一番近い色」になるので、破綻が目立ちにくい。
パレットの選び方(クラスタリング)も同じ理屈で、知覚空間でクラスタを作るほうが「人間にとって代表的な色」が選ばれる。
教訓めいたもの
「距離を測る」という操作は座標系を選んだ時点でほとんど決まっている。データが人間の感覚に関わるものなら、感覚の側に合わせて座標を張り替えてから測る——色に限らず、音の高さ(対数)、音量(dB)、地震の規模(マグニチュード)と、感覚量の世界では地図の張り替えがいつも最初の一歩になっている。