开启辅助访问
 找回密码
 立即注册

从RGB颜色模型到YUV存储格式

myloyer 回答数0 浏览数483
颜色模型

颜色空间又称为彩色模型,是其目的是使用某些标准方式对彩色加以说明。本质上,彩色模型是坐标系统和子空间的阐述,位于系统的每种颜色都由单个点表示。颜色空间从提出到目前已经有上百种,大部分只是局部改变或专用于某一领域,视频压缩中常用的颜色模型有RGB、YUV、YCbC。
RGB颜色模型

参考资料: https://zhuanlan.zhihu.com/p/93398878
一台图像可以视作一台二维矩阵。如果将色彩考虑进来,我们可以做出推广:将这个图像视作一台三维矩阵——多出来的维度用于储存色彩信息。如果我们选择三原色(红、绿、蓝)代表这些色彩,这就定义了三个平面:第一台是红色平面,第二个是绿色平面,最后一台是蓝色平面。

我们把这个矩阵里的每一台点称为像素(图像元素)。像素的色彩由三原色的强度(通常用数值表示)表示。例如,一台红色像素是指强度为 0 的绿色,强度为 0 的蓝色和强度最大的红色。粉色像素可以通过三种颜色的组合表示。如果规定强度的取值范围是 0 到 255,红色 255、绿色 192、蓝色 203 则表示粉色。
例如以下几张图片。第一张包含所有颜色平面。剩下的分别是红、绿、蓝色平面(显示为灰调)(译注:颜色强度高的地方显示为亮色,强度低为暗色)

我们可以看到,对于最终的成像,红色平面对强度的贡献更多(三个平面最亮的是红色平面),蓝色平面(最后一张图片)的贡献大多只在马里奥的眼睛和他衣服的一部分。所有颜色平面对马里奥的胡子(最暗的部分)均贡献较少。
存储颜色的强度,需要占用一定大小的数据空间,这个大小被称为颜色深度。假如每个颜色(平面)的强度占用 8 bit(取值范围为 0 到 255),那么颜色深度就是 24(8*3)bit,我们还可以推导出我们可以使用 2 的 24 次方种不同的颜色。
图片的另一台属性是分辨率,即一台平面内像素的数量。通常表示成宽*高,例如下面这张 4x4 的图片。图像或视频还有一台属性是宽高比,它简单地描述了图像或像素的宽度和高度之间的比例关系。当人们说这个影片或照片是 16:9 时,通常是指显示宽高比(DAR),然而我们也可以有不同形状的单个像素,我们称为像素宽高比(PAR)。
RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,可表示大部分颜色。RGB颜色空间是图像处理中最基本、最常用、面向硬件的颜色空间。我们采集得到的彩色图像,一般是被分成R、G、B的成分加以保存的,彩色监视器的显示系统也基于该颜色空间。采用RGB颜色空间表示视频时,其每个像素用三个分量表示,即R、G、B三个色度值。需要注意的是,RGB 颜色空间的分量与亮度密切相关,即只要亮度改变,3个分量都会随之相应地改变。在VGA驱动显示中我们也了解到常用的 RGB 格式有三种,分别是RGB323、RGB565、RGB888

目前我们来了解一张RGB格式的图像大小,以一张 1280 * 720 分辨率的图像为例,其像素个数有 1280 * 720 = 921600 。如果采用 RGB888 格式编码,其每个像素就有 24 bit 大小。故该张图像就有 1280 * 720 *24 bit 大小。故该图像占用的存储空间大小为 1280 *720 *24 / 8 / 1024 / 1024 = 2.64MB。(存储单元单位换算,MB:兆字节)
接下来我们可以将视频定义为在单位时间内连续的 n 帧,这可以视作一台新的维度,n 即为帧率,若单位时间为秒,则等同于 FPS (每秒帧数 Frames Per Second)。

播放一段视频每秒所需的数据量就是它的比特率(即常说的码率,单位为bps)。比特率 = 宽 * 高 * 颜色深度 * 帧每秒。例如,一段每秒 30 帧,每像素 24 bits,分辨率是 480x240 的视频,如果我们不做任何压缩,它将需要 82,944,000 (30x480x240x24) 比特每秒或 82.944 Mbps(不同于前面的MB)。
当比特率几乎恒定时称为恒定比特率(CBR);但它也可以变化,称为可变比特率(VBR)
YUV和YCbCr颜色模型

YUV颜色空间主要用于优化彩色视频信号的传输,并使其向后兼容老式黑白电视机。其中Y表示明亮度,也就是灰阶值;而U和V表示的是色度,用于指定像素的颜色。亮度Y是通过RGB输入信号来建立的,方法是将RGB信号按特定比例叠加到一起。色度U反映的是RGB输入信号蓝色部分与信号亮度值之间的差异,色度V反映了RGB输入信号红色部分与信号亮度值之间的差异。YUV色彩空间的重要特征是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视机采用YUV空间正是为了用亮度信号Y解决彩色电视机机与黑白电视机机的兼容问题,使黑白电视机机也能接收彩色电视机信号。Y’UV也是经常使用的颜色空间,其原理与YUV相同,其中Y’为Y经过伽马校正后的值。

