2015年8月25日火曜日

ColorChecker

ColorCheckerの色の値を正確に知るための調査。
その為には 「分光反射率」 と 「光源の分光分布」 と 「XYZ等色関数」 を得る必要がある。

このページからたどれば大体必要なものは得られそう。
ColorChecker - Wikipedia https://en.wikipedia.org/wiki/ColorChecker

XYZ等色関数

波長の分布からXYZ色に変換するための各波長ごとのウェイトのこと
  • CIEが定めたCIE_RGBの原色を使った加法混色であらゆる色を表そうとするとこの組み合わせでは彩度が足りなくて再現できない色が在り、その場合は足りない分は負の値とするRGB等色関数ができたが、もっと扱いやすいようにこれを変形させて負の値が無いXYZ表色系が作られた。この等色関数がXYZ等色関数。
  • CIE 1931(2°視野) と CIE 1964(10°視野) があるがほとんどCIE 1931(2°視野)が使用されていると思われる。
  • 一般的には波長に対する等色関数の範囲は380-730で扱われていると思われるが広範囲のものでは360-830nmもある。
  • CIEが定めたRGB原色は1931年当時入手しやすかった水銀の輝線スペクトルから選ばれた。
    • R = 700.0nm 可視域最長のキリのよい波長
    • G = 546.1nm 水銀の輝線スペクトルより
    • B = 435.8nm 水銀の輝線スペクトルより

XYZ等色関数についての補足

  • RGB等色関数とマイナス値。
    • XYZ等色関数の基となっているのがRGB等色関数
    • 等色実験によリファレンスの純色と比べてRGBの加法混色では彩度が足りなかったところが負の値となる。
    • 白いところほど大きな負の値になっている。
  • 下記の色は波長をCIE_RGB変換したもの。(γ=2.2の補正。また青が飽和しないよう1.96で割っている)

    • これは波長のエネルギーはすべて同じとしたときの見え方。
    • 近紫外線より大きな波長から徐々に紫が見えてきて、青、緑、黄緑、黄色、橙、赤に感じた後は近赤外線になるにつれて見えなくなってくる。
    • 1050 nmの赤外線が見えるという話や子供で310nmの紫外線が見えるという話もあるhttps://en.wikipedia.org/wiki/Light#cite_note-Sliney1976-10
  • 上記の画像で左側があまり紫に見えないのはモニタの色空間がCIE_RGBとは違うから。sRGBの色に変換したのがこれ
CIE 1931 observer
  • 2度視野等色関数ともいう
  • 視角約 1°∼約 4°の視野に関して扱う

CIE 1964 observer
  • 10度視野等色関数ともいう
  • 視角 4°以上に対して扱うもの

少しマイナーな等色関数

  • modified by Judd (1951)
  • modified by Judd (1951) and Vos (1978)
CIE1931等色関数の勧告後、Judd,Vosにより V(λ) の修正が提案され、それに伴ってCIE1931等色関数にも修正が必要になると考えられた。また、StilesとBurchによる等色関数の測定においても、被験者の等色関数データの平均とCIE等色関数には有意な差があることが報告された。しかし、CIEは、これらの差は標準を変更するほどの違いではないとして、現在でも2°視野用にCIE1931等色関数が国際標準として利用されている。
via:六原色ディスプレイを用いた等色実験

XYZ等色関数のリファレンス

CIE - INTERNATIONAL COMMISSION ON ILLUMINATION
http://www.cie.co.at/index.php/LEFTMENUE/index.php?i_ca_id=298
380nm-780nm 5nm step

JIS Z 8781-1:2012 測色−第1部:CIE測色標準観測者の等色関数
http://kikakurui.com/z8/Z8781-1-2012-01.html
360-830nm 1nm step

File Exchange - MATLAB Central
http://www.mathworks.com/matlabcentral/fileexchange/7021-spectral-and-xyz-color-functions/content/colorMatchFcn.m
Judd (1951) and Vos もある。一個下のリンクをリファレンスにしている↓

Colour matching functions
http://cvrl.ioo.ucl.ac.uk/cmfs.htm
各種等色関数を出力してくれる

