みなためラボ

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

文字サイズ

はじめに

どうも! 高杉 皆為(@MinatameT)です。

この記事は、「XYZ表色系やL*a*b*表色系については大体知っている」という方を対象にしています。そのため、表色系についての説明はおこないません。

なお、関連記事に「RGB表色系をXYZ表色系に変換するプログラム」があります。必要であればご覧ください。

XYZ表色系に変換する前のRGBの値の範囲は、「0から1まで」であることに注意してください。

それでは、ソースコードと実行結果を確認していきます。

XYZ表色系からL*a*b*表色系に変換するプログラム

ソースコード

#include<stdio.h>
#include<math.h>

int main(void)
{
  double X,Y,Z;
  double Xp,Yp,Zp;
  double L,a,b;

  printf("Xの値を入力してください。>");
  scanf("%lf",&X);
  printf("Yの値を入力してください。>");
  scanf("%lf",&Y);
  printf("Zの値を入力してください。>");
  scanf("%lf",&Z);

  Xp = X*(100.0/95.047);
  Yp = Y*(100.0/100.0);
  Zp = Z*(100.0/108.883);

  if(Xp>0.008856)
  {
    Xp = pow(Xp,(double)1/3);
  }
  else
  {
    Xp = (7.787*Xp) + ((double)16/116);
  }
  if(Yp>0.008856)
  {
    Yp = pow(Yp,(double)1/3);
  }
  else
  {
    Yp = (7.787*Yp) + ((double)16/116);
  }
  if(Zp>0.008856)
  {
    Zp = pow(Zp,(double)1/3);
  }
  else
  {
    Zp = (7.787*Zp) + ((double)16/116);
  }

  L = (116*Yp) - 16;
  a = 500*(Xp - Yp);
  b = 200*(Yp - Zp);

  printf("・XYZ表色系   :(%0.4f,%0.4f,%0.4f)\n",X,Y,Z);
  printf("・L*a*b*表色系:(%0.4f,%0.4f,%0.4f)\n",L,a,b);
	
  return(0);
}

pow関数は、累乗計算をするためのものです。pow関数を使うためには、「#include<math.h>」を記述しておく必要があります。

pow関数の文法や使用例については、次の記事をご覧ください。

それでは、実行結果の例を確認していきます。

実行結果の例

Xの値を入力してください。>0.5703
Yの値を入力してください。>0.7693
Zの値を入力してください。>0.2320
・XYZ表色系   :(0.5703,0.7693,0.2320)
・L*a*b*表色系:(90.2894,-36.4231,63.8021)

もう1つだけ例を示します。

Xの値を入力してください。>0.2121
Yの値を入力してください。>0.1337
Zの値を入力してください。>0.0932
・XYZ表色系   :(0.2121,0.1337,0.0932)
・L*a*b*表色系:(43.3155,47.6052,14.1264)

このように、XYZ表色系をL*a*b*表色系に変換することができました。

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

追記:反省とお礼

この記事(修正前)について、ある親切な方から「実行結果の値がおかしい」とのご指摘をいただきました。

ソースコードをよく確認したところ、pow関数内の分数のdouble型への「型キャスト」を忘れており、正しいXp、Yp、Zpの値が計算できていませんでした。

私の確認不足によって一部の読者さんにご迷惑をおかけしたことを反省し、次からは内容の正確性の確認の強化に努めます。

ご指摘をしてくださった親切な方には、本当に感謝しています。ありがとうございます。


 

みなためじゃんけん

このコーナーは、私と擬似的にじゃんけんできるコーナーです。

みなためじゃんけん、じゃんけんぽん!

私が出したのは……





グー

グーでした! パーの勝利です!



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

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

最新記事(10件)

管理人のTwitter

内部リンク集