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

0 件のコメント:

コメントを投稿