色空間の変換 (1)
http://w3.kcua.ac.jp/~fujiwara/infosci/colorspace/colorspace1.html
RGB座標からXYZ座標への変換の説明が記載

Derivation of the 1931 Standard Observer
http://www.cis.rit.edu/mcsl/research/1931.php CIE1931_RGB_v2.xls
RGB等色関数のテーブルが記載。上のグラフで使用したもの。

分光反射率

可視光領域の各波長に対して反射した割合の分布を表したもの
分布量が右側に集中していれば赤い物、右ほど青、中間なら緑色、全波長を均等に強く反射すれば白、弱ければ黒といった具合

主に下の2つのデータが使われていると思う。

Noboru Ohta (1997) 

http://www.cis.rit.edu/research/mcsl2/online/CIE/MacbethColorChecker.xls
 もとはコロナ社大田登出版の書籍に掲載されているものらしい。
 5nmステップ、範囲は380nm-780nmの範囲

BabelColor Avg

http://www.babelcolor.com/download/ColorChecker_RGB_and_spectra.xls
 BabelColorというところが計測した平均値が使われている。時期的にはこちらのほうが新しい。
 10nmステップ、範囲は380nm-730nm

Noboru Ohta (1997) とBabelColor Avgの比較

分光反射のプロットと分光反射から得られるxyY,RGBがどの程度の差があるのか知りたかったので比較した。
  • 等色関数はCIE 1931 observer
  • ステップは分光反射、等色関数、ともに5nm
  • 光源を無視したxyY。(全波長でエネルギーが均一なE光源ともいえる)
  • RGBは8bit表示での比較。(xyYからCEI_RGBに変換後ガンマ2.2の補正をしたもの)



光源の分光分布

光源の各波長に対してどのくらい強度があるかの分布

下の図は5nmステップの分光分布データから求めたXYZ値とsRGB色を表したもの。
illuminant A illuminant C

illuminant D50黒体輻射 5000K

illuminant D65黒体輻射 6500K

illuminant Eilluminant F7
↑nikqさんのツイートにより間違いが指摘されていたので修正しました。6500Kの画像が5500Kのものになっていました

黒体輻射

黒体とは真っ黒な物体であり、可視光以外から見ても黒いためすべての波長を吸収する理想の物体のこと。
黒体を加熱するとそれに伴った電磁波が発生し、この黒体の温度(ケルビン)と発生する電磁波の各波長の強度の関係はプランクの法則によってわかる

鉄が熱せられて赤くなり、もっと熱すると白くなるのも似た現象。
白熱灯のフィラメントが高温になるほど赤味が少なくなるのも同じ。
太陽の色も温度が関係しているし、星が青白いものは高温だから

0Kが絶対零度で摂氏-273.15℃のこと。人体も赤外線を放射している。

黒体輻射6500KとD65は照明としては似た結果になるが、スペクトルではD65はガタガタしている。
これは大気による吸収が原因で特定の波長が吸収されるため。

温度と分光放射輝度
 下記は両軸を対数として特定の温度の分光放射輝度をプロットしたグラフ
 273kは摂氏0℃、373Kは摂氏100℃。(もちろん可視光としては見えない)


ウィーンの変位則
 電磁波のピークの波長は λ=2897/T [μm] として求められる
 例えば6000Kの場合は λ = 2897 / 6000 = 0.48 となり、480nmの可視光がピークとなる。
 人体の場合は λ = 2897 / (36+273) = 9.375 となり 9.4μmの赤外線がピークとなる

標準光源などのリファレンス

CIE - INTERNATIONAL COMMISSION ON ILLUMINATION
http://www.cie.co.at/index.php/LEFTMENUE/index.php?i_ca_id=298
A光源、D65光源のテーブルが記載。

http://ww3.isaco.ir/PERSIAN/mohandesi/STANDARD/SAPCO%201/JIS/Z8701.pdf
C光源のテーブルが掲載。もうリンクが切れているみたい。(色彩科学ハンドブックにも同じものがある)

Appendix 5: Relative Spectral Power Distributions of Illuminants - Measuring Colour - Hunt - Wiley Online Library
http://onlinelibrary.wiley.com/doi/10.1002/9781119975595.app5/pdf
A,B,C,D系,F系,黒体輻射のすべてを網羅している。


