基于 RGB 的 YBa 色彩空间建模研究

Learning-about

色深

当前主流的图片/视频/显示器还是 24 位色深的真彩色, 10bit 以上还有 12bit


色彩模型

  • 大多显示器/jpg:

    三原色红绿蓝/RGB, 由于目前显示器都是三原色的, 所以图像视频之类的都是三原色(不算 alpha)

    由于自发光, 红(255,0,0) + 绿(0,255,0) + 蓝(0,0,255) = 白(255,255,255)

  • 水彩颜料: 三原色红黄蓝/RYB

  • 打印机/TIFF:

    四原色青品黄黑/CMYK (Cyan, Magenta, Yellow, Black)

    由于吸光, 白(255,255,255) - 青(0,255,255) - 品(255,0,255) - 黄(255,255,0) = 黑(0,0,0)

    这里的减法不是数值上, 而是对颜色缺少的值做补充, 比如: 白(255,255,255) - 红(255,0,0) = 红(255,0,0), 红色颜料吸掉了白光里所有的绿蓝光谱, 只剩红光

    这个网站: 印刷四分色(CMYK)轉換三原色(RGB,紅綠藍) 可以进行 CMYK 与 RGB 的转换

  • PNG:

    三原色+透明度 alpha->RGBA, 所以常见的 png 与 jpg 图片分别为 32/24 位

  • GIF:

    单原色线性模型, 最高支持 28=2562^8=256 个颜色

  • HSB/HSV/HSL:

    色相 Hue, 饱和度 Saturation

    明度 Brightness 或者 Value, 亮度 Lightness

不同色彩模型区分原因是物理材料是吸/发光性质, 通过固定组合能达到良好的颜色呈现效果 [8]


色彩空间-色域

一般来讲是建立在 RGB 模型上的, 比如有 sRGB (standard RGB), Rec.2020

Rec.2020 就是 HDR10 的最低色域标准


HDR-SDR

High Dynamic Range, 是一套显示标准 (亮度范围, 色域, 色深, 传输…)

就像"高质量"这个词一样是厂家各自喊的, 有标准但并不统一, 倒是 SDR (standard dynamic range) 比较友好–>没达到 HDR 的都叫 SDR [7]


压缩

像是 jpg 在被有损压缩后, 交界边缘会有表情包的那种 “绿化电子包浆” 效果, 称为噪声/失真/赝像; 同样可以类比到 mp3/mp4 的压缩 (绿化效果是 Android 的锅)

而 png/GIF 格式只能无损压缩, 除非把它转成 jpg 才行


相机成像

为什么数码相机可以拍出彩色照片? - 阮一峰的网络日志

分割线

目 录

摘 要

随着电子科技的进步,越来越多的电子设备安装配备了显示屏幕,摄影和录像设备也被一体化的结合到了手机电脑之中,其中屏幕所发出的光是我们捕获屏幕信息的唯一途径。可见光的颜色和亮度是我们人类视觉能感受到的最具体和实际的两个光学信息,对于可见光的建模表示以及各种转换算法的迭代过程造就了社会发展中屏幕由黑白向丰富多彩的转变,但通用色彩模型在某些特定领域或特殊场景仍存在亟待改进之处。本研究调研分析了国际照明委员会 CIE 提出的主流色彩空间,分析其在亮度表示和混色算法上的优缺点并展开问题探究并提出 YBa 色彩模型,可有效解决 CIE-RGB 分支模型中对于亮度信息不敏感的问题,并同时提出基于 YBa 的混色算法,可为真实场景中可见光和反光物体的混色进行仿真计算。最后结合实际数据进行实验对比,得出可提供比 RGB 模型更广的亮度表示范围,以及颜色差异更小的混色算法。此研究的意义在于提供一个更加符合亮度的直观描述、混色运算更为合理的模型与算法,同时可以解决现实中已存在的问题。

关键词:色彩空间;颜色建模;Posit;混色算法

With the advancement of electronic technology, more and more electronic devices are equipped with display screens, and photography and video equipment are integrated into cell phones and computers, where the light emitted from the screen is the only way we can capture the information on the screen. The color and luminance of visible light are the two most concrete and practical optical information that we can perceive in human vision. The modeling representation of visible light and the iterative process of various conversion algorithms have contributed to the transformation of the screen from black and white to colorful in the development of society, but there are still urgent improvements to the universal color model in some specific areas or special scenarios. This study analyzes the mainstream color space proposed by the International Commission on Illumination (CIE), analyzes the advantages and disadvantages of its luminance representation and color mixing algorithm, and proposes the YBa color model, which can effectively solve the problem of insensitivity to luminance information in the CIE-RGB branch model, and proposes a YBa-based color mixing algorithm, which can be used for color mixing of visible light and reflective objects in real scenes. Simulation calculation. Finally, the experimental comparison with the actual data results in a color mixing algorithm that can provide a wider range of luminance representation and less color variation than the RGB model. The significance of this study is to provide a model and algorithm that is more consistent with the intuitive description of luminance and a more reasonable color mixing operation, as well as to solve the existing problems in reality.

Key words: Color space; Color modeling; Posit; Color mixing algorithm

分割线

第 1 章 绪论

1.1 研究背景

颜色建模和表示是计算机图形学中的一个重要概念,它涉及到如何用数学方式描述和生成各种颜色。不同的颜色模型有不同的优点和缺点,适用于不同的应用场景。例如,RGB 颜色模型是一种加色模型,它使用红、绿、蓝三原色的亮度来定量表示颜色,适合于显示器等发光体的显示。YUV 颜色模型是一种将亮度信息(Y)与色彩信息(UV)分离的模型,适合于电视系统以及模拟视频领域,它可以减少数据量并保持较好的图像质量。颜色建模和表示对于图像处理、视频编码、颜色匹配、颜色校正等任务都有重要的作用,需要根据不同的需求选择合适的颜色模型,并进行相应的转换和计算。

