色彩(颜色)空间原理(中)

颜色的线性变换

现在我们知道如何定义RGB颜色空间,以及如何使用伽玛曲线在线性和伽玛校正值之间进行转换。剩下的最后一步是将线性RGB颜色转换为XYZ颜色。一旦进入XYZ空间,我们就可以转换回我们选择的任何RGB空间,但这实际上只是开始。因为XYZ空间是定义其他颜色的标准颜色空间,所以我们可以选择转换为许多非RGB颜色空间,例如在感知上更统一的Lab颜色空间或生物驱动的LMS颜色空间。

线性RGB空间和XYZ空间之间转换的基本部分是认识到它们都是矢量空间。这基本上意味着数字以线性方式缩放。相反,经伽玛校正的sRGB空间以非线性方式缩放亮度,因此不是亮度的矢量空间。如果您有某种数学迷信并且想更深入地研究该主题,请查阅 格拉斯曼定律,该定律将色彩感知视为线性组合。

知道我们在向量空间内工作时,便可以使用各种线性代数工具。我们将使用的线性代数中的一种这样的工具是根据另一种颜色空间定义一种颜色空间的基础。这类似于在3d空间中定义对象的变换。

正如我们前面所讨论的,RGB颜色空间是通过将三种原色相加而建立的。第一个原色靠近光谱的红色部分。第二个接近绿色。第三个接近蓝色。为了获得黄色,我们将红色和绿色原色相加。此操作可以视为3维矢量加法。让向量一世一世, ĴĴ 和 ķķ 分别等于我们的原色红色,绿色和蓝色,这样

看来我们已经使局势复杂化了,但它会有所收获。首先,让我们来看一些以这种方式定义颜色的示例。

在上面的例子中,RGB原色i、j和k是根据它们自己的RGB颜色空间定义的,这使得这些值相当简单。当我们开始处理不同的颜色空间(如XYZ)时,事情变得更加有趣。
目标是找到与线性RGB空间的原色相匹配的三种XYZ颜色。一旦在XYZ空间中有了i、j和k,就可以使用相同的r、g和b标量来找到RGB颜色的XYZ值。我会马上讨论如何推导这些新的初值,但首先我们假设我们已经知道它们的值,这样我们就可以用一个例子来说明这个过程。设l是XYZ空间中的红色主元素,m是XYZ空间中的绿色主元素,n是XYZ空间中的蓝色边缘元素。

我们现在可以计算XYZ空间中的任何线性RGB颜色,将其作为XYZ空间中主色的线性组合。

推导变换矩阵

如先前所示,从线性RGB空间到XYZ空间的转换矩阵具有从XYZ空间中的主要RGB颜色构建的列。为了找到这些值,我们需要将RGB空间的xy色度坐标用于红色,绿色,蓝色和白色。注意,我们只有x和y坐标。如前所述,我们可以根据x和y计算z坐标,但是我们需要X,Y或Z才能转换回XYZ坐标。就目前而言,我们没有足够的信息从xy色度空间到XYZ空间,但是按照我们转换的意图,我们可以再做一个假设。

让我们澄清一下此转换的目的。前面我提到过眼睛如何适应照明环境,以选择应被视为白色的颜色。为了我们的目的,我们希望将感知到的白色视为最大亮度。这意味着,如果我们从RGB空间A转换为XYZ空间然后再转换为RGB空间B,我们希望RGB空间A中的白色保持RGB空间B中的亮度。我们要做的就是确保当RGB空间转换为XYZ空间时,白色值始终以一致的Y(即一致的相对亮度)结束。

我提到过,只要我们保持一致,就可以为白点选择任何Y发光度,但是标准做法是使用Y值为1以获得全亮度。有时,您可能会看到100的Y表示全亮度,但是在这种情况下,标准值为1。有了白色的目标Y值,我们现在有足够的约束来求解矩阵。让我们列出我们开始的变量。

目标是求解列主变换矩阵M,它将从线性RGB空间转换到XYZ空间。第一步是使用前面讨论的方程z=1−x−y将所有xy色度坐标转换为xyz色度坐标。


我们知道所有的xyz初值,因此知道上面等式中的左矩阵。我们的未知数现在降到构成右矩阵的三个标量值。请注意,虽然每个标量都被写成X、Y和Z分量的和,但我们真正关心的只是求和结果,而不是各个部分。这就是为什么我说只有三个未知数,而不是九个。为了解决这三个未知数,我们将使用已知的白点RGB和XYZ值。因为M从RGB变换到XYZ空间,所以我们可以声明如下等式:

现在我们将把方程的每边乘以剩下的3x3矩阵的逆。这将把我们所有的已知值放在方程的左边,我们的未知值放在右边。如果您不熟悉3x3矩阵的逆运算,我将在本文的末尾提供代码,但出于理智起见,这里不会编写完整的推导。Google应该提供大量关于这个过程的结果,包括Wikipedia和Mathwords的这一个。

我们现在可以重建我们的RGB到XYZ转换矩阵M。将wXYZ向量乘以上述3x3矩阵的倒数将得到将主XYZ坐标转换为XYZ坐标的标量值。这是我们从M中分解出来的标量矩阵的三个未知数。

