LMS,RGB,XYZ色彩空间转换

news2024/9/21 5:43:28

前言

        首先需要指明本文中描述的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.coloradmin.cn/o/547950.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文法的FIRST集

求文法的FIRST集和FOLLOW集的步骤如下: 求FIRST集 如果符号是终结符,则FIRST集合为该终结符本身。如果符号是非终结符,则将该非终结符可以推导出的所有串的FIRST集合合并,得到该非终结符的FIRST集合。如果一个非终结符可以推导出…

Linux篇5

Shell常用命令 1. 磁盘管理类1.1 du:查看文件和目录占用的磁盘空间1.2 df:查看磁盘空间使用情况1.3 free:查看内存使用情况1.4 lsblk:查看设备挂载情况1.5 mount/umount:挂载/卸载1.6 fdisk:分区 2. 进程管…

双模齐下,提质增效:CODING 携手知微共创 BizDevOps 体系新篇章

为了提升工作和管理效率,工具建设是许多企业不得不面对的现实,然而在工具建设落地过程中,往往存在一系列的问题。如不同组织、部门之间互不相通,各自为政,工具流程与实际工作所需不符,导致工具建设的结果是…

(1分钟速览)g2o入门指南--笔记版

在slam后端中,优化的框架很多,有ceres,g2o,gtsam这些。要想真正掌握slam后端的优化内容,这些框架是必不可少的上手练习的内容。本文则介绍有关g2o的相关内容,作为一个入门指南,目标:…

使用教程 | 基于TSMaster如何实现LIN RBS 剩余总线仿真

本文导读 RBS 全称是:residual bus simulation,也就是所谓的剩余总线仿真。主要是基于车载网络数据库,如 CAN/LIN/FlexRay/以太网数据库,仿真该网络内部各个节点的通讯行为。 本文主要讲解 TSMaster 中 LIN RBS 的操作流程。 “ …

aosp11/12/13 壁纸高斯模糊,毛玻璃SurfaceFlinger层面原理-第二节千里马framework实战

hi,粉丝朋友们! 上一个blog已经详细讲解了系统中自带相关接口实现窗口的高斯模糊相关效果,具体点击这里 https://blog.csdn.net/learnframework/article/details/130767893 1、补充app层面实现方式 更多framework干货知识手把手教学 Log.i…

Restful API

Restful API 一、RESTful API是什么意思二、对比三、小知识四、用 apifox 进行测试1. GET2. POST3. PUT4. DELETE 一、RESTful API是什么意思 REST 与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻…

操作系统实验三 内存分配及回收研究

前言 本次实验跟前两次相比简单许多,主要是体会底层的一些运行机制。其实,要说简单,也不是真的很简单,毕竟还是存在一些更底层的东西需要我们去探讨。接下来就让我们通过实验来感受一下。 1.实验目的 掌握Linux操作系统的内存分…

地表水灌区取水计量设施包含哪些设备?

方案背景 根据《关于强化取水口取水监测计量的意见》、《十四五”节水型社会建设规划》以及《2022年水资源管理工作要点》等政策要求,为强化水资源管理,做好水资源税改革,构建节水型社会,要全面加强取水计量监测设施建设&#xff…

【计算机系统基础3】数据的存储与运算

3.程序调试与实践:数据存储与运算 3.1真值与机器数 真值: 数据在现实世界中的表示 机器数: 数据在计算机内部的二进制编码表示 温度:零下3.5度 习惯写法:-3.5 (数据的真值/数据的实际值) 3.1.1整数的编码 带符号整数&…

15:13进去面试,5分钟就完事了,问的实在是太......

干了两年外包,本来想出来正儿八经找个互联网公司上班,没想到算法死在另一家厂子。 自从加入这家外包公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到11月一纸通知,所有人不许加班,薪资…

2023年值得关注的低代码平台推荐

低代码平台在数字化转型的浪潮中受到越来越多企业的青睐,因为它们提供了一种更容易、更快的方式来开发网络和移动应用程序。低代码平台只需要最少的编码知识,使公司能够在很短的时间内开发出定制的应用程序,而这只是使用传统的搭建手段所需时…

参数传递之传名,传地址,得结果,传值

编译原理速成,参数传递之传名,传地址,得结果,传值(四)_哔哩哔哩_bilibili 学习自上面的文章。 题目1: (1)传名。 (2)传地址。(注意观察,AB变成了临时变量T1,…

jvm之G1 GC

写在前面 jdk9以及之后的版本已经将默认的垃圾收集器parallel更换为G1.本文就一起来看下。 1:G1介绍 parallel GC的设计目标是高吞吐量,CMS GC的设计目标是低延迟,而G1的设计目标不是这二者中的任何一个,其设计目标是让GC的STW…

我的世界Fabric mod开发-快速漏斗

前往我的主页以阅读完整内容,并获取源码 DearXuan的主页 MOD介绍 使用漏斗链进行分类或传递物品时,常常会发现漏斗速度太慢,难以收集全部掉落物.或者漏斗太多,影响性能.而现有的漏斗加速mod则是引入新的快速漏斗,存在各种兼容问题.开服时发现paper服务器可以修改原…

华为OD机试真题 Java 实现【区间连接器】【2023Q1 200分】

一、题目描述 有一组区间 [a0, b0], [a1, b1], … (a, b 表示起点, 终点),区间有可能重叠、相邻,重叠或相邻则可以合并为更大的区间; 给定一组连接器[x1, x2, x3, …](x 表示连接器的最大可连接长度,即 x>gap&…

支付宝沙箱支付(java电脑版)

目录 下载支付demo配置环境AlipayConfig 下载支付demo 网址&#xff1a;https://open.alipay.com/ 下载并打开项目发现无法运行&#xff1a; 手动转化项目&#xff1a; 等待下载整理一下maven pom 通过tomat部署运行测试。 导入阿里支付的pom依赖 <dependency> &l…

都2023了,你竟然还不知道网络安全该怎么学

前言 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然或恶意原因而遭受破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。网络安全因何而重要&#xff1f; 截至2023年4月,我国网民规模为_11.51亿_&#xff0c…

模板初阶(泛型编程)

模板初阶 &#x1f506;泛型编程&#x1f506;函数模板函数模板概念函数模板格式函数模板的原理函数模板的实例化模板参数的匹配原则 &#x1f506;类模板类模板的定义格式类模板的实例化类模板与模板类的区别 &#x1f506;结语 &#x1f506;泛型编程 泛型编程&#xff1a;编…

【总结】Numpy2

Numpy 1. 数组和数的运算 array1 np.arange(1,10) array1 # array([1, 2, 3, 4, 5, 6, 7, 8, 9]) array1 10 # array([11, 12, 13, 14, 15, 16, 17, 18, 19]) array1 - 10 # array([-9, -8, -7, -6, -5, -4, -3, -2, -1]) array1 * 10 # array([10, 20, 30, 40, 50, 60, 70…