ColorCheckerの値

上記で得た分光反射率と光源の分光分布を掛け合わせたものをXYZ等色関数のウェイトで足し合わせればXYZ色空間の色が求められる
RGBに変換する場合はXYZからリニアなR'G'B'に変換したあとγ補正を行い最終的なRGBとする

BabelColorを参考に同じ値になるか確かめた

↓リファレンス
http://www.babelcolor.com/main_level/Tutorials.htm
ColorChecker_RGB_and_spectra.xls
このエクセルのタブ「RGB_8_bit」のTabel1 Babelcolor Avg. の値をリファレンスとした

XYZの値

分光反射のデータは[BabelColor Avg]を使い[D65光源]を当て、[CIE 1931 observer]の等色関数を使用。


白いラインが光源を受けた後の分光反射で数値はXYZ値。
塗られている色はXYZ空間のガンマ2.2の補正したもの。

RGBの値

XYZから各色空間用の変換行列でR'G'B'に変換し、仕様のガンマ補正をかける。

上から[sRGB]、 [AdobeRGB]、 [ProPhotRGB]




BabelColorの値。

via:ColorChecker_RGB_and_spectra.xls 一部を切り出したもの
ほとんど一緒の結果となった。(一部の値で1/255の誤差がある)
2015年8月23日日曜日

RGB to RGB

別の色空間へのRGBに変換する場合のメモ。
2015/9/24修正(Mayaの白色点変更がcat02みたいなのでMayaと合わせた)

例えばACES色空間のRGB値をsRGB空間の値に変換したい等の場合、変換先の色空間への変換行列を求めれば直接変換できる。

異なる色空間へのRGB変換方法

変換元と変換先それぞれのXYZtoRGBマトリクスと白色点Xn,Yn,Znの計4個のパラメータから求めることができる。白色点変更はcat02を使用。(白色点変更に関しては最近はbradfordよりもcat02が使われるケースが多いのかも)

下記はsRGBからACES2065-1に変換する場合。


下記は左から[ACES→ACEScg] 、 [ACES→XYZ(D65)]、 [adobeRGB→sRGB]

 

pythonのコード 15/10/02追記

from numpy import *

#白色点のXnYnZnの配列 (3*1mat)
arrMatLightXYZ = [
matrix('1.0;1.0;1.0'),                       #E   from(x,y = 1/3,1/3)
matrix('1.09849061235,1,0.355798257455'),    #A   from(x,y = 0.44758,0.40745)
matrix('0.98070597166;1;1.18224949393'),     #C   from(x,y = 0.31006,0.31616)
matrix('0.96429567643;1;0.82510460251'),     #D50 from(x,y = 0.3457,0.3585)
matrix('0.95264607457;1.0;1.00882518435'),   #D60 from(x,y = 0.32168,0.33767)
matrix('0.950455927052;1.0;1.08905775076'),  #D65 from(x,y = 0.3127,0.3290)
matrix('0.894586894587;1.0;0.954415954416')] #dci from(x,y = 0.3140,0.3510)
arrKeyLightXYZ = ["E","A","C","D50","D60","D65","dci"]
arrMatLightXYZ = dict(zip(arrKeyLightXYZ,arrMatLightXYZ))

#XYZtoRGBの配列  (3*3mat)
arrMatXYZ2RGB = [
matrix('1 0 0; 0 1 0; 0 0 1'), #ZYZ(E)
matrix('3.2409699419 -1.5373831776 -0.4986107603; -0.9692436363 1.8759675015 0.0415550574;0.0556300797 -0.2039769589 1.0569715142'), #sRGB(D65)
matrix('2.7253940305 -1.0180030062 -0.4401631952; -0.7951680258 1.6897320548 0.0226471906;0.0412418914 -0.0876390192 1.1009293786'), #DCI-P3
matrix('1.716651188 -0.3556707838 -0.2533662814; -0.6666843518 1.6164812366 0.0157685458;0.0176398574 -0.0427706133 0.9421031212'), #Rec.2020
matrix('1.6410233797 -0.3248032942 -0.236424695; -0.6636628587 1.6153315917 0.0167563477; 0.0117218943 -0.0082844420 0.9883948585'), #ACESap1(D60)
matrix('1.0498110175 0 -0.0000974845; -0.4959030231 1.3733130458 0.0982400361; 0 0 0.9912520182'),                                   #ACESap0(D60)
matrix('1.2694188828 -0.0988302413 -0.1705886415; -0.8363858117 1.8007170555 0.0356687562; 0.0297300599 -0.0314712627 1.0017412028')] #SharpRGB(E)
arrKeyXYZ2RGB = ["XYZ","sRGB","P3","2020","ACESap1","ACESap0","SharpRGB"]
arrMatXYZ2RGB = dict(zip(arrKeyXYZ2RGB,arrMatXYZ2RGB))