YCbCr颜色空间与YUV颜色空间类似,其中Y表示明亮度,Cb表示RGB输入信号蓝色部分与信号亮度值之间的差异,Cr表示RGB输入信号红色部分与信号亮度值之间的差异。YUV颜色空间过去用于表示电视机系统中向后兼容的模拟彩色信息,而YCbCr颜色空间则主要应用于图像、视频压缩的数字彩色信息表示,是YUV压缩和偏移的版本。然而,目前YUV颜色空间也常用于数字彩色信息的表示,此时其与YCbCr相同。YCbCr颜色空间是数字视频压缩源的主要表示形式。(下述分析中YUV和YCbCr可等价,)YCbCr与RGB(8比特量化深度)相互转换的公式为
标准BT.601  
Y =0.299 * R + 0.587 * G + 0.114 * B
U =-0.169 * R - 0.331 * G + 0.499 * B
V = 0.499 * R - 0.439 * G - 0.081 * B
R = Y + 1.402 * (V - 128)
G = Y -  0.344 * (U - 128) - 0.714 * (V-128)
V = Y - 1.772 * (U - 128)
在使用MATLAB提取YUV图像数据的时候,对于亮度分量Y即灰度图像可以正常显示,而对于色度分量U和V是无法正常显示的,这是因为matlab对像素显示是按照灰度级来显示的,显示结果都是灰度图像。如果需要显示彩色图像则需要将YUV模型转化为RGB模型。具体转化公式可参考上述资料。在使用MATLAB转化的过程中,还有一台问题的只有YUV444格式的能够正常转化,像YUV420格式的无法转换,这是由于U、V分量的矩阵大小和Y分量是不同的,故MATLAB会报错。必须将YUV420格式转化为YUV444格式后再利用公式转换。

色度子采样

参考资料:
总体框架:https://zhuanlan.zhihu.com/p/75735751
采样方式:https://www.cnblogs.com/Youhei/p/5245634.html
https://cloud.tencent.com/developer/article/1442041
一旦我们能从图像中分离出亮度和色度,我们就可以利用人类视觉系统对亮度比色度更敏感的特点,选择性地剔除信息。这意味着我们对色度信号的采样率可以比亮度信号低,即相邻几个像素点可以共用相同的色度值。色度亚采样就利用人类视觉的这一特性来达到数据压缩的目的,从而衍生出多种YCbCr采样格式,如4:4:4、4:2:2、4:1:1和4:2:0。下图中黑点表示采样像素点Y分量, 空心圆表示采样像素点的UV分量。

YUV4:4:4   

YUV 4:4:4 表示 Y、U、V 三分量采样率相同,即每个像素的三分量信息完整,都是 8bit,每个像素占用 3 个字节。下图给出了ITU-R BT.601中4:4:4采样格式的位置示意。在每个像素位置,都有Y、U和V分量,即不论水平或是垂直方向,每4个亮度样本都对应有4个U和4个V色度样本。在这种格式中,色度分量和亮度分量具有相同的空间分辨率,这种格式适用于视频源设备和高质量视频信号处理。

其中,Y 分量用叉表示,UV 分量用圆圈表示。
举个例子 :
假设像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
那么采样的码流为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
最后映射出的像素点为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]可以看到这种采样方式与 RGB 图像大小是一样的,并没有达到节省带宽的目的,当将 RGB 图像转换为 YUV 图像时,也是先转换为 YUV 4:4:4 采样的图像。
YUV4:2:2

YUV 4:2:2 表示 UV 分量的采样率是 Y 分量的一半。下图给出了BT.601中定义的4:2:2采样格式的位置示意。在水平方向上,每两个Y样本有1个U和1个V样本。显示图像时,对于没有U和V的样本,使用前后相邻的U和V样本进行计算得到。在这种格式中,色度分量和亮度分量具有同样的垂直分辨率,但前者的水平分辨率仅为后者的一半。在BT.601中,这是彩色电视机的标准格式。

其中,Y 分量用叉表示,UV 分量用圆圈表示。
举个例子
假如图像像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
采样的码流为: Y0 U0 Y1 V1 Y2 U2 Y3 U3
映射出的像素点为:[Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]其中,每采样一台像素点,都会采样其 Y 分量,而 U、V 分量都会间隔采集一台,映射为像素点时,或是要满足每个像素点有 Y、U、V 三个分量。但是可以看到,第一和第二像素点公用了 U0、V1 分量,第三和第四个像素点公用了 U2、V3 分量,这样就节省了图像空间。
比如一张 1920 * 1280 大小的图片,采用 YUV 4:2:2 采样时的大小为:
(1920 * 1280 * 8 + 1920 * 1280 * 0.5 * 8 * 2 ) / 8 / 1024 / 1024 = 4.68M
可以看出,比 RGB 节省了三分之一的存储空间。
YUV4:2:0

