成果物
XYZ色空間は知らなくても、この図を見たことがある方は多いのではないでしょうか。これは、XYZ色空間を二次元(xyY)に変換したものです。三角形がCIERGBの範囲で、多くの色の一部しか表せていないことがわかります。
ちなみに、XYZをただ入力すればこの形になるわけではなく、XYZを0~1の範囲にしてxyYに変換するとこのような三角形になります。今回は、380~780nmでのRGBの測定値をxyYに変換し、はみ出た部分をカットすることであの形を再現しています。
それでは、数式の紹介に移ります。
仕組み
まずは、380~780nmのRGB測定値(ソールコードを参照してください)をRGB→XYZ→xyYに変換し、有効領域の多角形を求めます。
RGB→XYZ
XYZ→xyY(xyのみを使用して、二次元にします)
380~780の測定値のxyYでの位置をすべて繋いでいけば、あの形が出現します。
多角形の内側外側判定は、前回のPoint in Polygonのプログラムを使っています。
nekodigi.hatenablog.com
続いて、XYZ(0~1)からから各地点でのRGB値を求めます。まずXYZ→xyYに変換し先ほどの多角形の内側にあるかを調べます。内側にあれば、XYZ→RGBに変換し、色を求めます。そして、先ほどxyYの位置にその色を表示します。
qiita.com
- 0.082835\\-0.091169 & 0.252431 & 0.015707\\0.000921 & -0.002550 & 0.178599
\end{pmatrix}\begin{pmatrix}X\\Y\\Z\end{pmatrix}}]
今回は、こちらのサイトを参考にしています。非常に詳しいのでぜひご覧ください。
qiita.com
コード
ColorリポジトリにXYZ_color_spaceという名前で追加しています。
Point in Polygonで長くなっていますが、本体は短いです。
github.com