最近在学习研究视频直播技术,接触到了视频编码H.264,进而接触到了YUV图像格式。在网上搜索了一些资料后对YUV有了一个大概了的了解,但觉网络上其他文章的讲解又不够透彻。一是为了巩固自己对YUV的认识,二是希望能给后来想了解YUV像素编码格式的人提供一点帮助,所以编写此文。
本文内容是鄙人结合网络上的内容和自己的理解编写的。由于很多东西都是本人的私货,不免有错误的认识,如果您在阅读时发现错误之处还望谅解,也希望您能指出,我将及时更新文章,避免给后人带来误导。
YUV是一种像素信息的编码方式。在现代生活中我们会接触大量的数字图像显示设备(电视,手机屏幕)和数字图像采集设备(监控器,数码相机,手机相机)。显示设备需要从存储介质(硬盘,U盘,光盘)或网络上获取图像信息进行显示,图像采集设备需要将采集的图像保存到存储介质或上传到网络上。这些设备播放和采集图像的基本单位是像素。可以将像素理解成大型方阵表演中的每一个人,每个人可以穿不一样颜色的衣服和举不同的色牌。方队指挥员通过调整每个人的颜色,便可以使方阵显示不同的图案,如果快速变换图案就会形成动态的视频效果。
无规矩不方圆,如果每个厂商都以自己的方式编码像素信息,那么势必导致各种图像设备相互之间不能兼容,所以需要统一像素信息编码。但在不同领域当中对像素信息需求也是不同的,所以在不同的领域又需要使用不同的编码方式。比如对于图像美化设备或软件,需要精确和丰富的图像信息比如颜色信息,亮度信息,透明度信息等等。所以在图像美化设备和处理软件中通常使用RGBA像素信息编码方式。RGBA保存的像素信息丰富必然导致图像文件大,不利于传播(想想硬盘的价格和手机流量的价格)
但是对于纯粹的视频播放领域就不需要那么丰富的像素信息了,只要需要图像的亮度和色彩信息就足够了,因为不需要像素间叠加计算所以不就需要透明度信息了。并且通过对人眼生理结构的研究发现,眼睛对亮度的敏感度要比对颜色的敏感度高一些,这是因为视网膜上感应亮度的视网膜干细胞的数量要多余感应色彩视网膜锥细胞。所以在显示图像时只需要精细的亮度信息和粗略的色彩信息就能满足眼睛的需求。所以在播放和传播领域就需要一种可以将亮度信息和色彩信息分别保存的像素编码方式--YUV。
YUC中的Y代表的是亮度信号,亮度信号又可以称之为灰度信息。经历过黑白电视机时代的人应该知道黑白电视只能显示不带颜色的图像即灰度图像,这是因为黑白电视只能接受Y信号。如果您比较年轻没有看过黑白电视,那您可以想象一下水墨画,可以认为水墨画中只包含Y信号。
UV合起来表示色彩信号。有一种UV表示色彩信号的方式称为CbCr。U=Cb表示当前颜色对蓝色的偏移;V=Cr表示当前颜色对红色的偏移,见下图
图片来自网络
所以YUV其实就是用Y,U,V三个分量来保存一个像素的显示(亮度和色彩)信息。
由于YUV格式的是将亮度和色彩信息分离存储,在黑白电视和彩色电视共存的年代,可以用YUV同时兼容两种电视机。下图即为YUV图像分别只显示Y,U,V信息时的效果
图片来自网络
这部分是我感觉在网上其他文总中最难理解的部分,大多数作者都是直接介绍YUV的几种采样方式,但如果您不明白什么是“采样”,读懂它是很困难的。
首先介绍一下什么是“YUV采样”,如果您对数字音频视频毫无了解,也许对您来所更容易理解“YUV采样”。因为“采样”这个词在数字音频视频处理中有着专门的含义,它表示将模拟信号转换成数字信号的过程。而这里说的“YUV采样”完全说的不是这个意思事儿。那么“YUV采样”指的是什么呢?
其实它是指从全量的图像信息中提取部分信息的过程。在图像采集的时候采集设备会最大限度采集高质量的图片,比如现在数码相机拍一张照片都在5-10M大小之间。但在网络上传播图片时其中很多信息是可以舍弃的,并且舍弃后并不影响我们观看的效果,比如可以将其中的亮度信息(Y)全部保留,还记得前面对人眼的介绍嘛?从全量的图像信息中删除部分色彩信息的过程就叫做“YUV采样”。下面举例说明,下图表示我们用数码相机拍色的照片的16个像素点,每个像素点都包含全量的YUV信息
YUV4:4:4采样表示全量保留像素信息,所以采样完的结果是
YUV4:2:2采样表示在一行内每保留4个Y信息,分别保留两个U信息和两个V信息,所以采样完结果是。
当然YUV4:2:2并没有规定具体保留哪个像素中的U和哪个像素中的V,只要保证YUV的比例是4:2:2就可以了。所以采样结果也可以如下
那具体应该怎么采样呢?这在不同的协议里有不同的规则,但最终要保证采样后再显示的图像可以让人眼接受即可。也可以通过计算4个像素中的U 和 V的平均值来确定采样后U和V的值。
YUV4:2:0并不是表示完全抛弃V信息,而是间隔地保留UV信息,即保留4个Y信息,保留2个U或V信息。我这里以一行保留U一行保留V为例,采样结果如下
关于YUV众多存储格式暂时就不一一介绍了,在微软提供的一篇文档里有详细介绍。
https://msdn.microsoft.com/en-us/library/aa904813(VS.80).aspx
感觉介绍的比较好的文章
http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html