ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Processing】XYZ色空間とRGB色空間の変換。烏帽子型のあのグラフを表示する!

成果物

f:id:Nekodigi:20200329124722p:plain
XYZ色空間は知らなくても、この図を見たことがある方は多いのではないでしょうか。これは、XYZ色空間を二次元(xyY)に変換したものです。三角形がCIERGBの範囲で、多くの色の一部しか表せていないことがわかります。
f:id:Nekodigi:20200329124215p:plain
ちなみに、XYZをただ入力すればこの形になるわけではなく、XYZを0~1の範囲にしてxyYに変換するとこのような三角形になります。今回は、380~780nmでのRGBの測定値をxyYに変換し、はみ出た部分をカットすることであの形を再現しています。
f:id:Nekodigi:20200329124703p:plain
それでは、数式の紹介に移ります。

仕組み

まずは、380~780nmのRGB測定値(ソールコードを参照してください)をRGB→XYZ→xyYに変換し、有効領域の多角形を求めます。
RGB→XYZ
{\begin{pmatrix} X \\ Y \\ Z \end{pmatrix}=\begin{pmatrix} 2.76883 & 1.75171\quad  & 1.13014 \\ 1.0 & 4.59061 & 0.06007 \\ 0.0 & 0.05651 & 5.59417 \end{pmatrix}\begin{pmatrix} R \\ G \\ B \end{pmatrix}\\ Y=1.0R+4.59061G+0.06007B}
XYZ→xyY(xyのみを使用して、二次元にします)
 \begin{array}{l}
x=\frac{X}{X+Y+Z}\\
y=\frac{Y}{X+Y+Z}\\
Y=Y
\end{array}
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