图形学的基础理论和概念01——图像和颜色的表示
Understanding the Linux Graphics Stack training翻译整理(1.1 Image and Color Representation)
图形学是研究如何创建、处理和显示图像的学科。在图形学中,图像是由光的发射所产生的视觉表示。图形学涉及的基础理论和概念包括图像和颜色的表示、几何学、光照和着色、渲染技术等。
1. 图像和颜色的表示
1.1 光、像素和图片
(Light, pixels and pictures)
-
图像是对光发射(light emissions)的表示。
-
模拟表示(Analog representations):
- 在空间上连续的(continuous)表达方式,具有无限数量的元素
- 例子:照相纸
-
数字表示(Digital representations):
- 在空间上是量化的(quantified)表达方式,具有有限数量的元素
- 例子:LED显示屏
-
生成数字表示的过程被称为量化(quantization):
- 从连续的世界中减少信息的过程:将连续的数据(如图像或信号)转换为离散的形式。
- 量化需要一个基本的元素单元(base element unit)或量子(quantum)
- 这种量子被称为像素(picture element / pixel)
- 此处的“量化”也被称为采样(sampling)
-
图像(Pictures)是由像素(也称为帧 frames)有序组成的二维集合:
- 帧具有宽度(width,水平方向)和高度( height,垂直方向)的尺寸
- 纵横比是宽度与高度的比例(例如 16:9、4:3)
- 像素通过位置坐标(x,y)来确定
- 尺寸(dimension)和位置(position)的单位是像素的数量
-
量化的像素具有空间密度(spatial density)或空间分辨率:
- 像素分辨率:每英寸显示的像素数量,通常以每英寸的点数 dot per inch (DPI)或像素数(PPI)来衡量
- 空间密度:指在一定空间范围内的像素数量
像素数量=DPI × n例如,如果显示器或图像的像素分辨率为300 DPI,并且我们想要计算5英寸中的像素数量,我们将300 DPI乘以5,得到1500像素。
- 通常情况下,垂直和水平空间密度没有区别,像素被假设为大部分时间都具有正方形的形状。
1.2 采样和频域
(Sampling and frequency domain)
- 像素是对空间域(spatial domain)的量化/采样
- 初始的(连续)域具有相应的频谱。
- 高频率在图片中提供细节
在信号处理和图像处理中,连续域的信号具有一个对应的频谱。频谱描述了信号在不同频率上的能量分布情况。
在图像处理中,高频率成分表示了图片中的细节部分。高频率分量可以捕捉到图片中的快速变化和细微的细节,例如边缘、纹理等。相比之下,低频率成分代表了图片中的平滑变化和整体结构。 - 二维傅里叶变换将空间域(x, y)转换为频率域(u, v)
这个变换将域分解为周期模式(periodic patterns),为了处理离散信号,使用离散傅里叶变换(DFT,Discrete Fourier Transform);为了高效地计算傅里叶变换,使用了经过优化的算法,即快速傅里叶变换(FFT,Fast Fourier Transform)
在信号处理中,频域分析是一项非常有用的技术,并被广泛应用于图像压缩的基础:- 频域分析:帮助理解信号在频率上的特征和分量,并提供了一种有效的方法来处理和压缩信号,特别是图像。
通过将信号或图像转换到频率域,我们可以识别信号中的重要频率分量,并对其进行调整、滤波或丢弃,以达到压缩数据的目的。 - 图像压缩:在图像压缩中,频域分析技术如离散傅里叶变换(DFT)和快速傅里叶变换(FFT)被广泛应用。
通过将图像转换到频率域,我们可以对频率分量进行编码和量化,以减少数据的存储空间和传输带宽。在压缩后的图像中,较低重要性的频率分量可以被丢弃或减少精度,从而实现更高的压缩率。
- 频域分析:帮助理解信号在频率上的特征和分量,并提供了一种有效的方法来处理和压缩信号,特别是图像。
1.3 采样和混叠现象
(Sampling and aliasing):
采样(Sampling):指将连续信号转换为离散信号的过程。通过在一定时间间隔内获取信号的样本值,我们可以以离散形式表示原始连续信号。然而,采样过程中存在一个重要的问题,即混叠现象(Alias)。
混叠现象:是指在采样过程中,高于采样率一半的频率成分被错误地表示为低于采样率一半的频率成分。这会导致原始信号的高频部分与低频部分发生重叠,无法正确恢复原始信号。
混叠现象的典型示例:
走斑现象(Moire),当在图像中存在高频细节(如网格、条纹等)并进行采样时,可能会出现意外的模式和失真。
在图形学和图像处理中,空间域通过双维采样分辨率进行离散化表示:
- 在每个轴上,存在相匹配的采样频率(us, vs)
- 这些采样频率限制了可以从初始域进行采样的频率范围
- 香农-奈奎斯特定理(Shannon-Nyquist theorem)为(us, vs)提供了一个充分条件:
根据香农-奈奎斯特定理,为了正确采样信号或图像,采样频率(us, vs)必须大于信号或图像中最高频率的两倍。如果采样频率不满足这个条件,就会发生混叠现象,导致无法正确地恢复原始信号或图像。
当采样频率低于充分条件时,即当 u ≥ us/2 和 v ≥ vs/2 时,高于采样频率一半的频率成分无法被正确采样。这可能导致频率失真和引入错误的频率成分。在图像处理中,这可能导致出现2D走斑模式(Moiré pattern),这是一种由频率混叠引起的视觉伪影。
因此,在进行信号或图像采样时,我们需要确保采样频率(us, vs)满足香农-奈奎斯特定理的条件,以避免混叠现象和错误的频率引入。这样可以保证信号或图像的准确性和质量,并避免出现2D走斑模式等视觉伪影。
1.4 光和颜色表示
(Light and color representation)
- 光(Light):在数字形式中表示光时,需要对光进行量化或离散化。这种量化是指将光强度的连续变化表示为离散值的过程。然而,这种光的量化与用于表示像素的空间量化是不同且独立的过程。
在数字表示中,光和空间信息都进行了量化,但它们是不同且无关的过程:
- 光的量化关注的是离散化光强度或颜色值
- 空间量化关注的是离散化图像中像素或元素的空间排列。
- 颜色(colors):颜色是基于人类视觉系统的知觉
- 视觉基于三色性(trichromacy):红、绿、蓝
- 不一定是光谱中的唯一频率(例如,粉色不是可见光谱的颜色。)
颜色的感知是基于人类视觉系统对光的响应,其中红、绿、蓝三种颜色起着重要作用。
而颜色的感知并不一定对应于光谱中的唯一频率,如粉色就是一个例子,它是由红色和蓝色的混合而形成的特定感知颜色。
- 将光信息(颜色)转化为数字的过程:
- 色彩模型(color model)定义了颜色组成的基础,通常包括3个组成部分(例如红色、绿色、蓝色)
- 色彩空间(colorspace)是一个精确的翻译参考系统,用于将颜色映射到基本颜色成分的坐标。它提供了一种唯一的关联方式,将颜色与基本颜色成分的数值表示进行对应。
- 色域(color gamut)是色彩空间中可表示的颜色范围。不同的色彩空间具有不同的色域,即能够表示的颜色范围不同。并非每个颜色都可以在每个色彩空间中准确地表示,因为不同的色彩空间可能具有不同的色域限制。
1.5 颜色量化方法
(Color quantization approaches)
-
颜色的量化有不同方法:
- Uniform:颜色范围内的均匀量化是最常见的方法。
在这种方法中,将颜色范围等间隔地分成多个部分,并为每个颜色分配一个值。这种均匀量化使得颜色值具有规则的步长(分辨率),可以更容易地表示和存储颜色信息。 - Irregular: 非规则量化是使用索引颜色或调色板的方法。
在这种方法中,不是为颜色范围内的每个颜色分配值,而是根据需要为特定的颜色分配值。通过使用调色板,可以将一组特定的颜色映射到索引值,从而实现非规则的颜色量化。
- Uniform:颜色范围内的均匀量化是最常见的方法。
-
均匀的颜色坐标通过量化过程进行离散化表示:
- 通过给定的分辨率,即最小可能的颜色差异,来量化颜色坐标。
分辨率决定了量化过程中颜色之间的最小间隔。较小的分辨率会产生更精细的颜色表示,而较大的分辨率则会导致颜色之间的较大差异。 - 通过给定的范围,即可表示的颜色范围,来限定量化后的颜色坐标。
范围确定了颜色的上限和下限,表示了可以在量化过程中表示的颜色的范围。
通过对颜色坐标进行均匀量化,我们可以将连续的颜色范围映射为离散的、具有一定分辨率和范围的颜色集合。
- 通过给定的分辨率,即最小可能的颜色差异,来量化颜色坐标。
-
使用给定的比特数进行量化:比特深度(bit depth)
比特深度:用于表示数字图像或颜色的每个分量的位数。
它决定了量化过程中可以表示的颜色级别的数量。较高的比特深度意味着更多的颜色级别和更精细的颜色表示,而较低的比特深度则会导致较少的颜色级别和较粗糙的颜色表示。- 例如,对于一个8位的比特深度,可以表示256个不同的颜色级别(2的8次方)。这意味着每个颜色分量可以具有256个可能的值,从而产生更精确的颜色表示。而对于一个4位的比特深度,只能表示16个不同的颜色级别(2的4次方),颜色表示则更加有限。
-
在颜色量化过程中需要在范围和分辨率之间做出权衡:
- 提高分辨率会降低范围:
增加分辨率意味着细化颜色的表示,即使用更多的颜色级别来表示图像或颜色。这样可以更精确地呈现图像的细节和颜色的变化。然而,增加分辨率会导致可表示的颜色范围减少,即限制了可以表示的不同颜色的数量。 - 提高范围会降低分辨率:
相反,增加范围意味着扩展颜色的表示范围,即能够涵盖更多不同的颜色。这样可以增加图像或颜色的多样性和鲜明度。然而,增加范围会导致分辨率降低,即颜色之间的差异变得更加模糊,可能会丢失一些细微的颜色变化
因此,在选择比特深度或颜色量化的参数时,需要根据具体的应用需求和目标来权衡范围和分辨率之间的关系。在某些情况下,可能更注重颜色的准确性和细节,选择较高的分辨率;而在其他情况下,可能更注重颜色的多样性和范围,选择较高的范围。这个权衡决策取决于具体的应用场景和对颜色表示的需求。
- 提高分辨率会降低范围:
1.6 颜色空间和通道
(Colorspaces and channels)
-
通道(channels):颜色模型中的每个组成部分被称为通道。
通道可以被认为是颜色模型中独立的、可调节的元素,它们合作构成了完整的颜色表示。通过在不同通道之间调整数值,可以创建出各种不同的颜色。
-
常见的颜色模型示例:
- RGB,包含3个通道:
R(红色)/ G(绿色)/ B(蓝色) - HSV,包含3个通道:
H(色调hue)/ S(饱和度saturation)/ V(亮度value) - YUV或Y/Cb/Cr,包含3个通道:
Y(亮度luminance)/ U或Cb/ V或Cr(色度chrominance)
- RGB,包含3个通道:
-
在某些颜色模型中,还可以包含一个用于表示透明度的额外通道,通常称为α通道或alpha通道。
α通道存储每个像素的透明度级别,表示像素在图像合成中的不透明度,主要用于图像合成,而不是最终显示。 -
颜色坐标可以通过使用转换公式和相关常数在颜色空间和颜色模型之间进行转换:
1.7 帧大小和色度子采样
(Frame size and chroma sub-sampling)
帧大小:图像或视频帧的尺寸,通常用像素来衡量。它由帧的宽度和高度决定,以像素为单位。较大的帧大小通常表示更高的图像分辨率和更多的细节。
色度子采样:一种用于减少颜色信息的采样率的技术
-
数字图片(尤其是视频)很容易占用大量空间
-
图片的最小大小取决于:
- 尺寸(宽度和高度)
- 每像素的位数(bpp):颜色(和alpha)的深度和未使用的位
粗略计算:宽度 × 高度 × bpp ÷ 8 字节
例如,对于1200万像素、1600万色和alpha通道的图像:4000 × 3000 × 32 ÷ 8 = 45.8MiB
- 对于RGB通道,每个通道使用8位来表示256个不同的强度级别(0-255),因此总共有256 × 256 × 256 = 16777216 种不同的颜色组合,也就是1600万种颜色。
- 此外,还有一个alpha通道,用于表示像素的透明度。同样使用8位(1字节)来表示256个不同的透明度级别。
因此,对于1600万色和alpha通道的图像,每个像素需要32位(4字节)的存储空间。其中,红、绿、蓝三个通道各占用8位,alpha通道占用8位,总共32位或4字节。
-
人类视觉系统具有特殊性:
- 对亮度(亮度,luminosity)具有高度敏感性
- 对颜色(色度,colors)的敏感性较低
-
YUV color model是一种常用的颜色模型,它提供了相关的通道分离功能。
在YUV颜色模型中,通过将色度信息与亮度信息分离,可以实现通道的有效分离和独立处理。这种通道分离的方式使得对图像进行亮度和颜色处理更加灵活和高效。
-
色度子采样可以应用于色度通道,以减少颜色数据(和精度),从而降低图像的大小
- 在色度子采样中,色度通道的样本被用于多个亮度通道的采样。采用特定的垂直和水平比率(通常为整数):
例如,最常见的色度子采样方案之一是4:2:0,其中每个色度样本用于4个相邻的亮度样本。
- 在色度子采样中,色度通道的样本被用于多个亮度通道的采样。采用特定的垂直和水平比率(通常为整数):
在YUV 4:2:0的常见示例中,计算每个像素的位深度如下:
- 对于Y通道(亮度通道),每个像素的位深度为8位(1字节),即bppY = 8。
- 对于U和V通道(色度通道),采用4:2:0的子采样比例。在水平方向上,每4个亮度样本共享1个色度样本;在垂直方向上,每2行共享1个色度样本。因此,每个像素的色度通道位深度为亮度通道位深度的一半,即bppU = bppV = 8 ÷ 2 ÷ 2 = 2。
- 最后,计算每个像素的总位深度(bpp)为所有通道的位深度之和,即bpp = bppY + bppU + bppV = 8 + 2 + 2 = 12位。
因此,在YUV 4:2:0的情况下,每个像素的位深度为12位,相当于每个像素需要12个比特(bits)来表示。这个位深度值可以用来估计图像的存储空间和传输带宽需求。
1.8 像素数据在内存中的分布
(Pixel data distribution in memory)
像素数据可以以不同的方式在内存中分布,有几种不同的方法可以将颜色分量聚合在数据平面 data planes(内存块)中:
- Packed(打包):颜色分量被存储在内存中的同一数据平面中。例如,对于RGB图像,红色、绿色和蓝色分量都被连续地存储在相同的内存块中。
- Semi-planar(半平面)(YUV):亮度(Luma)和色度(Chroma)分量被存储在不同的数据平面中。通常,亮度分量(Y)存储在一个数据平面中,而色度分量(U、V)则存储在另一个数据平面中。
- Planar(平面):每个颜色分量都有自己的数据平面。例如,对于RGB图像,红色、绿色和蓝色分量分别存储在不同的数据平面中。
这些不同的分布方式适用于不同的图像处理需求和应用场景。例如,Packed格式在某些情况下可以提供更紧凑的数据存储和传输形式,而Semi-planar和Planar格式则更适合某些图像压缩编码算法和硬件设备。
在DRM中,像素数据通常以Planar格式存储。这意味着每个颜色分量(如红色、绿色和蓝色)都有自己的数据平面,这些数据平面在内存中是分开存储的。这种分离的存储方式可以提供更灵活的像素数据处理,使得图像处理算法能够独立地操作每个颜色分量。
-
当多个颜色分量被分组时,需要指定位顺序:
位顺序指定了在内存中多个颜色分量的存储顺序。这是非常重要的,因为不同的位顺序可能会导致不同的颜色解释和显示结果。
- 哪个颜色分量在内存中首先存储?
- 当硬件读取时,受字节序(Endianness)的影响
具体的位顺序和字节序选择会受到硬件架构、操作系统和应用程序的影响。在使用多个颜色分量的数据存储时,需要确保所有相关的组件都对位顺序和字节序进行正确的设置和解释,以确保数据的一致性和正确性。
-
扫描顺序(Scan Order)也需要进行指定:
- 如何计算位置(x, y)的地址以及反向计算?
- 光栅顺序(最常见)指定了行主序(row-major)、从左到右、从上到下的顺序。
1.9 像素格式(Pixel formats),FourCC代码
(Pixel formats, FourCC codes)
- 许多元数据元素需要完整描述图像的编码方式:
- 一些描述图像级别的属性 picture-level attributes(如尺寸,dimension):
- 一些描述像素级别的属性 pixel-level attributes(如颜色空间colorspace、位深度bpp)
- 像素级别的属性被分组为像素格式,它定义了以下内容:
- 使用的颜色模型
- 每个通道和每个像素的位数(位深度,bpp)
- 位分配和字节顺序
- 每个通道的子采样比率( sub-sampling ratios)
- 像素数据在内存中的分布方式
- 通常,这些属性被表示为一个称为FourCC的4字符代码。
- 这些属性的标准化程度不高,因而具体实现会有所不同:
在Linux的DRM中,使用XR24表示DRM_FORMAT_XRGB8888,这些属性并没有真正的标准化,但在各种形式下被广泛使用。 - 扫描顺序可以用修饰符单独指定,如果没有指定,则默认为栅格顺序(从左到右,从上到下)。
1.10 量化图像的细节级别
(Level of detail of quantized pictures)
- 取决于许多因素,包括:
- 空间密度(像素分辨率)
- 量化的尺寸(图像宽度和高度 )
- 色域限制(色度图)
- 颜色深度(每个像素的位数 )
- 颜色分辨率和范围的权衡
- 一般而言:
- 有许多因素需要考虑
- 主要的瓶颈并不总是明显的
- 实现选择确实很重要