#白色点変更メソッドはcat02
mAdaptation = matrix('0.7328 0.4296 -0.1624; -0.7036 1.6975 0.0061; 0.003 0.0136 0.9834')

#変換先の色空間へ変換するマトリクスを求める関数(変換元の色空間名,変換先の色空間名,変換元の白色点,変換先の白色点 を指定する)
def getMatrixRGBtoRGB(sourceXYZtoRGBname,destXYZtoRGBname,sourceWname,destWname):
    print '変換元:',sourceXYZtoRGBname,'  変換先:',destXYZtoRGBname,'  変換元白色点:',sourceWname,'  変換先白色点:',destWname,'\n'
    
    #---LMSスケールを求める---
    lmsS = mAdaptation * arrMatLightXYZ[sourceWname]
    lmsD = mAdaptation * arrMatLightXYZ[destWname]
    mScale = matrix(zeros((3, 3)))     #対角行列を入れる準備
    fill_diagonal(mScale,(lmsD/lmsS))  #対角行列を作成
    
    #---白色点変換マトリクス---
    mChangeW = mAdaptation.I* mScale * mAdaptation
    
    #---レンダ空間変換マトリクス(from XYZ)---
    mRGBtoRGB = arrMatXYZ2RGB[destXYZtoRGBname] * mChangeW * arrMatXYZ2RGB[sourceXYZtoRGBname].I
    
    set_printoptions(suppress=True,precision=10) #少数10桁表示
    print "sourceRGB to destRGB matrix: \n",mRGBtoRGB,'\n'
    return mRGBtoRGB

#**** 変換前色空間と変換先色空間、さらに変換前白色と変換先白色の4個の名前を指定する   ****
#**** 色空間 XYZ sRGB P3 2020 ACESap1 ACESap0 SharpRGB| 白色点 E A C D50 D60 D65 dci (白色点変更しない場合は双方同じものを入れておけば何でもよい)****
mRGBtoRGB = getMatrixRGBtoRGB('sRGB','ACESap0',"D65","D60")

'''変換元: sRGB   変換先: ACESap0   変換元白色点: D65   変換先白色点: D60 

sourceRGB to destRGB matrix: 
[[ 0.4395756842  0.3839125894  0.1765117265]
 [ 0.0896003829  0.8147141542  0.0956854629]
 [ 0.0174154827  0.1087343522  0.8738501651]] '''

色空間の原色であるRGBWのxyからrgb/xyz変換を求める場合はこれ > rgb/xyz 変換行列
2015年8月22日土曜日

白色点の変更

各色空間にはD65やD50のように光源(白色点)が決められているが白色点を変えたい場合はXYZ空間またはLMS空間でスケーリングする。

本当なら光の波長的にはD65からD50に光源を変えなくてはいけないがそういうわけにもいかないので白色点を合わせるためにスケーリングでバランスをとるようなものだと思う。
人の目の色順応やカメラのホワイトバランスと同じようなもの?

変換後のRGB空間で調整で調節するより、高色域を保持した状態でスケーリングしたほうが情報が欠落しない。
CGのレンダリングでもでホワイトバランス調整はRGB変換前にスケーリングしたほうが色域が保てるので良いと思われる。
どの程度有効なのかは今後調べたい。

白色の変更方法

XYZ空間でスケーリングするよりもLMS錐体の応答特性に変換してからスケーリングするほうが、色の見え方が良いとのこと

