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

news2024/10/6 8:25:26

前言

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

怎么进行XYZ色彩空间转换

        在上一篇之中,我们知道了三色刺激值出现了负值,所以需要进行色彩空间转换。那么在转换过程中有哪些指标定义呢。首先就是X,Y,Z需要全部为正,其次Y表达色彩中的亮度信息,三是参考白位于X=Y=Z=1/3处。

1,公式推导

      根据Y表达亮度信息可以知道:

                Y_r=y_r/y_r=1

                Y_g=y_g/y_g=1

                Y_b=y_b/y_b=1

       根据X+Y+Z=1可以知道:

                Z_r=(1-x_r-y_r)/y_r

                Z_g=(1-x_g-y_g)/y_g

                Z_b=(1-x_b-y_b)/y_b

        最后可以知道:

                X_r=x_r/y_r

                X_g=x_g/y_g

                X_b=x_b/y_b

根据混色原理可以知道参考白色的坐标为:

        \begin{bmatrix} X_w \\ Y_w \\ Z_w \end{bmatrix}=\begin{bmatrix} X_r& X_g &X_b \\ Y_r& Y_g &Y_b \\ Z_r& Z_g &Z_b \end{bmatrix}\cdot \begin{bmatrix} S_r\\ S_g\\ S_b \end{bmatrix}=\begin{bmatrix} 1/3\\ 1/3 \\1/3 \end{bmatrix}

写成方程式的形式,如下:

        X_w=X_rS_r+X_gS_g+X_bS_b

         Y_w=Y_rS_r+Y_gS_g+Y_bS_b

        Z_w=Z_rS_r+Z_gS_g+Z_bS_b

既然参考白点是这样混色,那么所有颜色都应该同样混色,因此:

        \begin{bmatrix} M \end{bmatrix}=\begin{bmatrix} X_rS_r&X_gS_g &X_bS_b \\ Y_rS_r&Y_gS_g &Y_bS_b \\ Z_rS_r&Z_gS_g &Z_bS_b \end{bmatrix}

其中:

        \begin{bmatrix} S_r\\ S_g \\S_b \end{bmatrix}=\begin{bmatrix} X_r &X_g &X_b \\ Y_r &Y_g &Y_b \\ Z_r &Z_g &Z_b \end{bmatrix}^{-1}.\begin{bmatrix} X_w\\ Y_w \\ Z_w \end{bmatrix}

最后写出转换公式如下:

        \begin{bmatrix} x\\y \\ z \end{bmatrix}=\begin{bmatrix} M \end{bmatrix}.\begin{bmatrix} r\\g \\b \end{bmatrix}

2,参数带入

   查表知道三色刺激值在三个波长处的值如下表:

435.000000 0.032220 -0.016097 0.894590 
545.000000 0.592590 1.049800 

-0.014039 

700.000000 0.028114 -0.000262 0.000017 

  计算公式代码如下:

Sr=0.032220;
Sg=-0.016097;
Sb=0.894590;%435.000000 	
Mr=0.592590;
Mg=1.049800;
Mb=-0.014039;% 545.000000 
Lr=0.028114;
Lg=-0.000262;
lb=0.000017;% 700.000000 

Lx=Lr/Lg;
Mx=Mr/Mg;
Sx=Sr/Sg;

Ly=Lg/Lg;
My=Mg/Mg;
Sy=Sg/Sg;

Lz=(1-Lr-Lg)/Lg;
Mz=(1-Mr-Mg)/Mg;
Sz=(1-Sr-Sg)/Sg;
T=inv([Lx Mx Sx;
       Ly My,Sy;
       Lz,Mz,Sz])*[1/3 1/3 1/3]'

 M=[T(1)*Lx T(1)*Mx T(1)*Sx;
    T(2)*Ly T(2)*My T(2)*Sy;
    T(3)*Lz T(3)*Mz T(3)*Sz]

 Lx = -107.3053
Mx =    0.5645
Sx =   -2.0016
Ly =    1
My =   1
Sy =    1
Lz =  -3.7105e+03
Mz =   -0.6119
Sz =  -61.1218

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

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

相关文章

Docker数据目录迁移方法

文章目录 前言一、停掉Docker服务?二、迁移docker数据到数据盘目三、备份原数据目录四、添加软链接五、重启docker服务六、确认服务没有问题后,删除备份的目录总结 前言 服务器上安装的docker服务,数据默认存储在/var/lib/docker目录&#x…

html5网页播放器视频切换、倍速切换、视频预览的代码实例

本文将对视频播放相关的功能进行说明,包括初始化播放器、播放器尺寸设置、视频切换、倍速切换、视频预览、自定义视频播放的开始/结束时间、禁止拖拽进度、播放器皮肤、控件按钮以及播放控制等。 图 / html5视频播放器调用效果(倍速切换) 初始…

网络知识点之-动态路由

动态路由是指路由器能够自动地建立自己的路由表,并且能够根据实际情况的变化适时地进行调整。 中文名:动态路由外文名:dynamic routing 简述 动态路由是与静态路由相对的一个概念,指路由器能够根据路由器之间的交换的特定路由信息…

usb摄像头驱动-core层USB集线器(Hub)驱动

usb摄像头驱动-core层USB集线器(Hub)驱动 文章目录 usb摄像头驱动-core层USB集线器(Hub)驱动usb_hub_inithub_probehub_eventport_eventhub_port_connect_changehub_port_connectusb_new_deviceannounce_device 在USB摄像头驱动中…

20.04Ubuntu换源:提升软件下载速度和更新效率

在使用Ubuntu操作系统时,一个常见的优化措施是更改软件源,以提高软件下载速度和更新效率。软件源是指存储软件包的服务器,通过更换软件源,你可以选择更靠近你所在地区的服务器,从而加快软件下载速度,并减少…

