- CIE 1931 xy 色度図の馬蹄形の境界は任意の公式ではなく、人が赤・緑・青の光を相対的にどう知覚するかを測定した 等色関数から生まれる
- CIE RGB データは 700nm、546nm、435nm の光源を調整して スペクトル色と一致させた実験結果であり、一部の波長での負の値は、純粋な RGB だけでは再現できない色があることを示している
- XYZ 色空間は RGB を 線形変換して、すべての値を正で扱いやすくした標準であり、
x = X/(X+Y+Z)、y = Y/(X+Y+Z) によって 3 次元の値を 2 次元の色度座標へ投影する
- 図の内部の色は
x, y から直接計算するというより、複数の スペクトル線形状を作り、等色関数と掛けて積分した後に xy 座標へ打つ方法で近似できる
- 実際の画面は sRGB や display-p3 のようなディスプレイ色空間に制約されるため、境界付近の多くの色は正確には表示できず、クリッピングやチャネル飽和が発生する
馬蹄形ダイアグラムの出発点
- CIE 1931 XYZ 色空間を理解していくと繰り返し出会う 色度図は、明るさと分離して色の質を表す図である
- 外縁は特定波長の スペクトル色と対応しているが、全体の形や内部の色は単純な
x = func(y) のような公式では説明できない
- 核となる形は、人が赤・緑・青を互いにどう知覚するかから生まれ、内部の色は色混合の数学と点サンプリングによって 2D 画像としてレンダリングできる
等色関数と CIE RGB
- 等色関数は、特定波長の目標色を目で同じに見せるために、赤・緑・青の光源強度をどれだけ調整すべきかを表す
- CIE 1931 RGB 等色関数は、それぞれ 700nm、546nm、435nm の赤・緑・青の光源を基準としている
- 実験は、一方に目標色の光源を置き、もう一方の RGB 光源を人が直接調整して目標色に一致させる方法で行われた
- このデータには 負の赤 のような値が現れる
- 負の光源は物理的には作れない
- 純粋な RGB 光源だけでは一部のスペクトル色を再現できないことを意味する
- それでも変換を経れば、色空間の計算には有用に使える
XYZ 色空間と xy 色度座標
- XYZ 色空間は RGB 色空間を行列で 線形変換した形であり、同じ情報を計算しやすい別の座標系へ再配置したものに近い
- Wikipedia の RGB 変換行列を使えば、XYZ 等色関数データを RGB グラフと比較できる
matrix = [
2.364613, -0.89654, -0.468073,
-0.515166, 1.426408, 0.088758,
0.005203, -0.014408, 1.009204
]
[R, G, B] = matrix * [X, Y, Z]
- XYZ は表示装置が直接出せない色まで含めて あらゆる色を記述する標準空間として使える
- 各装置はこの値を、自分が物理的に表示可能な色空間として解釈しなければならない
- 装置の色域が広がるほど、同じ色情報でもより多くの色を表現できる
- xy 色度座標は XYZ の値を全体の和で割って計算する
const x = X / (X + Y + Z)
const y = Y / (X + Y + Z)
const z = Z / (X + Y + Z) = 1 - x - y
z は x と y から導けるため、xy 色度図では通常省略される
xy から再び XYZ に戻るには Y の値が必要であり、これを含む表現が xyY 色空間である
なぜ馬蹄形に見えるのか
- RGB 等色関数データを xy に投影すると、見慣れた色度図の輪郭が現れ始める
- RGB データには不可能な色のため x 軸の負の領域が含まれ、XYZ に変換すると、より見慣れた馬蹄形の形に近づく
- XYZ 等色関数の表データを直接 xy にレンダリングしても、同じ形と一致する
- その形は XYZ 等色関数の曲線から直接導かれる
- 各波長ごとに
X、Y、Z が全体に占める比率を計算する
- その比率に沿って点を打つと色度の境界が生まれる
- 任意に作った等色関数に同じ手順を適用するとまったく異なる形になるため、実際の馬蹄形は 人間の視覚実験から導かれた関数の結果である
内部の色を埋める近似方法
x, y 座標だけでは、その点が有効な色なのか、どんな色として近似すべきかをすぐには判断できない
- 逆に、任意の XYZ 値やスペクトルを作り、それを xy 座標に変換して図上に打つアプローチを使える
- 核心は スペクトル線形状を生成することにある
- すべての波長軸上で、各波長が色にどれだけ寄与するかを示す線を作る
- その線を XYZ 等色関数と掛けて積分し、最終的な XYZ 値を得る
- 同じ方法で RGB 等色関数と掛けて積分し、RGB 値を得る
- 得られた XYZ 値を xy に変換して色度図上に打つ
- 2 つの正弦曲線のオフセットと幅を変えると異なるスペクトル線が生成され、その結果、異なる色と座標が図に現れる
- 自動化デモはオフセットと幅を変化させながら空間をより広く走査するが、色空間全体を完全には埋められない
- 実際に試せる CodePen デモ が用意されている
画面表示と色空間の制約
- 計算した XYZ 値を画面に表示するには、sRGB のような実際のレンダリング色空間へ変換する必要がある
- ブラウザの
rgb() は sRGB を前提とするため、XYZ を RGB に変換する際には ガンマ補正を考慮しなければならない
- display-p3 は sRGB より広い色域を持つ色空間であり、多くのブラウザとディスプレイが対応している
- CSS では
color(display-p3 r, g, b) の形で display-p3 の色を指定できる
- ブラウザの p3 色空間も sRGB と同じガンマ補正を使うため、これを含めないと色は正しくレンダリングされない
- wide gamut のブラウザやディスプレイではより強い色を見られるが、スクリーンショットや Zoom の画面共有で p3 がどう伝達されたり sRGB に変換されたりするかは、この実験だけでは断定しにくい
色が完全には正確でない理由
- 内部の色を XYZ 値から直接
XYZ_to_sRGB に変換すると、多くの色が 0〜255 の範囲を外れ、過度に飽和した結果になる
- XYZ から直接色を得るより、スペクトル線を RGB 等色関数と掛けて積分する方法のほうが、よりよい補間に見える
- それでも生成された色のかなりの部分は依然として 有効でない RGB 値である
- 0〜255 の範囲を外れる色をレンダリングしなければ、見慣れた sRGB の三角形だけが残る
- 三角形の外の色は正確には表示できないが、RGB チャネルのうち 1〜2 個だけが飽和している状態では、残りのチャネル変化によって色の違いがある程度見えることがある
関連資料
1件のコメント
Hacker News のコメント
色度を直交座標グリッドに描く最も一般的な方法は、かなり誤解を招きます。色度図は重心座標を使っていますが、一般的な XYZ 色度図の奇妙に歪んだ形は、データの実際の性質というより、描き方によって生じた歪みに近いと考えています。
色度図は、3次元色空間で3つの標準単位ベクトルを通る2次元平面の切片として見るほうが自然で、[1] のような正三角形の図はその点をよく示しています。XYZ 空間の全色域が恣意的に押しつぶされた形なのではなく、人間の視覚の制約の中で正の八分空間をかなりうまく満たすように意図的に選ばれたのだという点も、より明確になります。
[1]: https://physics.stackexchange.com/questions/777501/why-is-th...
X、Y、Z 軸自体がある程度任意なので、xy を直角二等辺三角形の中に描くより正三角形の中に描くほうが本質的に正しい、とは言いにくいです。錐体細胞の反応に近い座標を使えば概念的にはより明快になるかもしれませんが、こうした2次元の図は、視覚がどう働き、図が何を意味しているのかを深く理解していない人には、結局誤解を与え得ます。
https://www.w6rz.net/chromacity.mp4
その特定の色度図のバージョンは、ディスプレイで欠けている色が、いろいろな種類のレーザーポインターの緑のように見えるようにしています。実際には、エネルギー当たりでは暗すぎて使えない、非常に飽和した赤・青の原色のために欠けている赤や青の系統も多いです。
参考: https://nanosys.com/blog-archive/2012/08/14/color-space-conf...
赤・シアンの立体画像を作っていて、望んでもいないほど色管理について多くを学びました。sRGB の赤を要求したのに、広色域モニターではだいたい (180,16,16) のような値が出て、チャンネル間のクロストークがひどくなったためです。今は仕立て屋の友人とカスタムプリント生地を作業中ですが、花柄の黄色が処理中になぜかオレンジに変わってしまうので、注文前にデバッグと校正を終わらせようとしています。相変わらず色管理について学びすぎています。
しかし視覚知覚は、目の錐体細胞が物理的に見られるものよりはるかに先まで及びます。その背後には、視神経の現象を解釈しようとする脳全体があります。面白い脳刺激としては、錐体細胞が物理的には検出できないのに見ることができるキメラ色を調べてみるとよいです。たとえばスティジアンブルー、自己発光する赤、双曲オレンジなどです。
†: https://www.perplexity.ai/search/please-provide-chimerical-c...
W: https://en.wikipedia.org/wiki/Impossible_color
例: https://ctnbee.com/en/upload
色空間に関するもう一つの興味深い探究があります: https://ericportis.com/posts/2024/okay-color-spaces/
紫/マゼンタが「本物の」色ではないと思っている人たちには、短波長側では赤の X が青の Z よりゆっくり減少するため、400nm 未満で高出力の単一波長の飽和した紫/マゼンタ色を得られる、と言いたいです。標準的な彩度チャートにはうまく表現されず、モニター用として効率的でもなく、青でさえそうであるように長く見ると危険です。単一波長の紫/マゼンタレーザーを見たら、顔を背けるか目を閉じるべきです。
すばらしいです。色、知覚、色域に関するアイデアが浮かびました。
簡単に言うと、ある光の波長の組み合わせが熟成チーズの匂いを知覚させ、別の組み合わせは背後に熊がいると思わせる、と想像してみましょう。すると図には色のピクセルだけでなく、その特定の知覚が生じる地点にチーズや熊の小さな絵も入れる必要があります。
実際、マゼンタはこういうものだと思います。スペクトルに存在しない色であり、脳が過度に圧倒されないよう、単にもう一つの色として知覚させている感じや感覚に近いものです。これは程度の異なる共感覚を持つ人々、言葉遊びを許すなら共感覚スペクトラム上にいる人々に、実際の現象を説明するのにも近いと思います。
XYZ から始めるのはよいとしても、今では私たちの視覚によりよく対応する、はるかに優れた色空間がある。代表的には CIE 1976 L',u',v'、そしてより最近では Dolby の研究による ICtCp がある
同様に、純粋な波長に対応する色を描いてからその凸包を取れば、物理的に可能な色空間全体を得られる。この性質は他の色空間ではきちんと再現しにくく、せいぜい線形変換程度しかできない。XYZ はすでにそのような変換であり、基底の選択に望める性質のほとんどを備えている
https://giannirosato.com/blog/post/jpegli-xyb/
教育と学習に最適化された「教育用」の色空間があるのか気になる。単純な数学より正確性を優先し、目立つ性質が「モデルの人工物」ではなく実際の 人間の知覚の特徴であるような色空間のこと
色域全体を含み、スペクトル軌跡までうまく扱え、色相と色の混合がある程度線形だとよい。Munsell が担っていた領域に近いが、色域全体を扱い、21 世紀的なもの。「スペクトルを強調すれば色をもっと上手く教えられるのでは?」というサイドプロジェクトを進める中で、近いものすら見つからず、暫定的に組み合わせた。知覚色空間の最新候補として CAM16UCS を使い、線形色相には Jzazbz でねじれをほどき、絶対輝度の sanity check も行い、CAM の非知覚的なものと理解している軌跡付近の奇妙な青い尾は、かなり場当たり的に押さえ込んだ。実装は lookup table で行った。関連する取り組みがあれば聞きたい
Hellwig と Fairchild は最近のモデルを数学的に単純化しつつ、彩度の正確性を改善した(http://markfairchild.org/PDFs/PAP45.pdf)。より単純なモデルとしては CIELAB があり、L, a, b パラメータを出力する。ここで L は明度、hypot(a,b) は彩度、arctan2(b,a) は色相
より良い選択肢は Munsell 色空間かもしれない。Munsell は色領域全体を数千の小さな断片に分け、各断片間の距離を、入念なユーザーテストで定めた「かろうじて知覚できる差」1 単位とした。そのため緑の領域は黄色よりずっと大きかった。この色空間を開発した過程も非常に興味深く、彼は画家だったが、その仕事はより現代的な色空間への道を開いた
「負の赤い光源」とは、被験者が合わせようとしている色に赤い光を加えるダイヤルを回した、という意味
基本的には未知の色 C と R+G+B の色がある。ときには一致させられないので、C+R = G+B を合わせようとする。このとき R を方程式の反対側に加えるため、「負の」R が生じる。同じことは緑や青でも起こるが、程度はより小さい
おおむね合っているが、最後の節で筆者が 2 つのピークを持つスペクトルを生成して色度図に投影し、軌跡の内部を埋めようとしている部分はよく分からない。なぜそうするのか分からない
やるべき方法はこうだと思う。まず Y 値を選んで図の輝度とし、スペクトル軌跡と紫線で囲まれた領域内の各ピクセルについて x, y 座標を取る。この 3 つの値は CIE xyY 色空間の色を指定し、xyY から XYZ への変換は X = Y / y * x, Y = Y, Z = Y / y * (1 - x - y) と簡単。次に XYZ 値を出力画像の色空間、たとえば sRGB にマッピングする。特定の XYZ 値が sRGB の [0,1] 範囲を外れるなら sRGB 色域外なので、最も近い有効な色域値にクリッピングすればよい
問題は「領域内の各ピクセル」です。そうしてからその形で出力を切り抜くこともできたでしょうが、そうするとその形そのもので出力を切ることになり、なぜその形なのかにはまったく答えられません。偽物のように感じました。ただし、これが最も一般的な方法のようではあります。より厳密なアプローチを理解しようとしていて、スペクトルを生成して埋めようとする方法はここで説明されています: https://clarkvision.com/articles/color-cie-chromaticity-and-...
そちらのほうがより厳密なアプローチに感じますが、クリッピングもおそらく「十分に悪くない」方法ではあり得ます
色彩科学に詳しい方々に質問があります。Guild の元データ https://royalsocietypublishing.org/doi/pdf/10.1098/rsta.1932...を読んでいるのですが、表 4 の数字が何を意味するのか理解しにくいです
そこにあるすべての列を理解している人がいるのか気になります。特に、等色実験から得られた正規化されていない係数、またはその係数を逆正規化する方法を探しています。ここで言う係数は表 3 の三刺激係数 u{a,b,c}_\lambda です。そのデータが表 4 にあるのかも分からないので、もしかすると別々の 2 つの質問なのかもしれません
説明は単純だと思う。色は光であり、紫外線から青、緑、黄、赤、赤外線へと続く線形的なものだ。要するに1本の線である
物理的現実には紫色の光は存在しない。目が赤と青の光を同時に受け取ると、心が青と赤の間にあるあらゆる紫やマゼンタ系の色を作り出す。だからマゼンタを含めるには、青と赤の間にもう1本線を引く必要がある。つまり実際の色の線を曲げなければならず、色度図で見ているのはまさにそれだ
そのため「赤い光」ではなく「『赤い』光」と書いた。物理スペクトルは nm とエネルギー軸のグレースケールで、知覚スペクトルは色相角と輝度の色で対応させた。どちらも3次元の知覚色空間に巻き付けることができ、物理スペクトルを nm から色相へ補間することもできる。あるいは、2次元の非霊長類哺乳類の二色性空間に沿って配置し、神経系への依存性を強調することもできる。色に関する誤解は幼稚園から大学院まであまりに広く行き渡っているので、明確さのためには極端なくらい慎重にする方が役に立つ
「物理的現実」とほのめかされた光学には、色はまったくない。心がすべての色を作り出す。観察主体から独立した色という性質を光に与えるのは、カテゴリー錯誤である。色彩科学では、ここでいう物理的現実は、より正確には可視範囲の電磁放射のスペクトルパワー分布と呼ばれる。その放射が人間の視覚系の色反応を刺激する限り、紫色の光は確かに存在する。ただし、単一の狭い波長帯の放射ではシミュレートされないだけだ
CIE の馬蹄形図の下側にある「紫の境界」は、長波長・短波長刺激、つまり赤/青の原色を混ぜたときの知覚上の境界を示している。しかし、光に自然な色があると前提するのは、きわめて人間中心的な現実の描写である。他の生物は人間とは非常に異なる特徴的な反応を持つ。偏光に敏感な感覚を想像してみればよい。芸術家の色相環が円形なのは、芸術家の心の中で、クオリアとしての色がそのように現れるからだ。クオリアの物理学は、外部刺激よりも有機体内部の反応の複雑さにより関係している。光の色について語るのは常識的な表現ではあるが、刺激の物理に人間的な性質を過度に付与している。できるだけ単純に説明すべきだが、それ以上に単純化してはいけない
「実際の色」を知覚ではなく光の属性として見る説明は、明確にするどころか、より多くの誤解を招く