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

前言

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

为什么需要XYZ色彩空间?

        为什么需要从RGB映射到XYZ色彩空间,一句话表述就是因为方便计算。这样回答似乎太过简单,但是事实确实如此,详细原因需要回顾一下混色的原理。

1,色匹配实验

        C=r(R)+g(G)+b(B)

        上式中的加号表达的是组合之意,而非数学上的相加。式子右侧部分RGB是三种单色刺激色,rgb表示的是相对系数。

        \lambda_R=700

        \lambda_G=546.1

        \lambda_B=435.8

 对于可见光依次测量各个波长的三色刺激值,那么可以得到如下:

         C_1=r_1(R)+g_1(G)+b_1(B)

         C_2=r_2(R)+g_2(G)+b_2(B)

         C_3=r_3(R)+g_3(G)+b_3(B)

         C_4=r_4(R)+g_4(G)+b_4(B)

         C_i=r_i(R)+g_i(G)+b_i(B)

特别的当波长处于三基色波长时有如下:

        

波长(nm)rgb
700100
546.1010
435.8001

将所录的数据使用图形表达出来,可以看到部分波长期间,R分量出现了负值:

 代码如下:        

wave=csvread('./cie data/cie_rgb_5nm.csv',0,0,[0,0,68,0]);
R=csvread('./cie data/cie_rgb_5nm.csv',0,1,[0,1,68,1]);
G=csvread('./cie data/cie_rgb_5nm.csv',0,2,[0,2,68,2]);
B=csvread('./cie data/cie_rgb_5nm.csv',0,3,[0,3,68,3]);
r=R./(R+G+B);
g=G./(R+G+B);
b=B./(R+G+B);
figure
plot(wave,r,'r');hold on
plot(wave,g,'g');hold on
plot(wave,b,'b');hold on
legend('r','g','b','Location','east');

2,混色原理

更一般的表达,应该在式子的左右乘以功率系数:

    C_iP(i)=r_i(R)P_r(i)+g_i(G)P_g(i)+b_i(B)P_b(i)

其中功率有如下关系:

        P(i)=P_r(i)+P_g(i)+P_b(i)

实际做实验的过程中,保持功率不变,所以:

        P(1)=P(2)=P(3)=P(i)

假定现在有一束连续的光,连续的意思代表是光谱连续分布,设连续光的功率分布如下:

        P(\lambda),\lambda\in (380,780)

那么相对于色匹配实验的功率之比为:

        S(\lambda_i)=P(\lambda_i)/P(i)

因此这束光的颜色可以用下面的表达式描述:

        C=\int {S(\lambda)C(i)}d\lambda

       C_r=\int {S(\lambda_r)R(i)}d\lambda

        C_g=\int {S(\lambda_g)G(i)}d\lambda

        C_b=\int {S(\lambda_b)B(i)}d\lambda

 简单起见,如果这束光是离散的2个频点,那么就用求和的形式表达:

        C_r=S(\lambda_{r1})R(i_1)+S(\lambda_{r2})R(i_2)     

        C_g=S(\lambda_{g1})G(i_1)+S(\lambda_{g2})G(i_2)

        C_b=S(\lambda_{b1})B(i_1)+S(\lambda_{b2})B(i_2)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部