在 1931 年国际照明委员会 CIE 通过实验测的人类视觉三刺激值并提出 CIE-RGB 后,人类对于色彩空间建模的研究便打开了大门。然而目前学界与业界并没有一刀切解决所有问题的方案,随着技术的发展,很多新提出的色彩空间模型都尝试在新道路上发掘潜力。取决于人类只有红绿蓝三种色觉视锥感受器,所有人类能看到的颜色都可以用红绿蓝三基色配出。

在使用 RGB 模型表示时会遇到缺陷:三刺激值会出现负值,影响数值表示和计算,之后 CIE 提出并推荐使用 CIE-XYZ 模型表示颜色,这个系统使用的是虚拟的 XYZ 三基色,XYZ 的基色定义对颜色表示很有效,但是也引来了另一个问题:不符合人类直观感受,因为是虚拟的和强关联的数值表示,人类很难从数值中感受大致颜色,在调色时也会遇到多变量的困难。其后 CIE 提出 CIE-xyY 颜色空间,通过归一化 xyz 可以免去表示 z,定义使用 Y=Y 表示亮度。另外,CIE-XYZ 系统的色度图上表示的两颜色距离于人类观察的直观感受不一致,即会出现感知均匀性问题,为解决此问题 CIE 专家对 XYZ 模型进行非线性变换,制定了 CIE-L*a*b*颜色空间。

1.2 国内外研究现状分析

1.2.1 国外

国外的研究不仅涉及到颜色空间模型的基础理论、应用以及算法等方面,还包括了颜色感知、颜色管理、颜色测量、色彩混合等方面。美国科罗拉多大学的 Mark D. Fairchild 教授的名为《Color Appearance Models》的书籍,对颜色感知和颜色空间模型进行了详细介绍(包括对人类视觉系统、心理的影响以及具体的三刺激值函数)。关于 RGB 的亮度的表示和转换,也有相关文献集中在展示以及硬件工程领域,如光源材料衰老导致的亮度衰减控制。在混色算法的发展上,多来自于工程软件和硬件,如 LED 混色光源设计、屏幕材料以及 Photoshop 绘图软件之类,也有部分工作是受真实环境中物理颜料混色的启发。

1.2.2 国内

关于颜色空间建模,国内的研究主要集中在颜色空间模型的基础理论、应用以及算法等方面。例如,中国科学院自动化研究所的王宏伟等人在《计算机学报》上发表了一篇名为《颜色空间模型及其应用》的综述,对颜色空间模型的基础理论、应用以及算法等方面进行了详细介绍。图像识别领域中,色彩空间模型也是重要基石之一,随着机器学习和深度学习的快速发展,其在识别以及预测任务上取得较大进展。国内环境近十年互联网的快速发展也带来了视频图像的爆发式发展,其中颜色信息也在图形图像处理中发挥巨大作用。

1.2.3 文献评述

总体来说,现阶段学术界的研究更偏向于在细分领域解决不同种模型的应用弱点,由此细分出了诸如 CIE XYZ、YUV、HSL、HSV 之类的二级模型,以及对更为前沿的 YIQ、YCbCr 这种三级模型的研究。对于 RGB 模型与可见光亮度分析结合领域,仍存在可供研究和解决的亮度问题,以及在常用色彩空间模型的混色算法上,也存在一些体现在模型上的棘手问题。为此本文提出 YBa 色彩空间模型,从亮度表示以及混色算法两个角度入手设计和实现模型。

1.3 研究的目的及意义

在一些高科技领域,相机拍摄的原始数据对于机器处理是非常重要的。原始数据可以保留更多的细节和信息,比如光线、色彩、对比度等,这些对于机器学习或深度学习的算法来说是有价值的。然而,如果把原始数据转换成 RGB 格式,虽然可以让人眼看起来更舒服,但是也会损失一些应有的数据,导致机器处理的效果变差。

例如,在自动驾驶领域,使用 RGB 格式的数据训练模型可能会导致收敛速度变慢,或者在二维码识别时需要做额外的处理。在人脸识别领域,使用 RGB 格式的数据也会遇到一些问题,比如小范围低精度的 Hex 或传统 8bit-RGB 无法准确地区分虹膜的色彩差异,这会降低人脸认证的安全性和准确性。因此在这些领域,色彩空间建模和数据表示方法是需要特别改进的。

第 2 章 色彩的感知及色彩空间模型

2.1 有色光源及颜色信息

颜色就像语言对话,是客观的声音加上人脑主观处理所得到的感受,所以在不同环境下或者不同人对同一种颜色的感受也是略有不同的。我们眼镜接收到的所有颜色信息都是来自于光,我们对光线的物理量(波长、频率、频谱、强度分布)与色彩的人为感受联系起来是为色度学。通过光线的波动方程式可以获取客观的颜色信息(如公式 2-1)。

utt=c2(uxx+uyy+uzz)(21)u_{tt} = c^{2}\left( u_{xx} + u_{yy} + u_{zz} \right)\quad\quad(2 - 1)

其中 c 是光速,x:y:z 是空间的坐标,t 是时间的坐标,u(x,y,z,t)是描写光的函数,下标表示取偏导数。通过傅里叶变换可以获得波长分布以及每个波长的振幅,由此我们可以得到这个光在每个波长的强度,由此可以从波动方程式获得一个光谱。

光的颜色是由它的波长决定的,但是我们看到的颜色并不一定是光的真实波长。这是因为大部分的光源发出的光不是单色的,而是由多种波长和强度的光组合而成的。人眼对于这些混合光的颜色有一种适应性,使得我们能够把它们和单色光源发出的光的颜色相匹配。例如,显示器上显示的橙色,其实是由红色和绿色的光混合而成的,因为显示器不能产生单色的橙色。但是我们的眼睛会把它和 600nm 的单色橙色光视为同一种颜色。另一方面,有些颜色是不存在单色光源的,比如黑色、灰色和白色,以及粉红色或淡紫色。这些颜色只能由多种波长和强度的光混合而成,所以它们没有对应的单一波长。

