【C言語】RGB表色系をXYZ表色系に変換するプログラム 【C言語】RGB表色系をXYZ表色系に変換するプログラム – みなためラボ

【C言語】RGB表色系をXYZ表色系に変換するプログラム


文字サイズ:?? (px)

はじめに

みなため

どうも! みなため(@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.55,0.90,0.12)

次は、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倍してください。

ちなみに、色は以下の円のとおりです。

RGB = (120,240,220)
キャラクター

今回はここまでです。かなりマニアックな内容の記事だったと思います。皆さん、お疲れさまでした。

関連記事

記事本文下のバナー広告

この記事をSNSでシェアする

 

プログラミングカテゴリーの最新記事(5件)

管理人のTwitter

Tweets by MinatameT

内部リンク集

広告枠のレンタルの詳細はこちら!
記事作成のご依頼の詳細はこちら!