Android Compose Bloom 项目实战 (五) : 使用Navigation实现页面跳转

1. 前言 上几篇文章 我们分别实现了 Compose Bloom项目的各个页面,包括欢迎页、登录页和主页,但是各个页面都是单独独立的,并没有关联页面跳转,而本篇文章的任务就是实现各个页面见的跳转。 2. Navigation 要实现页面跳转&#…

Jetpack Compose动画实现原理详解

一、简介 Jetpack Compose是Google推出的用于构建原生界面的新Android 工具包,它可简化并加快 Android上的界面开发。Jetpack Compose是一个声明式的UI框架,随着该框架的推出,标志着Android 开始全面拥抱声明式UI开发。Jetpack Compose存在很…

【数据结构】红黑树封装map和set

文章目录 1.前置知识2.结构的改写与封装2.1 map和set的结构框架2.2 RBTreeNode结构的改写2.3 RBTree结构改写(仿函数的引入) 3. 迭代器3.1 RBTree的迭代器3.2 map和set的迭代器封装 4. 插入的改写和operatorp[]的重载4.1 insert的改写4.2 map::operator[…

【2023 · CANN训练营第一季】进阶班 应用开发深入讲解→DVPP

1 数据预处理概述 1.1 典型使用场景 受网络结构和训练方式等因素的影响,绝大多数神经网络模型对输入数据都有格式上的限制。在计算视觉领域,这个限制大多体现在图像的尺寸、色域、归一化参数等。如果源图或视频的尺寸、格式等与网络模型的要求不—致时…

pytest-编写插件

pytest 0 、文档1、钩子函数分类1.4 测试运行钩子 2、本地编写插件:conftest.py3、外部插件:setuptools4、实战 0 、文档 官方文档 中文文档 1、钩子函数分类 pytest中的钩子函数按功能一共分为6类:引导钩子,初始化钩子、用例收…

rtl仿真器-incisive安装和测试

需要的文件 安装文件 incisive : http://pan.baidu.com/s/1dFC9KZn 提取码 k3cb path: license: IScape: 安装的图形界面 IScape下载链接: https://pan.baidu.com/s/1FvpOto5fAIRjQARcbMbjZQ 密码: k1cb 目录结构 需要四个目录 安装目录:INCISIVE151 path 存放解密工具 l…

强化学习路线规划之深度强化学习

学到如今,我实在明白了一个至关重要的东西,那就是目标很重要,有了清晰的目标我们就知道该做什么,不至于迷茫,否则每天都在寻找道路。所以我一直在规划这样一条道路,让想学习的人可以抛下不知道该怎么做的顾…

在Notion AI 中轻松打造您的AI私人助理,提供卓越的工作体验(二)

大家好,我是瓜叔。 notion AI在工作和生活场景中的应用 我们先来看"总结"功能。 这边有一篇文章叫做学习编码的好处。导入到nation https://www.likecs.com/show-203992587.html 导入方法详见上一篇文章:在Notion AI 中轻松打造您的AI私人助理…

VMware快照:简化虚拟化环境管理与数据保护

引言: 在虚拟化环境中,数据保护和灵活性是至关重要的。VMware快照作为一项强大的功能,为虚拟机管理者提供了便利和安全性。本文将介绍VMware快照的使用,以及它为用户带来的几个关键优势。 VMware快照是一项重要的功能&#xff0c…

Threejs进阶之十五:在Thereejs 使用自定义shader

目录 最终效果什么是 ShaderShaderMaterial类常用属性uniforms属性vertexShader属性fragmentShader属性 代码实现新建ShaderView.vue文件并引入Threejs定义初始化函数创建initMesh函数实例化ShaderMaterial类实例化TextureLoader()定义uniforms 全局变量定义vertexShader顶点着…

ad18学习笔记二:绘图工具栏、活动栏

在画原理图库的时候会经常用到顶上的绘图工具栏(官方文档里叫做活动栏): 版本不同,上面的命令是不同的 ad如何自定义绘图工具栏? 网上介绍工具栏和设置的文章还挺多的,但是没有看到ad18是怎么增减绘图工具…

LeetCode高频算法刷题记录7

文章目录 1. 下一个排列【中等】1.1 题目描述1.2 解题思路1.3 代码实现 2. 两数相加【中等】2.1 题目描述2.2 解题思路2.3 代码实现 3. 括号生成【中等】3.1 题目描述3.2 解题思路3.3 代码实现 4. 滑动窗口最大值【困难】4.1 题目描述4.2 解题思路4.3 代码实现 5. 最小覆盖子串…

c++boost库学习-07-Message Queue

一、前言 boost中的消息队列(Message Queue)是进程间通信的一种机制,实际上是其内部也是采用共享内存的方式来达到进程间通信的目的。这也就意味这Message Queue有其局限性:只有处在同一台计算机中的不同进程才能使用消息队列进行…

在原有机械硬盘的基础上集装固态硬盘并装操作系统

1、加装固态硬盘 我的电脑出场自带的是机械硬盘(即右边那个白色长方形,上面有类似于锡纸一样的东西),左边的这个光滑的正方形里面是内存条,可以拆开这个光滑的盖进行安装,而我们的固态硬盘装在左下角这个长…

性能测试——性能统计工具

性能统计工具 一、io监控命令1、io监控命令iostat2、io指标监控命令df 二、cpu监控命令1、cpu指标监控命令uptime2、cpu指标监控命令 cat /proc/cpuinfo3、cpu 指标监控命令 mpstat4、cpu指标监控命令 sar 三、mem指标监控命令1、mem指标监控命令 cat /proc/meminfo2、mem指标监…