• ベストアンサー

XYZカラースペース(CIE1931)について

RGB表色系ではスペクトル上のすべての色を表すのに一部負数が必要であり、計算に不便だったため負数を必要をせずともすべての色を表せるXYZ表色系を作ったことまでは分かっているのですが、どのような数学的手段でXYZを作ったのかが分かりません。 結果としてのRGBとXYZとの行列変換は見つかるのですがそこに至るまでの経緯を知りたいです。 もしお分かりの方が居ましたら難しい説明でも結構ですので教えていただけると幸いです。 また参考リンクなども募集しています。 よろしくお願いします。

  • 科学
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • sanori
  • ベストアンサー率48% (5664/11798)
回答No.2

コメントにお答えします。 >>>しかし、XYZの誕生の方法の理解まで至りませんでした。 一応、複数の人間を被験者として、純色、混色など色々な色を見せて、その色が被験者にどのような色に見えるかということはやっています。 そして、2つの色を混色したとき、単色光のどの色に見えるかということで、座標を定めることは簡単です。 どの色をどの座標に当てはめるか、ということだけなのですから。 つまり、「色空間」を表す座標系の定め方というものは恣意的なものなのです。 住所の定め方と同じです。どの地域を何丁目にするかは恣意的なことです。 しかし、阿呆な定め方をして、それぞれ丁の面積が大きかったり小さかったりすると、後々不都合が生じます。それがMacAdamの楕円に相当するわけです。 >>>RGBの各値とXYZの各値の関連も分かりませんし 光の三原色であるRGB表色系についても、やはり、人間に色々な色を見せて定めるわけです。 その上で、r、g、bの各値とx、y、zの各値とを相互に変換する行列をつくるのは、たやすいことです。 >>>XYZのYにだけ明度を操れるというのもよく分かりません。 おっしゃるとおり、通常、ある色の座標を表すときは、(x、y、Y)とします。 zとXとZがありません。 なぜ、zが不要かというと、 x=X/(X+Y+Z)、 y=Y/(X+Y+Z)、 z=Z/(X+Y+Z) x+y+z =1 という関係があるので、x、y、zの3つのうち独立なものは2つしかないからです。 そして、なぜ明るさのファクターとしてYしかないかというと、 色と明るさをひっくるめた座標は、(X、Y、Z)であるわけですが、 これを(X+Y+Z)で割ることによって、明るさによらない色を表す値x、y、zを求めた後は、 元々(X,Y、Z)という座標は独立変数が3つですので、(x、y)のほかは、もう1つということになります。 明るさを表す1つの値としては、Y単独で表してもよいし、X単独でもよいし、はたまた、X+Y とか X+Y+Z でもよいわけです。 ですから、Yのみで明るさを表すことには必然性はあまりありません。 ただし、人間の視感度というのは、赤や青よりも緑を明るく認識するという特徴があります。 したがって、明るさを表す値としては、緑の強度を表す値にほぼ 近いもの、すなわちYが最適であると考えられています。 本件、私の回答は、これをもって終了とさせてください。 では。

Kasukiano
質問者

お礼

回答ありがとうございます。 細かい説明までいただき感謝いたします。 Yの明度については回答者様の説明により理解いたしました。 等色関数によってRGBは得られるがXYZについては等色関数は用いず、RGBのみから誕生したと理解しています。 なのでまだ私自身理解不十分でありますので引き続き回答の募集をしたいと思います。 ただ回答者様のおかげで理解が膨らみました。 本当にありがとうございました。

その他の回答 (1)

  • sanori
  • ベストアンサー率48% (5664/11798)
回答No.1

こんばんは。 仕事でXYZ色空間等々を扱ったことがある者です。 結論から言いまして、XYZ表色系というのは、必然性があって定められたものではなく、テキトーに作られたものです。 したがって、「MacAdamの楕円」という致命的な問題点があります。 言い換えれば、XYZ表色系というのは、欠陥商品なのです。 http://gc.sfc.keio.ac.jp/class/2003_14454/slides/05/58.html http://homepage3.nifty.com/soshigaya/teki/001/204.htm そのため、楕円が円になるような補正をした表色系が色々と考えられています。 よく使われているのは、Lab表色系です。 ご参考になりましたら幸いです。