白色点変更の変換行列が総当たりで掲載されている(http://www.brucelindbloom.com/)
http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html

白色点変更の流れ

 XYZ空間 → 錐体応答(LMS)空間に変換 → 白色点合わせ → XYZ空間に戻す

 XYZからLMS空間に変換する行列は一般的に下記の3個が有名みたい。
  • XYZ Scaling (LMSには変換せずXYZのまま)
  • von Kries
  • Bradford
  変換行列
via:http://www.brucelindbloom.com/
Method[MA][MA]-1
XYZ Scaling
 1.0000000  0.0000000  0.0000000
 0.0000000  1.0000000  0.0000000
 0.0000000  0.0000000  1.0000000
 1.0000000  0.0000000  0.0000000
 0.0000000  1.0000000  0.0000000
 0.0000000  0.0000000  1.0000000
Bradford
 0.8951000  0.2664000 -0.1614000
-0.7502000  1.7135000  0.0367000
 0.0389000 -0.0685000  1.0296000
 0.9869929 -0.1470543  0.1599627
 0.4323053  0.5183603  0.0492912
-0.0085287  0.0400428  0.9684867
Von Kries
 0.4002400  0.7076000 -0.0808100
-0.2263000  1.1653200  0.0457000
 0.0000000  0.0000000  0.9182200
 1.8599364 -1.1293816  0.2198974
 0.3611914  0.6388125 -0.0000064
 0.0000000  0.0000000  1.0890636

  Bradford変換が一般的に使われている感じだが他にもいろいろ在るらしい。
  Bradford変換はphotoshopでも使用されているとのこと

D65からD50への変換行列を求める例

 lmsに変換する行列と、変換元と先の白色点Xn,Yn,Znの値が必要。
 Xn,Yn,Znがわからない場合は場合はx,yから変換する。


 変換方法の参考

 Bradford 変換 (白色点の変換)
 http://w3.kcua.ac.jp/~fujiwara/infosci/colorspace/bradford.html

 Chromatic Adaptation
 http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html

関連メモ

XYZ Scaling, Bradford, Von Kriesの評価が掲載Bradfordが最適

各変換モデルを画像で評価している(von Kries, Bradford, Sharp, CMCCAT2000, CAT02, XYZ)
Color Balancing Algorithms | Chromatic Adaptation | Jason Su
http://web.stanford.edu/~sujason/ColorBalancing/adaptation.html

Sharp, CMCCAT2000, CAT02  変換行列

Method [MA]
sharp
 1.2694 -0.0988 -0.1706
-0.8364  1.8006  0.0357
 0.0297 -0.0315  1.0018
cmccat2000
 0.7982  0.3389 -0.1371
-0.5918  1.5512  0.0406
 0.0008  0.239   0.9753
cat02
 0.7328  0.4296 -0.1624
-0.7036  1.6975  0.0061
 0.0030  0.0136  0.9834

下記ページに行列が表記されている

Two New von Kries Based Chromatic Adaptation Transforms Found by Numerical Optimization
http://web.stanford.edu/~sujason/ColorBalancing/Papers/Two%20New%20von%20Kries%20Based%20Chromatic%20Adaptation.pdf
(http://www.stanford.edu/)

LMS color space
https://en.wikipedia.org/wiki/LMS_color_space

カラーアピアランスモデル

環境光に応じ明るさや色順応までを考慮して見え方を一致させるための仕組みで、現在も改良されている。
von Kriesのモデルはlms錐体の応答に対して逆比例するような係数を掛けることで色の偏りを抑制するもで、この考え方が基になっているとのこと。
最近はCIECAM02という色の見えモデルが使われているらしい。

 照明・測光・測色
 http://annex.jsap.or.jp/OSJ/50th_cd/main/keyword/shomei_010.htm

 キヤノン:技術のご紹介 | 開発者が語る
 http://web.canon.jp/technology/interview/kyuanos/kyuanos_p4.html

 色再現技術における色の見えモデルの利用について 財団法人日本色彩研究所
 http://www.jcri.jp/JCRI/hiroba/COLOR/buhou/148/148-7.htm

イメージクリエーションの基礎理論 No.037 アンディマンの知恵袋/ウェブリブログ
 http://andyman.at.webry.info/201302/article_1.html

LMS色空間

 LMS color space
 https://en.wikipedia.org/wiki/LMS_color_space

2015年8月19日水曜日

各色空間のガンマカーブ

調べたら adobeRGB や Rec.709 は単純なカーブではなくsRGBのように暗部に線形部分を含むカーブとなっていたので覚書

暗部が線形のタイプ

  • sRGB
  • adobeRGB
  • ProPhotoRGB
  • Rec.709
文献によっては累乗だけで済ませているものもあるので注意が必要。
Rec.709 Gamma correction
線形部 : 傾き 閾値 非線形部 : 累乗値 非線形部 : オフセット
4.5 0.018 0.45 scale 1.099
add -0.099
https://en.wikipedia.org/wiki/ProPhoto_RGB_color_space

    緑の波線は参考としてのガンマ2.2

ProPhoto_RGB Gamma correction
線形部 : 傾き 閾値 非線形部 : 累乗値 非線形部 : オフセット
16 0.03125 1/1.8 scale 1
add 0
https://en.wikipedia.org/wiki/ProPhoto_RGB_color_space

AdobeRGB Gamma correction
線形部 : 傾き 閾値 非線形部 : 累乗値 非線形部 : オフセット
32 0.00173677 1/2.19921875 scale 1
add 0
正確にはガンマ2.2ではなく。563/256 = 2.19921875 とのこと。
また暗部に線形部があるがきわめて小さい値なので全体的にガンマ2.2としてもあまり問題はないと思われる
http://www.adobe.com/digitalimag/pdfs/AdobeRGB1998.pdf


sRGB Gamma correction
線形部 : 傾き 閾値 非線形部 : 累乗値 非線形部 : オフセット
12.92 0.0031308 1/2.4 scale 1.055
add -0.055
https://en.wikipedia.org/wiki/SRGB

NTSC(1953) Gamma correction
ガンマ2.2と記述している例 : 添付資料(312KB) - TOKYO TECH OCW - 東京工業大学
暗部が線形と記述している例 : http://www.babelcolor.com/download/A%20review%20of%20RGB%20color%20spaces.pdf

メモ

desmos

このグラフ作成ツールが便利。ブラウザでグラフが書けて式がわかりやすく表示されるのがいい。
変数を使ってスライダで値を変えることもできる。
複数のグラフの交点の値も表示してくれる。

https://www.desmos.com/
2015年8月18日火曜日

White point (白色点)の誤差

各色空間の白色点は、CIE standard illuminants(CIE標準光源)で定義されている。
しかし文献によってはこの値が微妙に違う。またこの違いによってXYZ/RGBの変換行列にも誤差が出てしまっている。
気にするほどの誤差ではないと思うが、以前から気になっていたのでので何が正しそうなのかを調査したいと思う

CIE標準光源
  • 標準光源は「D65光源」「D50光源」「C光源」等があり、XYZ表色系で表すことが多い。
  • XYZ : 光の波長分布λをXYZ等色関数で重み付けしたものを足し合わせて明るさを正規化したもの。Y = 1 or 100 で表される
  • xyY : XYZから変換されている
  • 各色空間でよく使われているのは「D65光源」「D50光源」。

値に誤差がある例(D65)

x y
0.3127 0.3290
比較的よく見る値。これが一番使われていそう。
xyの値として切の良い数値で丸められていると思われる

x y
0.31271 0.32902
この値がどのように出てきたのかはよくわからないが一部使われている

x y
0.31273 0.32902
XYZの値は95.047,100,108.883 とされている。
ここから求めたxyの値は x = 0.312726614681012, y = 0.329023130326062 となるのでこれを丸めたものだと思われるので一番正しそうに思う。
色のリファレンスとして有名なBluce LindbloomのページではこのXYZ値が掲載されている。


このほかにも微妙に違うものを使っているケースがたくさんあった。

ちなみにCIEのサイトにある5nmステップのD65光源と等色関数から求めたXYZとxyは
X = 0.950429662 Y = 1 Z = 1.088800568
x = 0.312720521 y = 0.329030684

http://files.cie.co.at/204.xls
(5nmステップのD65光源と等色関数)

Illuminant_D65の仕様

wikipedia にある "Illuminant_D65" https://en.wikipedia.org/wiki/Illuminant_D65 によると
  • CIE1931測色標準観測者の等色関数(2°視野等色関数)では x=0.31271, y=0.32902
  • CIE1964測色補助標準観測者の等色関数(10°視野等色関数)では x=0.31382, y=0.33100
  • 正規化されたXYZ値は X=95.047, Y=100.00, Z=108.883。
  • HDTVシステムで使用されるrec.709は値が切り捨てられた x=0.3127, y=0.329 を使用。
と書いてあると思われる。

ちなみに X=95.047, Y=100.00, Z=108.883 をxに変換すると、四捨五入して0.31273となるのが正しい数値だがここには出てこないのが疑問。
rec.709はあえて切り捨てた値を規格としているということなのかな?
10°視野等色関数に関してはほとんど使われていないと思う。

たぶんD65の白色点として定義されたxyはx = 0.31273 y = 0.32902 のほうが正しいが
色空間の規格で指定されている白色点が切捨てされている物( x = 0.3127 y = 0.3290)だったらそちらを使うほうがいいかもしれない。

白色点の違いに関して触れている資料を発見

↓やはり白色点に亜種が存在し、統一されていないので問題があると言っているようだ。
2015年8月14日金曜日

RGB/XYZ 変換行列

色々な色空間に変換するうえで RGB to XYZ ,XYZ to RGBの変換行列が重要なのでメモ。

カラースペースの三角形を形成するRGBの原色と白色点の4点のxy座標がわかれば変換行列は求まる。
  • RGBの原色と白色点Wのxy座標が必要となる。これらは各色空間の規格で定められている。
  • zの値はx,yの値から自動で求まる。x + y + z = 1
  • 白色点を正規化されたXn,Yn,Znにする。「正規化された」とは明るさ1.0のことでYの値が1.0になるような係数をかける。XYZ色空間ではYの値そのものが明るさとなっている。
  • RGB原色のxyzを行列として、その逆行列と正規化された白色点の行列の積でスケーリングのベクトルを求める
  • 上で求めたスケール値をRGBのxyzに掛ける。これでできた行列がRGBtoXYZ。
  • RGBtoXYZの逆行列がXYZtoRGBとなる

AdobeRGBの例


AdobeRGBのRGB原色と白色点のzyの値が必要(水色に塗られたセル)
オレンジに塗られたセルがXYZやRGBに変換する行列として求めたもの
https://sites.google.com/site/technorgbfiles/1508/XYZRGB_ConversionMatrix.xlsx


変換行列を使ってRGBやXYZに変換する。


但しこれらの変換はRGBが線形空間として扱われる必要があるので注意すること。

  • XYZからRGBに変換されたRGBは線形RGBなので、必要に応じてRGB色空間に定義されているガンマ補正を行う
  • RGBからXYZに変換する場合は、線形RGBになっている必要がある。なっていないならデガンマして線形空間にすること
現空間のRGBから別空間のRGBへの変換マトリクスはこれ > RGB to RGB

pythonのコード 15/09/29追記

任意のRGBWのxy座標からRGB/XYZ変換マトリクスを求める
from numpy import *

#色空間のプライマリRGBWのxyを指定する
Rx,Ry,Gx,Gy,Bx,By,Wx,Wy = 0.64,0.33,0.30,0.60,0.15,0.06,0.3127,0.3290    #sRGB
#Rx,Ry,Gx,Gy,Bx,By,Wx,Wy = 0.64,0.33,0.21,0.71,0.15,0.06,0.3127,0.3290    #AdobeRGB
#Rx,Ry,Gx,Gy,Bx,By,Wx,Wy = 0.68,0.32,0.265,0.69,0.15,0.06,0.3140,0.3510    #DCI-P3
#Rx,Ry,Gx,Gy,Bx,By,Wx,Wy = 0.74,0.27,0.22,0.78,0.09,-0.09,0.3140,0.3510    #DCI-P3+
#Rx,Ry,Gx,Gy,Bx,By,Wx,Wy = 0.74,0.27,0.17,1.14,0.08,-0.1,0.3127,0.3290    #Cinema Gamut
#Rx,Ry,Gx,Gy,Bx,By,Wx,Wy = 0.708,0.292,0.170,0.797,0.131,0.046,0.3127,0.3290    #Rec.2020
#Rx,Ry,Gx,Gy,Bx,By,Wx,Wy = 0.6898,0.3206,0.0736,0.9003,0.1166,0.0374,1.0/3,1.0/3    #sharpRGB
#Rx,Ry,Gx,Gy,Bx,By,Wx,Wy = 0.73470,0.26530,0,1,0.00010,-0.07700,0.32168,0.33767    #ACES2065-1
#Rx,Ry,Gx,Gy,Bx,By,Wx,Wy = 0.713,0.293,0.165,0.830,0.128,0.044,0.32168,0.33767    #ACEScg

#xyからzを求める
Rz = 1- Rx - Ry
Gz = 1- Gx - Gy
Bz = 1- Bx - By
Wz = 1- Wx - Wy

#白色点の正規化(yが1になる様にスケール)
Wxn = Wx/Wy
Wyn = Wy/Wy
Wzn = Wz/Wy

#変換マトリクスを求める
m1 = matrix([[Rx,Gx,Bx],[Ry,Gy,By],[Rz,Gz,Bz]])
mW1 = matrix([[Wxn],[Wyn],[Wzn]])
mW2 = m1.I * mW1
m2 = matrix([[mW2[0,0],0,0],[0,mW2[1,0],0],[0,0,mW2[2,0]]])
m = m1 * m2

set_printoptions(precision=10)
set_printoptions(suppress=True)
print "R:",Rx,Ry,"\n","G:",Gx,Gy,"\n","B:",Bx,By,"\n","W:",Wx,Wy,"\n",'W Xn,Yn,Zn:',Wxn,Wyn,Wzn,"\n"
print "RGB to XYZ matrix\n",m,"\n","\n","XYZ to RGB matrix\n",m.I


'''R: 0.64 0.33 
G: 0.3 0.6 
B: 0.15 0.06 
W: 0.3127 0.329 
W Xn,Yn,Zn: 0.950455927052 1.0 1.08905775076 

RGB to XYZ matrix
[[ 0.4123907993  0.3575843394  0.1804807884]
 [ 0.2126390059  0.7151686788  0.0721923154]
 [ 0.0193308187  0.1191947798  0.9505321522]] 

XYZ to RGB matrix
[[ 3.2409699419 -1.5373831776 -0.4986107603]
 [-0.9692436363  1.8759675015  0.0415550574]
 [ 0.0556300797 -0.2039769589  1.0569715142]]'''

メモ

エクセルで行列計算する方法

 行列の積の場合はたとえば3*3のセルを選んだ状態で =MMULT... と書き対象の行列を指定する。書き終わってもEnterは押さないこと。
 Ctrl + Shift + Enter で終了させること

  • 行列積 : MMULT
  • 逆行列 : MINVERSE
  • 行列入れ替え : TRANSPOSE
 数学/高度な計算 関数一覧
 http://www.excel-list.com/mathematics.html

 Excel(行列と配列数式)
 http://www.waseda.jp/ocw/ComputerScience/17-4003-01IntroductiontoITFall2003/StudyMaterials/root/document/emat.html

RGB/XYZ 変換行列求め方。各色空間のリファレンス参考

 RGB-Farbraum - Wikiwand
 各色空間のRGBWのプライマリが掲載

 RGB/XYZ Matrices (http://www.brucelindbloom.com/)
 (変換行列の求め方と各色空間の変換行列の掲載)

 Chromatic Adaptation
 (白色点の変更方法についてのページ。白色光源がXYZとして掲載されている)

 RGB Working Space Information
 (各色空間のRGB原色のxyY座標と白色点光源が掲載)

 Standard illuminant
 https://en.wikipedia.org/wiki/Standard_illuminant
 (標準光源のxyYの値が掲載)

 RGB → XYZ 変換行列の求め方

 CIE XYZ表色系(10): XYZ / RGB 変換マトリックスの計算
 http://www.enjoy.ne.jp/~k-ichikawa/CIEXYZ_RGBmat.html

 三原色法による色彩の表現方法
 http://usr.u-shizuoka-ken.ac.jp/modules/xoonips/download.php/AN10118525200503001020.pdf?file_id=861