卤族元素是指元素周期表中第七 A 族的元素,包括氟、氯、溴、碘和砹。这些元素的最外层电子只有七个,所以它们很容易与其他元素形成化合物,或者捕获一个电子变成负离子。当卤族元素的原子或离子受到电场或热能的激发时,它们的电子会从低能级跃迁到高能级,然后再跃迁回低能级,同时释放出光子。这些光子的波长和能量取决于电子跃迁的能级差。由于卤族元素的能级结构比较简单,所以它们发出的光只有几种特定的波长,形成明亮的单色光或双色光。例如,氯气放电时发出蓝绿色光,碘气放电时发出紫色光。卤族元素因此常被用于制作人造光源,如氖灯、汞灯、卤素灯等。

图 2-1 不同光谱分布图

实验表明,这四种光在人眼看来都是白光(如图 2-1)。因此看起来 HVS 对光源的具体光谱成分并不是特别在意。一个理想的黑体(如太阳)发射连续光谱,光谱的功率分布取决于黑体的温度,即色温。在上图的(b)~(d)例子中,谱线是分立的,并不符合色温的定义。因此引入相关色温(Correlated Color Temperature, CCT)的概念,任意光源与色温为 T 的黑体激发的颜色知觉相同,则该光源的相关色温定义为 T。

2.2 色彩空间模型分支特点

图 2-2 色彩空间分支

国际照明委员会(CIE)是一个专门研究光学和色彩的国际组织,它在 1931 年制定了一套基于水银光谱的三基色光系统。该系统定义了三种基本的光色,分别是红色、绿色和蓝色,它们的波长分别为 700nm, 546.1nm, 435.8nm。这三种光色的光通量也被规定分别是 1 光瓦、4.5907 光瓦和 0.0601 光瓦,分别用 RGB 表示。这三种光色可以按照不同的比例混合产生各种不同的光色。如图 2-2,主流色彩空间分支都在以 RGB 做为最底层的基础。

CIE-1931 RGB 颜色空间是一种基于人类视觉系统的颜色表示方法,它将可见光谱分为三个基本的颜色分量:红色(R)、绿色(G)和蓝色(B)。这三个分量可以用三维坐标系来表示,其中每个轴对应一个分量的强度。CIE-1931 RGB 颜色空间的目的是为了能够准确地描述人眼所能感知的所有颜色,但是它也存在一些问题。其中一个问题就是,由于人眼对不同波长的光有不同的敏感度,所以有些颜色不能用正数的 RGB 值来表示,而需要用负数来表示。这就导致了 CIE-1931 RGB 颜色空间的不均匀性和不连续性,给颜色匹配和转换带来了困难。例如,在下图中,我们可以看到红色分量在 435.1~546.1 波段出现了负值,这意味着这些颜色不能用实际的光源来产生,而只能用计算机模拟。

图 2-3 CIE-RGB 与 CIE-XYZ 三刺激函数

CIE 1931-XYZ 颜色空间是一种基于人类视觉系统的颜色表示方法,它由 CIE 在同年 1931 年提出,是最早的颜色空间标准之一。它使用三个参数 X、Y、Z 来描述颜色,其中 Y 代表亮度,X 和 Z 代表色度。它的优点是能够包含人眼能够感知的所有颜色,而且不受具体设备的影响,因此可以作为不同颜色空间之间的转换基准。另一方面,缺点是它不符合人类对颜色的直觉感受,因为 X、Y、Z 三个参数是虚拟基色并不对应于颜色的三个基本属性:色相、饱和度和明度。

CIE-1960 UCS 颜色空间是一种基于 CIE-1931 XYZ 颜色空间的均匀颜色空间,它旨在解决 CIE-1931 XYZ 颜色空间的一个主要问题,即在计算色差时,不同颜色区域的误差容忍度不同。为了使颜色的计算和比较更加一致和准确,CIE 在 1937 年引入了 Mac Adam 的(u,v)色坐标系,该坐标系将 (x, y) 转换为 (u,v),并在 1960 年正式采用。CIE-1960 UCS 颜色空间的优点是它更接近于人眼对颜色的感知,因此可以更好地反映颜色之间的差异。

图 2-4 CIE-UCS 1960 与 1976 颜色空间

由于 (u,v) 色坐标系統仍无法与视觉颜色同步化,因此 Mac Adam 继续深化研究,最终在 1973 年决定将 v 坐标再加上 50%,这个系统又被采纳为 CIE 1976 UCS (Uniform Chromaticity Scale) 色度坐标系統,使其形成的色域接近均匀色度空间,让色彩差异得以量化,在各种文献中也称 CIE LUV 颜色空间。 CIE 1976 UCS 的色度坐标 u' 和 v' 可以从三刺激值 X, Y, Z 或从色度坐标 x, y 按照以下公式计算得到(如公式 2-2~2-5)。

u=4XX+15Y+3Z(2-2) v=9YX+15Y+3Z(2-3) x=9u4u2v+12(2-4) y=6v4u2v+12(2-5)u\prime = \frac{4X}{X + 15Y + 3Z}\quad\quad(\text{2-2}\text{)} \\ \ \\ v\prime = \frac{9Y}{X + 15Y + 3Z}\quad\quad(\text{2-3}\text{)} \\ \ \\ x = \frac{9u\prime}{4u\prime - 2v\prime + 12}\quad\quad(\text{2-4}\text{)} \\ \ \\ y = \frac{6v\prime}{4u\prime - 2v\prime + 12}\quad\quad(\text{2-5}\text{)}

2.3 亮度的效果及色彩的心理恒常性

同一种颜色在不同的亮度中会产生不同的颜色感。这个现象的原因是我们的眼睛中除了有锥状细胞外还有可以感光的杆状细胞。杆状细胞虽然一般被认为只能分辨黑白,但它们对不同的颜色的灵敏度是略微不同的,因此当光暗下来的时候,杆状细胞的感光特性就越来越重要了,它可以改变我们对颜色的感觉。

