详解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之间的转换关系推导。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RGB色彩空间中,将xyY值转换RGB值需要进行以下步骤: 1. 将xyY值转换XYZ值。首先,根据xy值和Y值,可以计算出X和Z的值。具体计算方法如下: X = (Y / y) * x Z = (Y / y) * (1 - x - y) 2. 将XYZ转换RGB值。这一步需要使用特定的RGB色彩空间转换矩阵。不同的RGB色彩空间有不同的转换矩阵。以sRGB为例,转换矩阵如下: R = 3.2406 * X - 1.5372 * Y - 0.4986 * Z G = -0.9689 * X + 1.8758 * Y + 0.0415 * Z B = 0.0557 * X - 0.2040 * Y + 1.0570 * Z 3. 对于sRGB色彩空间,还需要进行gamma校正。gamma校正是为了使得亮度在显示设备上更加均匀。具体计算方法如下: 如果 R、G、B 的值小于等于0.0031308,则 R、G、B 的值乘以 12.92 如果 R、G、B 的值大于 0.0031308,则 R、G、B 的值进行如下计算: R = 1.055 * R^(1/2.4) - 0.055 G = 1.055 * G^(1/2.4) - 0.055 B = 1.055 * B^(1/2.4) - 0.055 请注意,以上是将xyY值转换为sRGB色彩空间中的RGB值的方法。对于其他RGB色彩空间转换矩阵和gamma校正的参数可能会有所不同。 #### 引用[.reference_title] - *1* *2* [详解RGBXYZ色彩空间转换之下](https://blog.csdn.net/YDY5659150/article/details/130900416)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【音视频基础】(七):CIE颜色空间三之从CIE-XYZ到CIE-xyY](https://blog.csdn.net/houxiaoni01/article/details/100049961)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值