Kasukiano
質問者

補足

回答ありがとうございます。 MacAdamの楕円はしっかり学習していなかったのですが参考URLで理解に至りました。ありがとうございます。 XYZに問題があることは分かりました。 しかし、XYZの誕生の方法の理解まで至りませんでした。 RGBの各値とXYZの各値の関連も分かりませんしXYZのYにだけ明度を操れるというのもよく分かりません。 テキトーに作られたものでも実験にもと基づく数学的手段があるのかと思いますが、なかなか見つからないんですよね。。 もしお分かりであれば教えていただきたいです。

関連するQ&A

  • 【色】PC上で波長から色を求める

    再び質問させていただきます。 波長から色を求めてコネコネするプログラムを作りたいと思いました。 それで http://www.op.titech.ac.jp/lab/Take-Ishi/hirameki/sp2xyz.pdf こちらのPDFに行き着き、国際照明委員会(CIE)のHPを見つけ http://www.cie.co.at/index_ie.html フリードキュメントから 「CIE 1931 Standard Colorimetric Observer x2(lambda) data (between 380 nm and 780 nm at 5 nm intervals)」 を見つけたまでは良かったのですが、ここにあるx,y,zの値の意味がどうにも理解できませんでした。 XYZ表色系かと思いましたが、マイナス値が無いので違うのかな?と思い、さらにRGBに直してみてもマイナスの値や、1以上の値が出てきてきました。 ではPDFの方のx,y,zがxyY表色系に相当するのかと思いましたが、それもおかしい結果になります。 (というかそもそもPDFにある「xyz 色座標」という用語自体検索でほとんど出てきません) この数字の意味が分かる方いらっしゃいましたらよろしくお願いいたします。 ちなみにデータをこちらに用意いたしました。 http://sirooni.moe.to/data20071212.txt

  • c++でのクラス設計について

     今,c++で色を表すクラスを作っています.  色とはいっても,RGBやXYZなどいろいろな色がありますよね?もし,「各成分の合計を求める」なんて言う関数を作ろうと考えるとすると(必要ないですが^^…)RGBに対しても,XYZに対しても,というように2つ以上作るのは面倒です.そこで,n成分を持つ色のクラスというものを作って,そのクラスを継承して,RGB, XYZなどを表せないかと考えました.  つまり… class color3{ double data[3]; ~~~~~~ }; class rgb : public color3{ ~~~~~~ }; class xyz : public color3{ ~~~~~~ }; (実際color3はtemplateクラスで,double data[3]もポインタを使って要素数を変更できるようにしています.) もちろんこの方法で正常に動いていますが….これではrgbクラスの変数cを宣言して,成分を参照するときに,赤色ならc.data[0],緑色ならc.data[1]というように,data[~]で参照しなければなりません.しかし,これでは見にくいと思っています><.できるなら赤色ならc.r, 緑色ならc.gというように参照したいです.もちろん派生クラスの中にdouble r, g, b; と宣言すればいいのですが… .そうしてしまうと,一番最初の目的が達成できません.ポインタを使ったり,メンバの値を取得する関数(getR(), getX()みたいな…)を作れば解決できますが,この方法を使うと*(c.r), c.r()のような参照をしなければならず,「c.r」というようなきれいな参照はできません.贅沢を言っているようではありますが.c.rと表せるようなクラスの設計の仕方はあるでしょうか?  現在ぼんやりと考えているのは class color3{ double data[3]; ~~~~~~~ }: class rgb : public color3{ double &r = data[0]; double &g = data[1]; double &b = data[2]; ~~~~~~ }; class xyz : public class3{ ~~~~~~ }; のように,参照変数を使えないか,と思っています.もちろん上の方法ではコンパイルエラー となりましたが><  質問が長くなってしまいすいません><  よろしくお願いします. 必要ないかもしれませんが参考までに… 【環  境】MaxOS 10.6 【言  語】c++ 【開発環境】Xcode 【 レベル 】プログラミング歴6年 c歴4年 c++歴1年の大学1年です

  • ラベルをRGBに変換する方法

    k=1,2...,n-1,n の値をRGBに変換したいんです。 k=1をR=50,G=89,B=32 という風に。(数字はランダムです) RGBはすべて0~255の範囲です。 近いkのRGBとは離れた色にしたいんです。 画像関係のことなんですが、処理は数学なので投稿しました。 お願いします。

  • 行列を考える意義

    行列は結局何のために考え出されたものなのでしょうか。ベクトルなら、方向を持つ量として、力・速度など具体的なイメ-ジが湧きます。行列って何なんでしょうか? 行列の計算法は知っています。1次変換の問題も解けます。 でも、行列を使わなくても1次変換の問題は解けるでしょう? どうして、行列というものが考え出され、使われるようになったのですか? 私はおよそのところ、高校数学しかわかりません。 必要性や導入の経緯やイメ-ジを教えてください。

  • RGB変換について、教えて下さい。

    以前から疑問に感じていたことを質問させて頂きます。ご存じの方がおりましたら、是非教えて下さい。 ビデオカメラやテレビカメラなどのカラーの映像を撮るためには、被写体からの光をRGBの3原色に分解し、RGB値に変換することが必要だと思うのですが、疑問に思うことは、例えば、被写体からの光が「混合色の黄色」の場合はRGBに分解することは容易だと思うのですが、被写体からの光が「純色(光のスペクトル色)の黄色」の場合はRGB値にどのように変換しているのでしょうか。 また、カラー写真の場合にはどうでしょうか。この場合には、「純色の緑」はCMYKにどのように変換しているのでしょうか。

  • 任意軸回転を、XYZ軸回転の組み合わせに分解する?

    こんにちは、私は今DirectXを使って物理シミュレーションを行おうとしております。 そこで物体を任意軸回転させて表示したいのですが、どういった方法を用いれば実現できますか? http://marupeke296.com/DXGSmp_No10_Quaternion.html このサイトで解説されているようにクォータニオンを使うのでしょうか? ただこのサイトで示されているサンプルでは、玉ひとつひとつが回転しているわけではなく、位置がある軸に関して回転させた位置へ「並進させる」ということを行っています。 私は物体を回転させるときに、任意軸回転を使いたいなと思っています。 -- D3DXMatrixRotationX(&Rot_X, angle); D3DXMatrixMultiply(&World, &World, &Rot_X); -- 以上はX軸回転を行う行列をワールド座標変換行列に掛けるコマンドですが、この勢いで任意軸回転行列を作成・掛けるといったことはできますか? 知識が足りなく稚拙な表現で申し訳ありませんが・・・ 任意軸回転をXYZ軸回転の組み合わせに分解できれば D3DXMatrixRotationX(YやZ)とD3DXMatrixMultiply関数のみを使って簡単にできちゃうのですがそのような数学的手法は存在しますか? それとも、任意軸回転関数を自前で既に作ってあるので D3DXMATRIX型の変数にその値を手動で注入(構造体の中身を知る必要あり)、D3DXMatrixMultiply関数で掛けるといった操作でいけちゃうでしょうか? あとでちょっとやってみます。すみません。しかしD3DX~系の用意された関数の域を出て気持ちよくはないですが。

  • カラー印刷が汚い

    ■製品名を記入してください。 MFC-6983CDW       】 ■どのようなことでお困りでしょうか?  相談したいこと、トラブルに至った経緯、試したこと、エラーなどを教えてください。 【   赤色と黄色が青色になり、クリーニングするとインクがなくなる                     】 ■お使いの環境について教えてください。 ・パソコンもしくはスマートフォンのOSは何ですか? (例)Windows・MacOS・iOS・Android 【 WINDOWS10       】 ・どのように接続されていますか? (例)有線LAN・無線LAN・USBケーブル・bluetooth 【 有線LAN       】 ・関連するソフト・アプリがあれば教えてください。 【 PAINT、EXCEL、CHROME、EDGEなど全て       】 ・電話回線の種類は何ですか? (例)アナログ回線・ISDN回線・ひかり回線・IP電話 【   ひかり回線     】 --------------------------------------------- ※以下は記入いただく必要はありません。 ■閲覧していたFAQのタイトル 【インクジェット プリンター】インクが出ない/白紙になる/色合いがおかしい|ブラザー ■閲覧していたFAQのURL https://faq.brother.co.jp/app/answers/detail/a_id/10644 ※OKWAVEより補足:「ブラザー製品」についての質問です。

  • 印刷用カラーチャート(PDF)を作りたい

    趣味でCGを描いています。出来上がったデータをコンビニの デジタルプリントで出力して保存するので、データがきれいな ベクターデータをメインに制作しています。  そのための出力用カラーチャートを制作しているのですが、 色そのものの下に色情報をテキストで記入するという方法を とっていて、入力が大変すぎて挫折しました。  そこで素人考えですが。 指定された領域に色を入れるとその領域の色情報が別の場所に数値で 表示されるというようなWEB上のページを見たことがありますので、 同じ理屈で□に色をピッカーで入れていけば下に自動的に 数値が記入されるというようなファイルができるはずだと 思ったのですけれど。 塗りのない□を作る→その下の文字列に□の塗りに使われた色情報の 数値を抽出するように設定する→その□と文字列をグループ化して 色数分コピー→後は□に色を入れれば下の文字列に数字が出る  というような感じで。 最終的にコンビニのコピー機で印刷するのが目的ですので、 ベクターデータを保持したままPDFに出力できるものの中で、 上記のようなファイルを作れるソフトウェアはありませんでしょうか。  色データの数値はRGB・CMYK・HSV・WEBsafeRGBの4つを記入したい ので、できればすべてのカラーモードの数値に対応しているものを。  現在IllustratorCS3を使っていて、事務系などのソフトウェアは 全く知らない状態です。また、上記のような操作が可能な場合、 この操作や必要な機能は一般的にどういう名前で呼ばれているのかも 合わせてお教えいただけるとありがたいです。 (名称がわからないので検索や書籍でも調べられないです)  よろしくお願いいたします。

  • カラー印刷ができない

    下記の質問にお答えください。 --------------------------------------------- ■製品名を記入してください。 【  DCP-J582N   】 ■どのようなことでお困りでしょうか?  相談したいこと、トラブルに至った経緯、試したこと、エラーなどを教えてください。 【 カラー印刷ができないため、すべて純正の新しいインクに変えてカラー印刷したが、青や黒色のような色しか出ず、カラー印刷ができない  】 ■お使いの環境について教えてください。 ・パソコンもしくはスマートフォンのOSは何ですか? (例)Windows10/8.1/7・MacOS・iOS・Android 【    Windows10    】 ・どのように接続されていますか? (例)有線LAN・無線LAN・USBケーブル 【    無線LAN   】 ・関連するソフト・アプリがあれば教えてください。 【        】 ・電話回線の種類は何ですか? (例)アナログ回線・ISND回線・ひかり回線・IP電話 【        】 --------------------------------------------- ※以下は記入いただく必要はありません。 ■閲覧していたFAQのタイトル 【インクジェット プリンター】インクが出ない/白紙になる/色合いがおかしい|ブラザー ■閲覧していたFAQのURL https://faq.brother.co.jp/app/answers/detail/a_id/10644 ※OKWAVEより補足:「ブラザー製品」についての質問です。

  • xyz=1のとき,

    xyz=1のとき, x^2/(x-1)^2+y^2/(y-1)^2+z^2/(z-1)^2>=1 を証明せよ。 zを消去したあとの式は複雑であるのと計算の進め方がわからない。 左辺の式の形を崩さないで考えていくのか。 考えのとっかかりが見えないので、アドバイスお願いします。