详解RGB和XYZ色彩空间转换之中篇

前言

        首先需要指明本文中描述的R,G,B并非通常的sRGB中的三个分量R',G',B',而是波长分别为700nm,546.1nm,435.8nm的单色红光,单色绿光,单色蓝光。sRGB中的R'G'B'中的红色、绿色、蓝色已经不是单色光了。虽然习惯上大家都叫RGB,但是需要有所区别。本文将分别从为什么需要这种转换,怎么进行这种转换进行阐述。

指标定义

        在上一篇之中,我们知道了三色刺激值出现了负值,所以需要进行色彩空间转换。那么在转换过程中有哪些指标定义呢。

        1,X,Y,Z需要全部为正;

        2,Y表达色彩中的亮度信息;

        3,参考白位于X=Y=Z=1/3处;

指标分析

        对于第一点,意味着新的三基色围成的三角形可以囊括CIE RGB的所有颜色,我随意画了一个三角形如下:

        

           对于第二点,色匹配实验中RGB之间的亮度比例为1:4.95:0.061,   因此色彩的亮度表达式为Y=1*r+ 4.95g+0.0601b,当Y=0时,即为直线XZ,代表无亮度线,带入b=1-r-g,可得: 

       

         但是上面的三角形太随意了,于是CIE规定选取540nm~700nm两点的连线代表XY直线,这条线段几乎跟光谱轨迹重合,意味着Z分量为常数,三维视图中看就是这段光谱色平行于Z轴。

        

     CIE选取503nm处的切线作为第三条边,这样就组成了一个三角形。

 

  最后把三条直线方程两两组合求解,可以得到3个点的坐标值如下表:

        

坐标rgb
x1.2750-0.27780.0028
y-1.73922.7671-0.0279
z-0.74310.14091.6022

 

        对于第三点来说,就是等量的XYZ可以混合成参考白点, 我们的目的是写出XYZ各自的刺激值的表达式,推导过程如下:

     令        S_x=\overline{r_x}+\overline{g_x}+\overline{b_x}

                S_y=\overline{r_y}+\overline{g_y}+\overline{b_y};

        ​​​​​​​        ​​​​​​​S_z=\overline{r_z}+\overline{g_z}+\overline{b_z}

      那么

        ​​​​​​​        \overline{r_x}=r_x*S_x;        ​​​​​​​        ​​​​​​​\overline{g_x}=g_x*S_x;        ​​​​​​      ​ \overline{b_x}=b_x*S_x;

                \overline{r_y}=r_y*S_y;                \overline{g_y}=g_y*S_y;        ​​​​​​​        \overline{b_y}=b_y*S_y;                

                \overline{r_z}=r_z*S_z;                \overline{g_z}=g_z*S_z;        ​​​​​​​        \overline{b_z}=b_z*S_z;

因此一个单位的XYZ刺激值分别如下:

        1[X]=r_xS_x[R]+g_xS_x[G]+b_xS_x[B]

        1[Y]=r_yS_y[R]+g_yS_y[G]+b_yS_y[B]

        1[Z]=r_zS_z[R]+g_zS_z[G]+b_zS_z[B]

等量的XYZ混出参考白色,另一方面等量的RGB也可以混出参考白色,那么:

        1[X]+1[Y]+1[Z]=1[R]+1[G]+1[B]

因此

        (r_xS_x+r_yS_y+r_zS_z) [R]=1[R]

        (g_xS_x+g_yS_y+g_zS_z) [G]=1[G]

        (b_xS_x+b_yS_y+b_zS_z) [B]=1[B]

那么       

        r_xS_x+r_yS_y+r_zS_z=1

        g_xS_x+g_yS_y+g_zS_z=1

        b_xS_x+b_yS_y+b_zS_z=1

