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归一化色品图');

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/22349.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全里的主要岗位有哪些?小白如何快速入门?

入门Web安全、安卓安全、二进制安全、工控安全还是智能硬件安全等等,每个不同的领域要掌握的技能也不同。 当然入门Web安全相对难度较低,也是很多人的首选。主要还是看自己的兴趣方向吧。 本文就以下几个问题来说明网络安全大致学习过程👇 网…

SpringCloud微服务调用方式(RestTemplate)

服务调用方式 RPC和HTTP 无论是微服务还是SOA,都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢? 常见的远程调用方式有以下2种: RPC:Remote Produce Call远程过程调用,类似的还有 。自定义数据格式&am…

learn C++ NO.4 ——类和对象(2)

1.类的6个默认成员函数 1.1.默认成员函数的概念 在 C 中,如果没有显式定义类的构造函数、析构函数、拷贝构造函数和赋值运算符重载函数,编译器会自动生成这些函数,这些函数被称为默认成员函数。 class Date { };初步了解了默认成员函数&am…

STL-常用算法(二.拷贝 替换 算术 集合)

开篇先附上STL-常用算法(一)的链接 STL-常用算法(一.遍历 查找 排序)_小梁今天敲代码了吗的博客-CSDN博客 目录 常用拷贝和替换算法: copy函数示例:(将v1容器中的元素复制给v2) replace函数示例&#…

Java 9 - 18 各个版本新特性总结

【 Java 9 - 18 各个版本新特性总结,B站视频介绍】https://www.bilibili.com/video/BV1PT411P7Wn?vd_source5a3a58ca0e99223ffb58cddf2f3a7282 一、模块化引入 模块是 Java 9 中新增的一个组件,可以简单理解为是package的上级容器,是多个pa…

gitlab建立新分支提交,cherry-pick部分更新

gitlab介绍 GitLab是一个基于Git的在线代码托管和协作平台,提供源代码管理、单元测试、CI/CD构建、代码审查等功能。它是一个开放源代码的Git仓库管理系统,使用 Ruby on Rails 构建GitLab 不仅具有自己的 Git 仓库管理系统,还具有很多其他的…

网络协议与攻击模拟-11-DHCP协议原理

DHCP 协议 1、掌握 DHCP 的工作原理 2、会在 Windows server 上去部署 DHCP 服务 3、抓流量 .正常 收到攻击后 一、 DHCP 1、 DHCP 基本概念 dhcp (动态主机配置协议):主要就是给客户机提供 TCP / IP 参数( IP 地…

App外包开发上线Google Play流程

完成App开发后需要在各大应用市场上线,国内的应用市场比较多,各自的规则也不相同,上线审核也比较复杂;国外上线主要是Google Play市场,它更重视隐私的保护,必须严格按照规范来保护个人隐私,因此…

【C++】模板的一点简单介绍

模板 前言泛型编程函数模板概念格式函数模板的原理函数模板的实例化 类模板类模板的定义格式类模板的实例化 前言 这篇博客讲的是模板的一些基本知识,并没有那么深入,但是如果你是为了过期末考试而搜的这篇博客,我觉得下面讲的是够了的。 之…

阿里云、腾讯云、移动云飙“价”:智能普惠成新风向?

经过过去一年的“低迷”境况之后,2023年云服务商因为AI大模型的爆发,重新燃起了斗志。站在当下的时间节点,云服务商们也在重新思考如何在新形势下,让自己占据更大的优势,于是一场围绕“技术竞争与市场争夺”的新战争打…

【总结】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…

3-《安卓基础》

3-《安卓基础》 一.Android系统架构二.四大组件1. Activity1.1 生命周期1.2. Activity四种启动模式1.3.Activity任务栈的概念1.4 面试题面试题1:onSaveInstanceState(Bundle outState),onRestoreInstanceState(Bundle savedInstanceState) 的调用时机&am…

小黑子—Java从入门到入土过程:第十一章 - 网络编程、反射及动态代理

Java零基础入门11.0 网络编程1. 初识网络编程2. 网络编程三要素3.IP三要素3.1 IPV4的细节3.1.1特殊的IP地址3.1.2 常用的CMD命令 3.2 InetAddress 的使用3.3 端口号3.4 协议3.4.1 UDP协议3.4.1 - I UDP 发送数据3.4.1 - II UDP 接收数据3.4.1 - III UDP 练习(聊天室…

前端列表页+element-puls实现列表数据弹窗功能

效果图: 这是一个修改的弹窗,我们要实现的功能是,在列表,点击修改按钮时,将数据带入到弹窗里面,点击保存时关闭弹窗。 1,点击修改展开弹窗 使用 eldialog组件,v-model绑定的值为tru…

Godot引擎 4.0 文档 - 入门介绍 - 学习新功能

本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面: Learning new features — Godot Engine (stable) documentation in English 学习新功能 Godot 是一个功能丰富的游戏引擎。有很多关于它的知识。本页介绍了如何使用…

迪赛智慧数——柱状图(基本柱状图):全球自动化无人机智能支出预测

效果图 全球自动化无人机智能支出及预测分析,2022年机器人流程自动化支出10.4十亿美元,智能流程自动化支出13十亿美元,人工智能业务操作达10.8十亿美元,未来,这些数字将进一步增长,自动化无人机智能也将拥有…

华为OD机试真题 Java 实现【天然蓄水池】【2023Q1 200分】

一、题目描述 公元2919年,人类终于发现了一颗宜居星球——X星。现想在X星一片连绵起伏的山脉间建一个天然蓄水库,如何选取水库边界,使蓄水量最大? 要求: 山脉用正整数数组s表示,每个元素代表山脉的高度。…

Java基础-面向对象总结(3)

本篇文章主要讲解Java面向对象的知识点 面向对象的三大特性类的扩展(抽象类,接口,内部类,枚举) 目录 面向对象和面向过程的区别? 面向对象的五大基本原则 面向对象三大特性 继承 怎么理解继承 ? 继承和聚合的区别? 封装 多态 什么是多态 什么是运行时多…

数字识别问题

文章目录 6.1 MNIST数据处理6.2.1 训练数据6.2.2 变量管理6.3.1 保存模型6.3.1 加载计算图6.3.1 加载模型6.3.2 导出元图 6.1 MNIST数据处理 在直接在第6章的目录下面创建文件 compat.v1.是tensorflow2.x的语法,全部删掉 删除compat.v1.后的代码 # -*- coding: …

基于最新SolVES 模型与多技术融合【QGIS、PostgreSQL、ARCGIS、MAXENT、R】实现生态系统服务功能社会价值评估及拓展案例分析

目录 第一章 理论基础与研究热点 第二章 SolVES 4.0 模型运行环境配置 第三章 SolVES 4.0 模型运行 第四章 数据获取与入库 第五章 环境变量与社会价值的相关分析 第六章 拓展案例分析 SolVES模型(Social Values for Ecosystem Services)全称为生态…
最新文章