根据 Retinex 理论,人类对颜色的感知不仅取决于视网膜上的信号,还取决于大脑皮层的处理。人类的视觉系统可以分离出图像的照度和反射分量,从而实现颜色恒常性,即物体的颜色不随光照条件而改变。Retinex 理论可以用来增强图像的对比度、亮度和色彩。Retinex 图像增强算法有多种,其中一种是多尺度 Retinex 算法(MSR),它通过对原始图像进行不同尺度的高斯滤波,然后将滤波后的结果进行加权求和,得到反射分量。另一种是带色彩恢复的多尺度 Retinex 算法(MSRCR),它在 MSR 的基础上,加入了一个色彩恢复因子,用来保持图像的色彩平衡。

梵高的部分画作就是典型的 Retinex 效果的例子,如图 2-5 他利用了人类视觉系统对颜色感知的特点,创造了一种独特的艺术风格。通俗理解就是大脑并不会随着亮度的变化而改变对此幅画作色彩的理解,我们可以看出左右两图在环境亮度上的差异,但并没有感觉到了其颜色的变化。

图 2-5 梵高画作图及高亮对比

2.4 色彩的混合

颜色与频率的关系是一个复杂而有趣的话题。一般来说颜色是由光的频率决定的,而不是波长。这是因为光的频率在不同介质中是恒定的,而波长会随着介质的折射率而变化。例如,一束红光从空气射入水中,它的波长会变短,但它的频率不会变,所以它仍然是红光。

但是,颜色也不是完全由频率决定的,而是受到人眼和大脑的影响。人眼有三种视锥细胞,分别对短波(蓝)、中波(绿)和长波(红)光敏感。当光照射到视网膜上时,视锥细胞会产生不同程度的刺激,然后传递给大脑。大脑会根据视锥细胞的信号,综合判断出颜色。

因此,颜色是一个主观的概念,不同的人可能对同一种光有不同的感受。有些人甚至可以分辨出几亿种颜色。颜色也会受到环境、心理、文化等因素的影响。所以,颜色与频率之间并不是一一对应的关系,而是大致相似的关系。正确的理解是,颜色是特定频率的光与人眼相互作用而在人大脑中形成的主观幻像。

光的颜色是由它的频率决定的,而不是波长。因为光在不同的介质中,它的波长会发生变化,但是它的频率不会变。一种频率对应一种颜色,但是一种颜色可以由不同的频率组合而成,这就是加色混合的原理。例如,红光和绿光混合后,我们看到的是黄光,但是它们的频率并没有改变,只是我们的眼睛和大脑对颜色的感知发生了变化。简单地说,混合并没有改变光的频率,而是改变了人眼+人脑对色彩的感知,这是由于人类视觉系统的局限性所致。人眼视网膜上有三种类型的视锥细胞,分别对红、绿、蓝三种基本颜色敏感。当我们看到不同颜色的光时,这些细胞会产生不同程度的神经刺激信号,传递给大脑,大脑根据这些信号来判断我们看到的颜色。

有色光三原色可以通过不同的比例混合产生人类能够感知的所有颜色。

表 2‑1 不同混色算法

序号标签
相加混色红色+绿色+蓝色=白色
红色+绿色=黄色
红色+蓝色=品红/紫色
绿色+蓝色=青色
互补混色黄色+蓝色=白色
品红+绿色=白色
青色+红色=白色
相减混色白色-红色=青色
白色-绿色=品红
白色-蓝色=黄色

2.5 Posit 数值系统

训练许多现代人工智能工具背后的大型神经网络需要真正的计算能力:例如,OpenAI 最先进的语言模型 GPT-3 需要惊人的亿万亿次运算来训练,并花费了大约 500 万美元的计算时间。工程师们认为他们已经找到了一种方法,通过使用一种不同的表示数字的方式来减轻负担。

这种新的数字表示方法被称为 Posit,是对今天使用的标准浮点算术处理器的改进。Posit 是由约翰·古斯塔夫森(John Gustafson)和艾萨克·约内本(Isaac Yonemoto)于 2017 年开发的,作为一种替代 IEEE 754 浮点标准的方案。与浮点数不同,Posit 具有可变宽度的有效位和指数位,以及一个 u 位,用于确定 Posit 是否对应于一个精确的数或一个区间。这使得 Posit 可以覆盖整个扩展实数线。马德里康普顿斯大学的一组研究人员开发了第一个在硬件中实现 Posit 标准的处理器内核,并表明,与使用标准浮点数进行计算相比,逐位基本计算任务的精度提高了四个数量级。此外他们还发现,使用 16 位或 8 位 Posit 可以在保持相同或更高精度的同时,提高机器学习应用程序的效率和内存使用率。英伟达、Arm 和英特尔就机器学习应用程序使用 8 位浮点数而不是通常的 32 位或 16 位浮点数的规范达成了一致。使用更小、精度更低的格式可以提高效率和内存使用率,但代价是降低计算精度。相比之下,Posit 可以在不牺牲精度的情况下,提供更大的动态范围和更多的有效位。因此,Posit 有望成为未来人工智能工具的理想选择。

实数的精确表示是计算机科学中的一个巨大挑战,因为它们有无限的精度,而硬件只能存储有限的位数。浮点数是一种常用的实数表示方法,它使用一个符号位、一个指数位和一个尾数位来编码一个数字。然而,浮点数有一些缺点,例如舍入误差、不均匀的分布和溢出问题。为了克服这些问题,一种新的实数表示方法被提出,称为 Posit。Posit 是一种基于浮点数的扩展,它增加了一个可变长度的"regime"位,用于调整指数的范围。这样,Posit 可以根据数字的大小自动调整精度,从而在数轴上实现更均匀和优雅的分布。

Posit 的一个重要应用领域是深度神经网络,它是一种由多层非线性单元组成的机器学习模型。深度神经网络需要大量的计算资源来训练和推理,其中最常见的操作是矩阵乘法。矩阵乘法涉及大量的乘法累加运算,每次运算都可能导致舍入误差和溢出。为了减少这些影响,Posit 提供了一种特殊的寄存器,称为 quire,它可以在不损失精度的情况下累积多个 Posit 值。然而,目前的硬件还没有原生支持 Posit 运算,因此使用 Posit 需要在软件层面进行转换,这会增加计算开销和复杂性。

