もくじ
はじめに
どうも! みなため(@MinatameT)です。
この記事は、「RGB表色系やXYZ表色系については大体知っている」という方を対象にしています。そのため、これらの表色系については簡単に説明しておきます。
まず、RGB表色系には次のような特徴があります。
- Rは赤色の強さ。数値が大きいほど、赤色が強くなる。
- Gは緑色の強さ。数値が大きいほど、緑色が強くなる。
- Bは青色の強さ。数値が大きいほど、青色が強くなる。
- R、G、Bの値の範囲は、0.0から1.0とする場合と、0から255とする場合がある。
また、XYZ表色系には次のような特徴があります。
- Xは赤色の強さ。数値が大きいほど、赤色が強くなる。
- Yは緑色の強さと明るさ(輝度)。数値が大きいほど、緑色が強くなり、明るくなる。値の範囲は、0.0から1.0とする場合と、それを100倍にして0から100とする場合がある。
- Zは青色の強さ。数値が大きいほど、青色が強くなる。
- RGB表色系と違って、すべての色を表現できる。
それでは、プログラムのソースコードを示していきますが、ここで注意点があります。それが、RGB表色系の種類についてです。
ここでは、一般的によく用いられている「sRGB(D65)表色系」を使って、XYZ表色系を求めます。
※他のRGB表色系では計算式が異なりますので、注意してください。
それでは、ソースコードと実行結果を確認していきます。
RGB表色系からXYZ表色系に変換するプログラム
まず、RGBの範囲が0.0から1.0の場合のソースコードと実行結果です。
ソースコード(RGBの範囲が0.0から1.0の場合)
#include<stdio.h>
int main(void)
{
double R,G,B;
double X,Y,Z;
printf("R、G、Bそれぞれの値の範囲は0.0から1.0です。\n");
printf("Rの値を入力してください。>");
scanf("%lf",&R);
printf("Gの値を入力してください。>");
scanf("%lf",&G);
printf("Bの値を入力してください。>");
scanf("%lf",&B);
X = (0.4124*R) + (0.3576*G) + (0.1805*B);
Y = (0.2126*R) + (0.7152*G) + (0.0722*B);
Z = (0.0193*R) + (0.1192*G) + (0.9505*B);
printf("・RGB表色系:(%0.4f,%0.4f,%0.4f)\n",R,G,B);
printf("・XYZ表色系:(%0.4f,%0.4f,%0.4f)\n",X,Y,Z);
return(0);
}
それでは、実行結果を確認していきます。
実行結果の例(RGBの範囲が0.0から1.0の場合)
R、G、Bそれぞれの値の範囲は0.0から1.0です。
Rの値を入力してください。>0.55
Gの値を入力してください。>0.90
Bの値を入力してください。>0.12
・RGB表色系:(0.5500,0.9000,0.1200)
・XYZ表色系:(0.5703,0.7693,0.2320)
このように、sRGB(D65)表色系がXYZ表色系に変換されました!
※Yの値の範囲は、0.0から1.0としています。0から100とする場合は、X、Y、Zすべての値を100倍してください。
ちなみに、色は以下の円のとおりです。
次は、RGBの範囲が0から255の場合のソースコードと実行結果です。
ソースコード(RGBの範囲が0から255の場合)
#include<stdio.h>
int main(void)
{
int R,G,B;
double Rd,Gd,Bd; //入力されたRGBをdouble型に変換したもの
double X,Y,Z;
printf("R、G、Bそれぞれの値の範囲は0から255です。\n");
printf("Rの値を入力してください。>");
scanf("%d",&R);
printf("Gの値を入力してください。>");
scanf("%d",&G);
printf("Bの値を入力してください。>");
scanf("%d",&B);
Rd = (double)R/(double)255;
Gd = (double)G/(double)255;
Bd = (double)B/(double)255;
X = (0.4124*Rd) + (0.3576*Gd) + (0.1805*Bd);
Y = (0.2126*Rd) + (0.7152*Gd) + (0.0722*Bd);
Z = (0.0193*Rd) + (0.1192*Gd) + (0.9505*Bd);
printf("・RGB表色系:(%d,%d,%d)\n",R,G,B);
printf("・XYZ表色系:(%0.4f,%0.4f,%0.4f)\n",X,Y,Z);
return(0);
}
それでは、実行結果を確認していきます。
実行結果の例(RGBの範囲が0から255の場合)
R、G、Bそれぞれの値の範囲は0から255です。
Rの値を入力してください。>120
Gの値を入力してください。>240
Bの値を入力してください。>220
・RGB表色系:(120,240,220)
・XYZ表色系:(0.6864,0.8355,0.9413)
このように、sRGB(D65)表色系がXYZ表色系に変換されました!
※Yの値の範囲は、0.0から1.0としています。0から100とする場合は、X、Y、Zすべての値を100倍してください。
ちなみに、色は以下の円のとおりです。
今回はここまでです。かなりマニアックな内容の記事だったと思います。皆さん、お疲れさまでした。
関連記事