YUV 4:2:0 并不意味着不采样 V 分量。它指的是对每条扫描线来说,只有一种色度分量以 2:1 的采样率存储,相邻的扫描行存储不同的色度分量。也就是说,如果第一行是 4:2:0,下一行就是 4:0:2,在下一行就是 4:2:0,以此类推。对每个色度分量来说,水平方向和竖直方向的抽样率都是2:1,所以可以说色度的抽样率是4:1。对非压缩的8比特量化的视频来说,每个由2x2个2行2列相邻的像素组成的宏像素需要占用6字节内存

其中,Y 分量用叉表示,UV 分量用圆圈表示。
假设图像像素为:
[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3]
[Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]

采样的码流为:
Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8

映射出的像素点为:
[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7]
[Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]
假设第一行扫描了 U 分量,第二行扫描了 V 分量,那么需要扫描两行才能够组成完整的 UV 分量。

其中,每采样一台像素点,都会采样 Y 分量,而 U、V 分量都会隔行按照 2:1 进行采样。例如一张 1920 * 1280 大小的图片,采用 YUV 4:2:0 采样时的大小为:
(1920 * 1280 * 8 + 1920 * 1280 * 0.25 * 8 * 2 ) / 8 / 1024 / 1024 = 3.51M
相比 RGB,节省了一半的存储空间。
YUV 存储格式

https://cloud.tencent.com/developer/article/1442041
说完了采样,接下来就是如何把采样的数据存储起来。YUV 的存储格式,有两种,planar 平面格式和packed打包模式。
plana平面格式:指先连续存储所有像素点的 Y 分量,然后存储 U 分量,最后是 V 分量。
packed打包模式:指每个像素点的 Y、U、V 分量是连续交替存储的。
根据采样方式和存储格式的不同,就有了多种 YUV 格式。这些格式主要是基于 YUV 4:2:2 和 YUV 4:2:0 采样。
常见的基于 YUV 4:2:2 采样的格式如下表:

常见的基于 YUV 4:2:0 采样的格式如下表:

基于 YUV 422采样的格式

YUV 4:2:2 采样规定了 Y 和 UV 分量按照 2: 1 的比例采样,两个 Y 分量公用一组 UV 分量。

  • YUYV 格式
YUYV 格式是采用打包格式进行存储的,指每个像素点都采用 Y 分量,但是每隔一台像素采样它的 UV 分量,排列顺序如下:
Y0 UO Y1 V0 Y2 U2 Y3 V2Y0 和 Y1 公用 U0 V0 分量,Y2 和 Y3 公用 U2 V2 分量


  • UYVY 格式
UYVY 格式也是采用打包格式进行存储,它的顺序和 YUYV 相反,先采用 U 分量再采样 Y 分量,排列顺序如下:
U0 Y0 V0 Y1 U2 Y2 V2 Y3Y0 和 Y1 公用 U0 V0 分量,Y2 和 Y3 公用 U2 V2 分量
根据 UV 和 Y 的顺序还有其他格式,比如,YVYU 格式,VYUY 格式等等,原理大致一样了。  


  • YUV 422P 格式
YUV 422P 格式,又叫做 I422,采用的是平面格式进行存储,先存储所有的 Y 分量,再存储所有的 U 分量,再存储所有的 V 分量。
基于 YUV 420 采样的格式

基于 YUV 4:2:0 采样的格式主要有 YUV 420P 和 YUV 420SP 两种类型,每个类型又对应其他具体格式(见上表)
YUV 420P 和 YUV 420SP 都是基于 Planar 平面模式 进行存储的,先存储所有的 Y 分量后, YUV420P 类型就会先存储所有的 U 分量或者 V 分量,而 YUV420SP 则是按照 UV 或者 VU 的交替顺序进行存储了,具体查看看下图:
YUV420P 的格式:

YUV420SP 的格式:

YU12 和 YV12 格式
YU12 和 YV12 格式都属于 YUV 420P 类型,即先存储 Y 分量,再存储 U、V 分量,区别在于:YU12 是先 Y 再 U 后 V,而 YV12 是先 Y 再 V 后 U 。
YV 12 的存储格式如下图所示:

YU 12 又称作 I420 格式,它的存储格式就是把 V 和 U 反过来
NV12 和 NV21 格式
NV12 和 NV21 格式都属于 YUV420SP 类型。它也是先存储了 Y 分量,但接下来并不是再存储所有的 U 或者 V 分量,而是把 UV 分量交替连续存储。
NV12 是 IOS 中有的模式,它的存储顺序是先存 Y 分量,再 UV 进行交替存储。

NV21 是安卓中有的模式,它的存储顺序是先存 Y 分量,在 VU 交替存储。
使用道具 举报
| 未知
当贝投影