为了评估 Posit 在深度神经网络中的性能和准确性,Complutense 团队设计了一种基于 FPGA 的硬件实现,它可以并行执行 32 位浮点和 32 位 Posit 的矩阵乘法。他们将其结果与使用 64 位浮点作为基准的结果进行了比较,并发现 Posit 在精确度方面有显著的提升,达到了四个数量级。此外,他们还发现 Posit 在计算时间方面与浮点相当,只是稍微增加了芯片面积和功耗。这些结果表明 Posit 是一种有前途的实数表示方法,它可以为深度神经网络提供更高的精度和效率。

图 2-6 Posit 与 float 对比

第 3 章 模型分析与设计

3.1 亮度参数设计

在 CIE-RGB 色彩模型中,我们对"亮度"这一概念的感知,实际是通过控制 RGB 每个分量的大小(光波振幅)来表示,而不同分量的配比控制的是颜色(也就是光波频率)。这也就导致了在想调整颜色的同时,一定会改变亮度。由于感光视感细胞的存在,使得亮度应为 RGB 之外的维度,对于显示器来说由全局控制,也就是控制的是[0,n]这个波动范围的上限,按比例伸缩。所以在 RGB 色彩表示中,纯白色一定是最亮的,其他颜色一定没有纯白色视觉感受亮度高。

如图 3-1 为在屏幕上播放电焊机焊接模拟的画面,焊区的闪光不会有格外刺眼的情况(屏幕亮度上限远比电焊机闪光真实亮度小),视觉感受上接近纯白色的铁架(252,252, 250)与电焊机的闪光(254, 254, 233)亮度比较起来相近甚至更耀眼,因为电焊机的光中蓝光部分稍弱,在 RGB 中表示为亮度更弱一些的黄光,这就是 RGB 表示中亮度表示的反常所在。

图 2-1 特殊环境下亮度对比图

传统 CIE-RGB 色彩空间对于色光的亮度表示还存在其他缺陷,比如两同颜色的光源在叠加后,颜色不变亮度会更高(如图 3-2),但在 CIE-RGB 中只能将其视为另一种颜色表示,单纯的亮度变化会使 RGB 分量都会进行扩缩。

图 3-2 色光的亮度叠加

现有的含有亮度信息的色彩模型比如 CIE-Yxy,它基于 CIE XYZ 色彩空间,但是更加直观和方便。CIE Yxy 色彩空间定义 Y 参数是颜色的明度或亮度的测量。颜色的色度接着通过两个导出参数 x 和 y 来指定,它们是所有三个三色刺激值 X、Y 和 Z 的函数所规范化的三个值中的两个。x 和 y 可以用来在二维色度图上表示颜色,而 Y 可以用来表示颜色的亮度。CIE-Yxy 在亮度定义和表示上存在一定问题和误差。虽然在数值表示和计算上很方便,但并不符合真实情况和变化感受。

此处对于亮度信息,采用与 CIE-RGB 不同的方式,单独作为一个分量表示,而隐含在 RGB 中的亮度信息作为先验。在第二章色彩的心理恒常性也侧面验证了,在建立色彩模型时,独立出亮度分量的可行性和有效性。

3.2 颜色信息的表示

常用的 CIE-RGB 模型表示中,RGR 常以三个 8 位的整数组合来表示,如(100,50,50),这种表示对于计算机和人类来说都比较直观简易,但同时也使得在色彩表示精度和均匀度上存在不足。而 CIE-XYZ 则是摒弃了人为观测的角度,虚拟 XYZ 分量使得 RGB 在通过矩阵转换后非常不符合直观感受。

此部分提出使用两个 Posit 数值的 Bias 来替代表示三个 RGB 分量,如(0.375,0.875)。与 RGB 对比同样位数表使用 Posit 数值系统表示颜色, 在精度可以提升很多(与 RGB 的 uint8 相比,Posit8 可以扩大2102^{10}以上的数值表示范围),同时在使用 FPGA 硬件计算时性能也可以得到一定提升。

3.3 混色算法的设计

在 CIE-RGB 色彩模型基础上,使用传统混色算法,是 RGB 数值分别叠加再除以 2 所得,因为 RGB 三值在物理的数值选择上并不均匀,通过这种简单平均得出的颜色与真实情况会存在肉眼可见的色值差异。如图 3-3 左侧,纯正的黄色与蓝色混合得到了很大程度上偏向灰色的绿色。此处使用 mixbox 优化算法,得到一个更符合真实场景下的混色色值结果(如图 3-3 右侧绿色色值)。

图 3-3 混色色值非正常的传统算法

传统算法常用于计算机 Web 端含带 Alpha 通道的 RGBA 色彩模型的混色,而对于仿真场景中两颜色混合后亮度的叠加或衰减则缺乏支持。如图 3-4 所示,红色与蓝色混合后,并没有对紫色的亮度造成变化,而在真实场景中两颜色的混色一定会对其亮度产生叠加或衰减变化。

结合章节 3.1 的亮度表示与 3.2 的颜色表示,可以从亮度混合与颜色混合两条路出发,在经过算法计算后得到最终亮度+颜色色值的组合结果。

图 3-4 适用于 RGBA 的混色算法

第 4 章 YBa 色彩模型实现

4.1 亮度计算与表示

在第三章模型分析与设计中,设计了比主流模型更合理的亮度参数,通过适用于高精度高范围的 Posit 数值系统表示亮度与颜色,并基于此亮度与颜色表示设计混色算法,结合此三点提出 YBa 色彩空间模型。不同于常见的 CIE-RGB、CIE-L*a*b*色彩空间,YBa 模型并没有对色光三基色直接进行建模和数值表示,而是通过对应的三刺激值通过计算得出的色彩模型。其中 Y 采用类似于 YUV 色彩空间中的亮度计算方法,B 为 RGB 三种中间色在[0,1]中的偏置表示,a 是 Alpha 表示色光或物体的本身光学属性。

真实场景中色光与颜料的混色算法是相反的,色光符合混合加法,亮度会提升趋近于白色;而颜料的混合符合减法,亮度降低趋近于黑色,此差异在印刷品的颜色表示和检测中尤为重要。如下代码表示,对红色和绿色进行 1:10 混合,在混合 10 次与 20 次后分别输出 RGB 色值并作图对比,如图 4-1 所示,颜色的偏移符合自然混色,但是亮度的变化是相反的,真实场景下颜料的混合不会越混合越亮。

