前言
首先需要指明本文中描述的R,G,B并非通常的sRGB中的三个分量R',G',B',而是波长分别为700nm,546.1nm,435.8nm的单色红光,单色绿光,单色蓝光。sRGB中的R'G'B'中的红色、绿色、蓝色已经不是单色光了。虽然习惯上大家都叫RGB,但是需要有所区别。前面两篇讲解了CIE标准观察者色彩空间转换,本文开始回归正题。
常见的RGB色彩空间
常见的RGB色彩空间有sRGB,Adobe RGB,Apple RGB,BT709。因此描述一种RGB色彩空间,需要指明对应三基色和参考白点在CIE1931中间的位置,以上几种RGB色彩空间的位置如下表:
sRGB | Adobe RGB | BT709 RGB | ||||
x | y | x | y | x | y | |
红色 | 0.6400 | 0.3300 | 0.6400 | 0.3300 | 0.6400 | 0.3300 |
绿色 | 0.3000 | 0.6000 | 0.2100 | 0.7100 | 0.3000 | 0.6000 |
蓝色 | 0.1500 | 0.0600 | 0.1500 | 0.0600 | 0.1500 | 0.0600 |
白色 | 0.3127 | 0.3290 | 0.3127 | 0.3290 | 0.3127 | 0.3290 |
sRGB色彩空间分析
令
;
;
;
则
; ; ;
; ; ;
; ; ;
所以对于sRGB中的每一个刺激单位
对于XYZ来说,其三色刺激值为,如果是标准参考白点,那么:
但是参考白点是D65,因此需要做一些改变:
令
则
所以
改写成矩阵的形式
于是
带入数据可得
转换矩阵的生成
因为上面得出了这个表达式
对于sRGB色彩空间来说,三色刺激值为
对于XYZ色彩空间来说,三色刺激值为
所以
转换为矩阵表示形式如下:
带入数据可以得到sRGB转XYZ的矩阵如下:
rgb2xyz = 0.4124 0.3576 0.1805
0.2126 0.7152 0.0722
0.0193 0.1192 0.9505
对上式求逆矩阵可得
xyz2rgb = 3.2410 -1.5374 -0.4986
-0.9692 1.8760 0.0416
0.0556 -0.2040 1.0570
代码如下:
rx=0.6400;
gx=0.3000;
bx=0.1500;
wx=0.3127;
ry=0.3300;
gy=0.6000;
by=0.0600;
wy=0.3290;
rz=1-rx-ry;
gz=1-gx-gy;
bz=1-bx-by;
wz=1-wx-wy;
Swx=wx/wy;
Swy=wy/wy;
Swz=wz/wy;
S=inv([rx gx bx;
ry gy by;
rz gz bz])*[Swx Swy Swz]';
rgb2xyz=[rx*S(1) gx*S(2) bx*S(3);
ry*S(1) gy*S(2) by*S(3);
rz*S(1) gz*S(2) bz*S(3)];
xyz2rgb=inv(rgb2xyz);