LMS,RGB,XYZ色彩空间转换

前言

        首先需要指明本文中描述的R,G,B并非通常的sRGB中的三个分量R',G',B',而是波长分别为700nm,546.1nm,435.8nm的单色红光,单色绿光,单色蓝光。sRGB中的R'G'B'中的红色、绿色、蓝色已经不是单色光了。虽然习惯上大家都叫RGB,但是需要有所区别。那么RGB的定义是怎么来的呢,这需要从颜色匹配实验说起。

一,色光混合颜色匹配实验

        装置如下图所示。红(R)、绿(G)、蓝(B)三种平行色光照射在黑档屏的一边,并且映在白屏幕上的光斑重合在一起(上方)。被匹配色光(C)照在黑档屏的另一边(下方)。人眼通过黑屏上的小孔可同时看到黑档屏的两边。实验时,调节红、绿、蓝色光的强度,直到黑档屏两边的视场呈现相同颜色,即:视场中的分界线消失,两部分合成同一视场时,就完成了颜色匹配。依次逐个设置单色光的波长,并记录数据。

        三色刺激值的数据见网站:CVRL main (ucl.ac.uk),右上图的显示代码如下:

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]);
figure
plot(wave,R,'r');hold on
plot(wave,G,'g');hold on
plot(wave,B,'b');
legend('R','G','B','Location','east');
xlabel('波长/nm');
ylabel('刺激值');
title('标准色三色刺激值图');

 二,LMS视觉响应曲线

         我们知道人的眼睛感受色彩,依靠的是3种视锥细胞L,M,S。对于可见光区域里面的单色光,能否借鉴单色光匹配实验,来采集LMS的数据呢。这不好实现,一方面没有办法单独刺激这三类细胞,另一方面是无法单独评定刺激的视觉效应。因此这就说明了无法得到准确的数学上的LMS跟随单色光变化的函数表达式。

        这里我提出一种假设实验,或许前人就是这样干的。装置如下图所示:570nm(L),555nm(M),445nm(S)的单色三种平行色光,将可见光C依次从红光逐次调到紫色光,保证亮度始终不变,同时调整L、M、S的发射功率,使他们各自都跟颜色C的亮度一样。

      三色刺激值的数据见网站:CVRL main (ucl.ac.uk),右上图的显示代码如下:

wave=csvread('./cie data/cie_lms_5nm.csv',0,0,[0,0,68,0]);
L=csvread('./cie data/cie_lms_5nm.csv',0,1,[0,1,68,1]);
M=csvread('./cie data/cie_lms_5nm.csv',0,2,[0,2,68,2]);
S=csvread('./cie data/cie_lms_5nm.csv',0,3,[0,3,68,3]);
figure
plot(wave,L,'r');hold on
plot(wave,M,'g');hold on
plot(wave,S,'b');
legend('L','M','S','Location','east');
xlabel('波长/nm');
ylabel('响应');
title('LMS视觉响应图');

三,RGB和LMS色彩空间转换

    首先看LMS转RGB的效果:

wave=csvread('./cie data/cie_lms_5nm.csv',0,0,[0,0,68,0]);
L=csvread('./cie data/cie_lms_5nm.csv',0,1,[0,1,68,1]);
M=csvread('./cie data/cie_lms_5nm.csv',0,2,[0,2,68,2]);
S=csvread('./cie data/cie_lms_5nm.csv',0,3,[0,3,68,3]);
figure
plot(wave,L,'r');hold on
plot(wave,M,'g');hold on
plot(wave,S,'b');
legend('L','M','S','Location','east');
xlabel('波长/nm');
ylabel('响应');
title('LMS视觉响应图');

lms2rgb=[5.0883     -4.0645 0.08250 ;%10度观察
         -0.1239     1.1637  -0.08381 ;
         0.00205     -0.01920   1.00139 ] ;
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
c_rgb =lms2rgb*[L M S]';
color_r=c_rgb(1,:);
color_g=c_rgb(2,:);
color_b=c_rgb(3,:);
figure
plot(wave,color_r,'r');hold on
plot(wave,color_g,'g');hold on
plot(wave,color_b,'b');

 

 然后看RGB转LMS的效果:

        

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]);
figure
plot(wave,R,'r');hold on
plot(wave,G,'g');hold on
plot(wave,B,'b');
legend('R','G','B','Location','east');
xlabel('波长/nm');
ylabel('刺激值');
title('标准色三色刺激值图');

lms2rgb=[5.0883     -4.0645 0.08250 ;%10度观察
         -0.1239     1.1637  -0.08381 ;
         0.00205     -0.01920   1.00139 ] ;
rgb2lms =inv(lms2rgb);%求逆矩阵
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
c_lms =rgb2lms*[R G B]';
color_l=c_lms(1,:);
color_m=c_lms(2,:);
color_s=c_lms(3,:);
figure
plot(wave,color_l,'r');hold on
plot(wave,color_m,'g');hold on
plot(wave,color_s,'b');

四,RGB和XYZ色彩空间转换

        先看RGB转XYZ的代码和效果:        

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]);
figure
plot(wave,R,'r');hold on
plot(wave,G,'g');hold on
plot(wave,B,'b');
legend('R','G','B','Location','east');
xlabel('波长/nm');
ylabel('刺激值');
title('标准色三色刺激值图');

rgb2xyz=[2.7689     1.75175 1.13016 ;%10度观察
         1     4.5907  0.06010 ;
         0     0.05651   5.5943 ] ;
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
c_xyz =rgb2xyz*[R G B]';
color_x=c_xyz(1,:);
color_y=c_xyz(2,:);
color_z=c_xyz(3,:);
figure
plot(wave,color_x,'r');hold on
plot(wave,color_y,'g');hold on
plot(wave,color_z,'b');

         然后来讲因为RGB色彩空间在拟合单色光的时候出现了负值,那么就需要使用一个虚拟的色彩空间进行转换一下,转换前后在二维平面上的色品图如下:

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(r,g,'b');
xlabel('r');
ylabel('g');
title('r-g归一化色品图');

rgb2xyz=[2.7689     1.75175 1.13016 ;%10度观察
         1     4.5907  0.06010 ;
         0     0.05651   5.5943 ] ;
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
c_xyz =rgb2xyz*[R G B]';
color_x=c_xyz(1,:);
color_y=c_xyz(2,:);
color_z=c_xyz(3,:);
x=color_x./(color_x+color_y+color_z);
y=color_y./(color_x+color_y+color_z);
z=color_z./(color_x+color_y+color_z);
figure
plot(x,y,'b');
xlabel('x');
ylabel('y');
title('x-y归一化色品图');

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值