为了得到相反方向的矩阵变换(从XYZ空间到线性RGB空间),我们可以使用M的逆矩阵。我们也可以用与上面类似的方式来推导矩阵,但是在这么多类型化之后,仅仅使用逆似乎是一种更简单的方法。

色彩(颜色)空间原理(中)相关推荐

  1. 色彩(颜色)空间原理(下)

    色彩(颜色)空间原理(下) sRGB空间的线性变换示例 为了帮助理解矩阵推导,让我们遍历sRGB颜色空间的数字.首先,回想一下我们在色度图上绘制的红色,绿色,蓝色和白色的xy色度坐标. 接下来将xy坐 ...

  2. 色彩(颜色)空间原理(上)

    色彩(颜色)空间原理(上) RGB色彩空间转换 我最近在进行色彩科学方面的工作,当您要正确使用数字色彩值时,从一种色彩空间转移到另一种色彩空间成为一种常见操作.通常,我们只是将数字颜色视为RGB值,但 ...

  3. 色彩(颜色)空间原理(实现代码)

    色彩(颜色)空间原理(实现代码) 编写代码 对于代码示例,我将展示生成线性变换矩阵的算法和在sRGB空间和XYZ空间之间进行完全转换的示例.为了实现其他RGB空间,您只需要实现适当的gamma校正曲线 ...

  4. 图形创意与色彩审美在平面设计中的重要性

    本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 图形创意与色彩审美在平面设计中的重要性?平面设计是研究图形信息传递与色彩审美交流的视觉艺术.图形本身是视觉空间中的一 ...

  5. ux的重要性_颜色在UX中的重要性

    ux的重要性 When coming up with a new digital solution (desktop, mobile, app, whatever it may be) or any ...

  6. ACES学院色彩编码在影片中的应用

    https://tieba.baidu.com/p/4472658801?red_tag=1940538372 我们经常在摄像机参数(ARRI,Sony系列)或者许多后期制作系统(比如Davinci ...

  7. c语言vc怎么改变背景板颜色,vc6.0中更改对话框背景色和字体颜色

    方法一:设置所有窗口的颜色     MFC程序修改对话框的背景和文字颜色最简单的方法就是调用SetDialogBkColor函数,SetDialogBkColor是CWinApp类的成员函数,以下是该 ...

  8. icc 颜色 c语言,浅析颜色在icc中四种不同的转换方式

    在我们使用频率最高的图像处理软件Photoshop中,我们可以在颜色设置项中的转换选项中发现"意图"一项中有可感知.饱和度.相对比色和绝对比色四个选项,这是不同颜色在icc之间转换 ...

  9. ICDE-2020 论文简析:空间众包中的预测任务分配 : 一种数据驱动的方法 Predictive Task Assignment in Spatial Crowdsourcing

    ICDE-2020 论文简析:空间众包中的预测任务分配:一种数据驱动的方法 Predictive Task Assignment in Spatial Crowdsourcing: A Data-dr ...

最新文章

  1. php cdi_CDI中的事务异常处理
  2. 高校实验室管理系统_史上最全面的实验室信息管理系统(LIMS)全解
  3. 机器学习08机器学习系统设计
  4. 【Hololens】微软Hololens虚拟现实视频集
  5. PHP的几个常用加密函数
  6. 阿里云安全掌门人肖力:企业上云,如何保证安全?| 问底中国 IT 技术演进
  7. Sublime Text 3 - 设置自动换行
  8. 用stack实现括号匹配
  9. 趋肤效应实验报告_GB/T 4857.2
  10. 【C语言】基于51/52单片机实现楼梯灯控制程序
  11. 2022年最新区块链电商赋能企业的解决方案
  12. 广州北大青鸟软件工程师班课程简介
  13. NLP中文句子类型判别和分类实现
  14. 中台能力是什么?PaaS是什么?微服务是什么?
  15. 心愿作文计算机,电脑的心愿作文
  16. 四、Python数据挖掘(Pandas库)
  17. 【密码学一】密码学概念、密码学初体验
  18. mshtml与System.Windows.Forms.HtmlElement
  19. 使用Vue CLI 3提升您的Vue.js工作流程
  20. Kubectl-AI: 一款使用 OpenAI GPT 自动生成应用 Kubernetes 部署清单的神器

热门文章

  1. 2022-2028年中国房地产金融行业投资分析及前景预测报告
  2. Python 多进程笔记 — 启动进程的方式、守护进程、进程间通信、进程池、进程池之间通信、多进程生产消费模型
  3. python二进制打开(rb)和文本格式打开(r)什么区别?
  4. 在linux(centos7)下本地仓库的搭建
  5. 【spring】spring基于xml的声明式事务控制
  6. 【运维学习笔记】生命不息,搞事开始。。。
  7. tf.get_variable
  8. List再整理,从代码底层全面解析List(看完后保证收获满满)
  9. LeetCode中等题之删除链表的中间节点
  10. MyBatis常规CURD详解及拓展~