import mixbox

rgb1 = (255, 0, 0) # red
rgb2 = (0, 255, 0) # green
rgb3 = (0, 0, 255) # blue

mixed_color = rgb1
for i in range(10):
mixed_color = mixbox.lerp(mixed_color, rgb2, 0.1)
print(mixed_color)

for i in range(10):
mixed_color = mixbox.lerp(mixed_color, rgb2, 0.1)
print(mixed_color)

图 4-1 混色亮度对比

此处使用 Posit 来记录数值,Posit 自带的正负位可作为光源属性位,在支持的场景下使用时(比如在图形学的光照、光线追踪),+代表是光源的光,-代表是物体反射的光。这样做的目的是区分开光线混合时使用的算法。如图 4-2,左右分别为粉色和黄色的灯光交叉照在纸上,亮度为两正叠加。如果为两个不同颜色的彩笔交叉画,则是两负叠加,亮度衰减。例如亮度表示为-20 的纸张被亮度为+100 的光线照射,物体当前状态所表示的亮度应为 80。

图 4-2 亮度的叠加与衰减

首先假定 YBa 颜色模型的亮度 y 为负无穷到正无穷的实数表示,正数表示有色光,而负数表示反光物体,可通过正负判断光源并支持亮度叠加或衰减,通过 CIE-RGB 模型的数值表示与对应 CIE 标准光通量的相乘后相加作为等能光强度(如公式 4-1)

y(RGB)=±(0.299R+0.587G+0.114B)(4-1)y({\color{Red}R}{\color{Green}G}{\color{Blue}B}) = \pm (0.299{\color{Red}R} + 0.587{\color{Green}G} + 0.114{\color{Blue}B})\quad\quad(\text{4-1}\text{)}

图 4-3 Sigmod 激活函数

图 4-4 亮度 Y 激活函数

为了解决物理设备对亮度显示的限制问题,此处采用了一种基于原版 Sigmod(如图 4-3)优化后的激活函数(如图 4-4 及公式 4-2),将亮度的数值表示从无界变为有界。这样既保证了亮度的连续可变性,也可以在数值计算和设备运行时避免亮度过高和过低或者溢出的情况,保证亮度在显示器支持范围[0,1]内变化。

Y(y)=21+ey/1281(4-2)Y(y) = \frac{2}{1 + e^{- y/128}} - 1\quad\quad(\text{4-2}\text{)}

表 4‑1 不同模型的色彩表示

颜色RGBY-RGBHSV
50%亮度的纯白色(127,127,127)+0.38,(255,255,255)0, 0%, 49.8%
100%亮度的绿色(0,255,0)+0.52,(0,255,0)120, 100%, 100%
5%亮度的粉红色(13, 0, 3)+0.015,(255, 0, 68)344, 100%, 5%

如表 4-1 与 CIE-RGB 对比,Y-RGB 具有更直观的亮度表示,而不会出现 RGB 中随着亮度改变而产生变色的问题。与含有明度信息的模型(如 HSV)相比,Y-RGB 也能更好的保留三原色分量信息。在 y=64、128、255 的情况下 Y 分别为 0.24、0.46、0.76(y 单色极值为 256),符合人类视觉舒适范围并且变化平稳符合直觉,在混色时也不会遇到亮度瓶颈问题。

4.2 YBa 的数值转换及表示

图 4-5 Posit<8,2>范围及精度

YBa 的亮度信息最终落到[0,235]的范围内,利用开源工具作图分析(如图 4-5),可通过 Posit<8,2>存储表示(高精度范围为 0.00391~384),符合亮度表示所需范围。

YBa 色彩模型中的 B 代表 Bias,即为色彩偏置。这里并没有如同其他颜色模型(比如 YUV、CIE-XYZ)一样做空间变换,而是继续沿用 CIE-RGB 的色彩空间建模,定义 B1 与 B2 替代 RGB(如公式 4-3、4-4)。

B1=RR+B+G(4-3)B1 = \frac{\color{Red}R}{\color{Red}R + \color{Blue}B + \color{Green}G}\quad\quad(\text{4-3}\text{)}

B2=1BR+B+G(4-4)B2 = 1 - \frac{\color{Blue}B}{\color{Red}R + \color{Blue}B + \color{Green}G}\quad\quad(\text{4-4}\text{)}

这样,在[0,1]的数值范围之内,通过两个 bias 可以间接获取到 RGB 三个值,作用以及好处是可以将[0,255]的 RGB 整数表示映射到[0,1]的 Posit 数值上,具有更简化的表示和比正数与浮点数更高的表示精度。

YBa 中的"a"为 Alpha,采用与 RGBA 色彩模型中相同的概念表示,用于描述物体本身不透光率,同时将光线的 Alpha 定义为 0。如图 4-6 中的浅绿色玻璃,Alpha 影响光线的穿透率,同一束光在通过左侧玻璃与右侧空气的对比,左侧在通过光照照射穿透为浅绿色光的同时也会使穿透玻璃的光亮度衰减。使用 Posit<8,0>表示其百分数(在 0~1 提供了较高的动态精度)。

图 4-6 物体的 Alpha 与光照

4.3 混色算法的实现

两 YBa 颜色混合时,Y 值可通过改良的 Sigmod 函数的反函数求 y,即 y=Y’(Y),两颜色的 y1、y2 相加再通过 Sigmod 求 Y,可得到两颜色混色后的 Y 值。混合后的 B 值可转换到 RGB 后通过 mixbox 算法库计算,如下为核心代码块,其对 RGB 转换为 latent 后进行数值叠加,再转换为混色后的 RGB 数值。

def float_rgb_to_latent(rgb):
r = _clamp01(rgb[0])
g = _clamp01(rgb[1])
b = _clamp01(rgb[2])

x = r * 63.0
y = g * 63.0
z = b * 63.0

ix = int(x)
iy = int(y)
iz = int(z)

