LMS,RGB,XYZ色彩空间转换

news/2024/10/26 12:25:03/

前言

        首先需要指明本文中描述的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归一化色品图');

 


http://www.ppmy.cn/news/74911.html

相关文章

[RapidOCRWeb] 桌面版使用教程

引言 说明:桌面版指的是可以直接解压,双击即可运行的版本。通俗来说,对rapidocr_web做了打包,将相关依赖全部放到一个zip包中,不需要本地有额外的环境,降低使用门槛。下面会以Windows版为例,作…

ASEMI代理长电可控硅MAC97A8图片,MAC97A8大小

编辑-Z 长电可控硅MAC97A8参数: 型号:MAC97A8 VDRM/VRRM:600V IT(RMS):1A ITSM:8A 栅极电流(峰值):1A 栅极电压(峰值):5V 栅极功率&#…

数学(四) -- LC[29][166] 两数相除与分数到小数

1 分数到小数 1.1 题目描述 题目链接:https://leetcode.cn/problems/fraction-to-recurring-decimal/description/ 1.2 思路分析 1. 长除法 题目要求根据给定的分子和分母,将分数转成整数或小数。由于给定的分子和分母的取值范围都是 [ − 2 31 , 2 …

​数据库原理及应用上机(实验四 SQL连接查询)

✨作者:命运之光 ✨专栏:数据库原理及应用上机实验 目录 ✨一、实验目的和要求 ✨二、实验内容及步骤 ✨三.实验结果 ✨四、实验总结 🍓🍓前言: 数据库原理及应用上机实验报告的一个简单整理后期还会不…

Qt Quick 按钮设计指南

Qt Quick 按钮设计指南 一、Qt Quick简介(Introduction to Qt Quick)1.1 Qt Quick的历史与发展(History and Development of Qt Quick)Qt Quick的起源(Origin of Qt Quick)Qt Quick的发展(Devel…

魔改车钥匙实现远程控车:(4)基于compose和经典蓝牙编写一个控制APP

前言 这篇文章不出意外的话应该是魔改车钥匙系列的最后一篇了,自此我们的魔改计划除了最后的布线和安装外已经全部完成了。 不过由于布线以及安装不属于编程技术范围,且我也是第一次做,就不献丑继续写一篇文章了。 在前面的文章中&#xf…

ES6中数组新增了哪些扩展?

一、扩展运算符的应用 ES6通过扩展元素符...&#xff0c;好比 rest 参数的逆运算&#xff0c;将一个数组转为用逗号分隔的参数序列 console.log(...[1, 2, 3]) // 1 2 3console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5[...document.querySelectorAll(div)] // [<div>, …

九.虚拟内存VM

概述 作用 将主存看成是一个存储在磁盘上的地址空间的高速缓存&#xff0c;在主存中只保存活动区域&#xff0c;并根据需要在磁盘和主存之间来回传送数据&#xff0c;通过这种方式高效地使用了主存为每个进程提供了一致的地址空间&#xff0c;从而简化了内存管理保护了每个进…