写成矩阵的形式如下:

        \begin{bmatrix} r_x& r_y &r_z \\ g_x& g_y &g_z \\ b_x& b_y &b_z \end{bmatrix}.\begin{bmatrix} S_x\\S_y \\ S_z \end{bmatrix}=\begin{bmatrix} 1\\ 1 \\ 1 \end{bmatrix}

因此

        \begin{bmatrix} S_x\\ S_y \\ S_z \end{bmatrix}=\begin{bmatrix} r_x& r_y &r_z \\ g_x& g_y &g_z \\ b_x& b_y &b_z \end{bmatrix}^{-1}.\begin{bmatrix} 1\\ 1 \\ 1 \end{bmatrix}

带入数值可得

       \begin{bmatrix} S_x\\ S_y \\ S_z \end{bmatrix}=\begin{bmatrix} 1.8546\\ 0.5155 \\ 0.6299\end{bmatrix}

 代码如下:

        

rx=1.2750;
gx=-0.2778;
bx=0.0028;

ry=-1.7392;
gy=2.7671;
by=-0.0279;

rz=-0.7431;
gz=0.1409;
bz=1.6022;

S=inv([rx ry rz;
       gx gy gz;
       bx by bz])*[1 1 1]';

转换矩阵的生成

因为上面得出了这个表达式

        1[X]=r_xS_x[R]+g_xS_x[G]+b_xS_x[B]

        1[Y]=r_yS_y[R]+g_yS_y[G]+b_yS_y[B]

        1[Z]=r_zS_z[R]+g_zS_z[G]+b_zS_z[B]

对于XYZ色彩空间来说,三色刺激值为\overline{x},\overline{y},\overline{z}        

         \overline{x}[X]=\overline{x}r_xS_x[R]+\overline{x}g_xS_x[G]+\overline{x}b_xS_x[B]

        \overline{y}[Y]=\overline{y}r_yS_y[R]+\overline{y}g_yS_y[G]+\overline{y}b_yS_y[B]

        \overline{z}[Z]=\overline{z}r_zS_z[R]+\overline{z}g_zS_z[G]+\overline{z}b_zS_z[B]

对于RGB色彩空间来说,三色刺激值为\overline{r},\overline{g},\overline{b}

        \overline{r}[R],\overline{g}[G],\overline{b}[B]

根据映射关系可以知道:

        \overline{x}r_xS_x[R]+\overline{y}r_yS_y[R]+\overline{z}r_zS_z[R]=\overline{r}[R]

        \overline{x}g_xS_x[G]+\overline{y}g_yS_y[G]+\overline{z}g_zS_z[G]=\overline{g}[G]

        \overline{x}b_xS_x[B]+\overline{y}b_yS_y[B]+\overline{z}b_zS_z[B]=\overline{b}[B]

写成矩阵表达形式如下:

        \begin{bmatrix} r_xS_x &r_yS_y&r_zS_z \\ g_xS_x &g_yS_y&g_zS_z \\ b_xS_x &b_yS_y&r_bS_z \end{bmatrix}.\begin{bmatrix} \overline{x}\\ \overline{y} \\ \overline{z} \end{bmatrix}=\begin{bmatrix} \overline{r}\\ \overline{g} \\ \overline{b} \end{bmatrix}

带入参数可以得到XYZ转RGB的矩阵如下:

    xyz2rgb =

    2.3646   -0.8966   -0.4681
   -0.5152    1.4265    0.0887
    0.0052   -0.0144    1.0092

对上述矩阵求逆矩阵就可以得到RGB转XYZ的矩阵如下:

     rgb2xyz =

    0.4900    0.3100    0.2000
    0.1770    0.8124    0.0106
    0.0000    0.0100    0.9900

代码如下:

 xyz2rgb=[rx*S(1) ry*S(2) rz*S(3);
          gx*S(1) gy*S(2) gz*S(3);
          bx*S(1) by*S(2) bz*S(3)]
 rgb2xyz=inv(xyz2rgb)

 以上就是CIE 1931标准观察者XYZ和RGB之间的转换关系推导。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值