tx = x - ix
ty = y - iy
tz = z - iz

xyz = (ix + iy*64 + iz*64*64) & 0x3FFFF

c0 = 0.0
c1 = 0.0
c2 = 0.0

w = (1.0-tx)*(1.0-ty)*(1.0-tz); c0 += w*_lut[xyz+ 192]; c1 += w*_lut[xyz+262336]; c2 += w*_lut[xyz+524480];
w = ( tx)*(1.0-ty)*(1.0-tz); c0 += w*_lut[xyz+ 193]; c1 += w*_lut[xyz+262337]; c2 += w*_lut[xyz+524481];
w = (1.0-tx)*( ty)*(1.0-tz); c0 += w*_lut[xyz+ 256]; c1 += w*_lut[xyz+262400]; c2 += w*_lut[xyz+524544];
w = ( tx)*( ty)*(1.0-tz); c0 += w*_lut[xyz+ 257]; c1 += w*_lut[xyz+262401]; c2 += w*_lut[xyz+524545];
w = (1.0-tx)*(1.0-ty)*( tz); c0 += w*_lut[xyz+4288]; c1 += w*_lut[xyz+266432]; c2 += w*_lut[xyz+528576];
w = ( tx)*(1.0-ty)*( tz); c0 += w*_lut[xyz+4289]; c1 += w*_lut[xyz+266433]; c2 += w*_lut[xyz+528577];
w = (1.0-tx)*( ty)*( tz); c0 += w*_lut[xyz+4352]; c1 += w*_lut[xyz+266496]; c2 += w*_lut[xyz+528640];
w = ( tx)*( ty)*( tz); c0 += w*_lut[xyz+4353]; c1 += w*_lut[xyz+266497]; c2 += w*_lut[xyz+528641];

c0 /= 255.0
c1 /= 255.0
c2 /= 255.0

c3 = 1.0 - (c0 + c1 + c2)

mixrgb = _eval_polynomial(c0, c1, c2, c3)

return (
c0,
c1,
c2,
c3,
r - mixrgb[0],
g - mixrgb[1],
b - mixrgb[2],
)

Alpha 值的计算公式参考 RGBA 混色算法定义(如公式 4-5),利用提出的 YBa 颜色模型进行混色操作,符合光学和物理特性,最终得到的结果公式(如公式 4-6)。

a(a1,a2)=1(1a1)(1a2)(4-5) RGBdist(YBa)=Y(Y(Y1)+Y(Y2))×mixbox((B11,B12),(B21,B22))×a(a1,a2)(4-6)a\left( a_{1},a_{2} \right) = 1 - \left( 1 - a_{1} \right)\left( 1 - a_{2} \right)\quad\quad(\text{4-5}\text{)} \\ \ \\ {\color{Red}R}{\color{Green}G}{\color{Blue}B}_{dist}(YBa) = Y\left( Y’\left( Y_{1} \right) + Y’\left( Y_{2} \right) \right) \times mixbox\left( \left( B_{11},B_{12} \right),\left( B_{21},B_{22} \right) \right) \times a\left( a_{1},a_{2} \right)\quad\quad(\text{4-6}\text{)}

如表 4-2,如下为最复杂的第三项的计算过程(如 4-7~4-11):

αmixed=1(1α1)(1α2)=0.4(4-7) y1=+(256×1×0.75)=+192(4-8) y2=(256×1×0.1)=25.6(4-9) Ymixed=Y(y1×αmixed+(y2))=0.379(4-10) B1=RR+G+B=0, B2=1BR+G+B=1(4-11)\alpha_{mixed} = 1 - \left( 1 - \alpha_{1} \right)\left( 1 - \alpha_{2} \right) = 0.4\quad\quad(\text{4-7}\text{)} \\ \ \\ y_{1} = + (256 \times 1 \times 0.75) = + 192\quad\quad(\text{4-8}\text{)} \\ \ \\ y_{2} = - (256 \times 1 \times 0.1) = - 25.6\quad\quad(\text{4-9}\text{)} \\ \ \\ Y_{mixed} = Y\left( y_{1} \times \alpha_{mixed} + \left( - y_{2} \right) \right) = - 0.379\quad\quad(\text{4-10}\text{)} \\ \ \\ B1 = \frac{R}{R + G + B} = 0,\ B2 = 1 - \frac{B}{R + G + B} = 1\quad\quad(\text{4-11}\text{)}

表 4‑2 不同模型的色彩表示

描述RGBAYBa(亮度|色值|Alpha)
100%亮度的红色光与绿色光混合(128,128,0,0)+0.707,(0.5,1),0
50%亮度的绿色与 25%的白色光混合(32,96,32,0)+0.543,(0.2,0.8),0
75%亮度的纯白光照在 10%白色环境亮度、Alpha 为 0.4 的绿色玻璃上无法直接计算-0.379,(0, 1),0.4

图 4-7 混色算法结果对比

RGBA
mixbox
YBa
GroundTruth
RGBA
mixbox
YBa
GroundTruth

对表 4-2 前两项进行作图对比(如图 4-7 所示),RGBA 混色算法在对颜色混合后,灰度显示会更加突出,直观感受是色彩不鲜艳。使用 Photoshop 中叠加变亮混色算法,在混色后很容易达到亮度阈值 255,在进一步混合亮度更高的色光时就会无法做到变更色值,YBa 通过改良 Sigmod 算法处理后,在保留了一部分亮度瓶颈的同时,可以完好地表示和呈现原色值。

如图 4-7,mixbox 算法同样也会遇到如在章节 4.1 的亮度问题,无法正常处理色光的亮度叠加式混色。此处提出的算法(公式 4-6)可有效解决色光和仿真混色中遇到的亮度异常问题,并且可模拟色光加物理材料以及环境光的混色(如表 4-2 第三行),而在 RGBA 混色算法或者通过 mixbox 算法库则无法直接对其直接进行合理的混色。

使用公式 4-1 的对应等能亮度权重,加权计算表 4-2 前两项的等能亮度,对比如表 4-3:

表 4‑3 等能亮度对比

