YUV颜色空间概述

204 阅读7分钟

RGB色彩空间

RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是运用最广的颜色系统之一。

image.png

RGB通常使用8bit来表示一个颜色的色值,对于一个像素来说需要需要24bit来表,那么我们通常遇到的1280X720拍摄的照片对应的大小就是1280X720X3/1024/1024=2.6M左右。我们在日常的生活中还会讨论关于颜色位深的话题,这里的位深就是用几个bit来表示一个颜色值,通常有用8bit和10bit来表示颜色值,它们对应可以表示的颜色范围是不一样的,那么表现的颜色细腻度就有所产别了。

什么是YUV

官方解释

如果要了解什么是YUV,先了解两个概念,一个是luminance 亮度,一个是chrominance 色度。在很久很久以前我们的科学家就发现人们对于亮度的感知能力要比颜色的感知能力要强很多,如果没有亮度只有色度,那么人看到的都是漆黑一片。通过这个原理我们可以在存储色度信息的时候减少这部分数据,因为人们对于亮度信息比较敏感,色度信息并不是那么的敏感,减少部分色度信息的数据人眼不会感知到。所以就设计出了YUV这样的颜色编码技术。

Y’UV、YUV、YCbCr、YPbPr 这几种类型的概念其实都是YUV的范畴,只是在不同的历史时期提出来。这里的Y"UV和YUV都是在彩色电视上使用的,主要是针对模拟信号。YCbCr主要是应用在视频、图片压缩和传输上。现在我们通常说的YUV其实更多的就是指YCbCr,这里的Y就是表示亮度-luma,CbCr就是表示色度-chroma

为什么存在

任何一种概念的存在都是为了解决某个或者某些问题,YUV同样也是为了解决视频领域的相关问题,那么具体解决了哪些问题呢?我们可以从一下几个方面来分析。

解决兼容性问题。在黑白电视机时代,我们看到的电视视频效果都是黑白的,对于只有黑白效果的视频只需要有Y分量的数据就可以,这样就很好的解决了使用在彩色电视上的视频数据可以直接在黑白电视上使用。

解决视频数据量较大的问题。我们可以简单的将视频理解为一张张的图片切换后产生的效果,那么我们解决视频大小的问题就转移到解决图片大小。我们可以回到RGB色彩编码中,如果一张图片是使用RGB进行编码的,那么我们可以无限放大这张图片,最终这张图片就会看到每个像素点的颜色值。可以观察下面的图片,这张图片其实是一张黑白图片。如果我们直接使用RGB三原色进行数据存储会有大量的冗余数据,其实我们只需要一个Y分量来表达就可以了。针对第二张彩色图片,我们可以无限的放大,放大以后枫叶的局部效果

image.png

image.png

image.png

通过图三可以看出,在局部的像素点位置上我们可以看到部分像素点直接的像素颜色是相近的,没有出现非常大的偏差。针对这样的场景我们是不是可以通过一定的采样率来将数据量减少。以一个4X2的像素区域来进行分析,对应的像素区域如下图所示,

image.png

我们可以针对这八个点进行数据采样,让每相邻的两个像素点使用同一个颜色值,如果这样的采样策略应用到这个图片,那么对应的图片大小就直接减少的1/2的大小。整个图片的效果对于人眼来说还是在可以接受的范围之内,这样就有效的减少的视频的大小。对于这样的采样分别会有不同的采样格式,具体的采样格式我们在下面进行详细的介绍。

YUV的采样格式

前面介绍的关于什么是YUV以及YUV为什么会存在,其中在为什么存在中介绍了关于像素点数据采样的问题,YUV定义了几个比较实用的采样率:

  • YUV 4:4:4 采样
  • YUV 4:2:2 采样
  • YUV 4:2:0 采样

这里的第一个数字代表的是横向像素采样个数,第二个数字代表的是第一行像素的色度采样值,第三个数字代表的是第二行像素的色度采样值。所以这样的一个采样比例是针对一个4X2的矩阵,那么为什么会采用这样的一个形式,在后续分析H264编码的环节会详细介绍。接下来我们详细介绍一下关于这三个不同采样比例,这里我们使用的是J:a:b模式来进行分析。

  1. YUV 4:4:4采样

结合我们前面的介绍,第一个数字就不用介绍了,第二个数字是针对第一行的色度采样,那么色度采样会针对四个像素进行全采样,同样第三个数字就是针对第二行进行全采样,具体的效果图如下所示:

image.png

  1. YUV 4:2:2 采样

同理这个采样针对第一行与第二行都会采样两个像素点的色度信息,其他两个像素点会公用前面两个采样到的数据信息,具体的示意图可以参考如下:

image.png

第一行只采样了第一个和第三个像素点的色度值,第二个和第四个会公用第一个、第三个的色度值

第二行的策略机制和第一行是相同的。

  1. YUV 4:2:0 采样

通过前面两个的分析,这里的采样比较就更加清晰了,只是从第一行采样两个像素点的色度信息,然后其他位置的像素都会公用这里采样的色度信息,具体的效果示意图如下所示:

image.png

这里比较清晰的看到,在第一行里面,我们采样了第一个、第三个像素点的色度信息,第二行并没有采样任何像素点的色度信息,都是复用了第一行采样的色度信息,所以这里的0就是没有采样任何数据的意思。

YUV存储

前面只是介绍了关于YUV数据采样的相关内容,数据采样结束就涉及到数据存储的问题,对于YUV的数据存储格式通常分为两种方式:

  • planner 平面模式:连续存储不同分量的数据,根据YUV的顺序进行连续存储,类似Y Y Y Y U U U V V V
  • packed 打包模式:分别将不同分量数据进行交替存储,类似Y U V Y U V

根据不同的采样方式和打包方式就会衍生出不同的YUV格式,这里我们着重介绍一下关于 YUV 4:2:0采样 YUV420SP类型的NV21格式。YUV 420P 和 YUV 420SP 都是基于 Planar 平面模式 进行存储的,先存储所有的 Y 分量后, YUV420P 类型就会先存储所有的 U 分量或者 V 分量,而 YUV420SP 则是按照 UV 或者 VU 的交替顺序进行存储了。对应的存储示意图如下所示:

YUV420SP:image.png

YUV420P:image.png

对于我们android手机上carmera输出的格式为NV21格式,对于IOS手机中的camara输出的是格式为NV12,它们都是YUV420SP格式的范畴,只是Android是VU进行交替,IOS为UV进行交替。