描述RGBAmixboxYBa实际亮度
100%亮度的红色光与绿色光混合0.4430.3950.7072.000
50%亮度的绿色与 25%的白色光混合0.1600.1580.5430.750

使用欧氏距离色值差异(如公式 4-12)对表格 4-2 前两项数据进行评估对比,如表 4-4 所示,YBa 混色算法与 RGBA 混色、mixbox 混色对比,可以取得更小的色值差异。

ΔRGB=(RdistRtar)2+(GdistGtar)2+(BdistBtar)2(4-12)\Delta_{\color{Red}R\color{Green}G\color{Blue}B} = \sqrt{\left( \color{Red}R_{dist} - \color{Red}R_{tar} \right)^{2} + \left( \color{Green}G_{dist} - \color{Green}G_{tar} \right)^{2} + \left( \color{Blue}B_{dist} - \color{Blue}B_{tar} \right)^{2}}\quad\quad(\text{4-12}\text{)}

表 4‑4 色值差异对比

描述RGBAmixboxYBa
100%亮度的红色光与绿色光混合181201107
50%亮度的绿色与 25%的白色光混合10610558.8

使用天文模拟软件 Stellarium 获得仿真图(如图 4-8 所示),图中土星与月球视星等分别为 0.83 与-11.59,根据普森公式可知其亮度相差近 70000 倍。在 RGB 中其亮度差值为 6%,在 YBa 图像中,其亮度差值为 76%,有了显著提升,更适用于工程与计算领域的处理。此外由于亮度非均匀变化,RGB 图像无法通过图像的亮度反推真实场景下的亮度差异(如图中土星与月球的亮度差),而在 YBa 图像中可以利用亮度公式 4-2 的反函数推导出真实的亮度差异。

图 4-8 RGB(上)与 YBa(下)图像对比

第 5 章 结论与展望

5.1 工作结论

本论文研究以可见光的 RGB 的表示和建模为出发点,目的是解决可见光在颜色表示和转换上遇到的一些的困难。通过作图对比分析模型之间的差异以及优缺点,剖析现有 RGB、YUV 模型内存在的特定问题:亮度的可靠表示以及混色算法的缺陷,展开模型算法设计,并进行实现、实验数据分析和对比,本文的主要工作如下:

  1. 通过结合 YUV 色彩空间的亮度表示、CIE-Yxy 的色度值表示换算、引入 RGBA 色彩空间的 Alpha 通道作为透明度表示,形成一个四维的颜色向量,得到一个在亮度表示上更加科学有效、符合数学转换和人类直观感受的 YBa 色彩表示模型,通过实验数据作图分析,评估 RGBA、mixbox 以及 YBa 在亮度表示上的可靠性。

  2. 通过引入使用 Posit 数值系统可以更精确高效的表示颜色参数,分析数值范围以及高精度表示区域,设计实现 YBa 色彩模型的 Posit 数值表示。

  3. 最后本文提出了一种基于 YBa 模型的混色算法,该算法可以实现多种颜色之间的混合,并考虑了亮度和透明度的变化。本文通过实验展示了混色算法的效果,并与其他混色算法在欧氏距离色值差异上进行了评估分析和比较。

5.2 工作展望

为了更加科学和准确的表示颜色,需要更深入的研究来改进。本文提出的 YBa 色彩模型与其支持的混色算法在解决亮度表示问题上、混色结果与的真实场景的差异性上都取得了一定的提升。但此模型在设计和实现上仍存在亟待优化的方面:

  1. 更多数据组合的实验探究,从实际数据出发,评估和改进算法的合理性。

  2. 对 Posit 数值系统的深入使用和性能优化,改进运算流程和公式加快计算时间。

  3. 更加深入和广度地研究相关颜色模型并分析其优缺点,对 YBa 混色算法的流程改进和细节调整。

  4. 对更多角度的模型参数和结果进行标准的实验评估,通过真实有力的数据验证模型和算法的可靠程度,并从不足之处回溯算法的缺陷。

分割线

致谢

回望过去四年,简短得像是刚刚路过的路灯,没有多么明亮却是刚好足够看清前方每一步路;说起来也很漫长,每一段旅程仍在记忆中历历在目。

大一确实在荒废前程,调整高中状态,在课业和游戏社团中度日,寒暑假打零工的经历倒是稍许改变了交际能力和性格。大二虽也是课业繁重,组织忙的不可开交,但也乐在结识了很多同学,抽空自学了一些开发课程。感谢学长与外聘教师引荐,与 Drincann 去市公安局的机房实训了几次。后入职在用友畅捷通实习呆了不长时日,也是很感谢 leader 与小师傅的指导。大三后基本所有时间都留给了学习和少许娱乐,很幸运的结识杨 Sir 并被引荐到清华大学实验室实习至今,与师兄师姐一起的工作机会学到了很多科研知识。与此同时脚步迈到了大四,面试进入智周未来公司做开发小半年,感谢工作过程中架构师的引导和同事们的帮助。

大四下也算得落叶归根,半年的 gap 时间在学校忙于自己的学业事业。真挚地感谢辅导员胡杨峰老师,导师王栋轩以及各科的任课老师的辅导和教学,在学校的课业生活中总能被老师们各方面帮助。也感谢一路上陪伴或多或少的朋友们,为我的前行提供了恰到好处的动力和助力,更是要好好感谢舍友同学们的帮助陪伴,没有你们吃饭都没那么香。当然最是无可替代的后盾莫过于家人,衣食住行都离不开父母和姐姐的照顾。

最后引用奥托的铭言,“Life is too long to end at a grave”,虽是不合时宜但也显得恰到好处了。感谢各位灯塔参与我四年的大学时光,惜是天下无不散之筵席,若是有缘我愿一同照亮大家明天的路,感谢大家!

分割线

借物表

[1]: 色彩空间表示与转换

[2]: 透明颜色混合算法_A.A 的博客-CSDN 博客

[3]: 聊聊颜色的技术实现(二)—— CIE 1931 XYZ 系统

[4]: Color Space (1)

[5]: 第二章 CIE 标准色度系统 1