像素数据YUV简介与数据存储格式介绍

主要学习链接:博客园51CTO

前言

照例是先废话几句,下面的内容都是在学习时从网上找来的,并非我原创,我之所以要写这篇笔记是因为网的内容都很分散,找的时候要从各个地方看,很不方便,所以就自己总结了一篇,同样的,如果你搜到了这篇文章且有地方没看懂,请评论让我知道,谢谢!如果看懂了且对你有帮助可以点个赞:)

认识YUV

以下我的理解,因为学习时间不久,可能不一定准确:

YUVRGB一样,都是像素数据的编码格式,一组YUV渲染屏幕上的一个像素,控制屏幕用色彩的形式将事物表现出来,其中Y表示像素中的亮度,英文是LuminanceU表示色度,英文是ChrominanceV表示浓度或饱和度,英文是Chroma。这是一种压缩后的颜色表示方法,占用更少的物理空间,且对颜色的表现失真不明显,所以现在非常常用,我见过的很多视频在播放时都是使用这种形式展现的。

YUV的宏观存储方式

在宏观上,YUV有两种存储方式:planarpacked

planar:从字面意思上来看,planar是平面的意思,平面比较平整,对应到存储方式上就是把YUV三种分量分别存储,以I420为例,存储方式为:YYYYYYYYUUVV,简单明了,先把Y存完,再存U,再存V,这种在解析时很方便

packed:从字面意思来看,packed是打包的意思,打包就不一定是平整的了,对应到存储方式上就是把YUV三种分量交叉存储,以YUY2为例,存储方式为:Y0U0Y1V0 Y2U1Y3V1,这种方式在解析时就会比较麻烦

上面只是举了两个觉的例子,事实上还有很多其它的格式,后面一一细讲。

采样方式

采样方式即如何表现一个像素,现在主流的有三种采样方式,444422420,这三种比例是YUV三种分量的比例,咱们前面说过像素是用YUV三个分量控制显示的,所以一个像素应该包含一个Y,一个U,一个V,如果要完全存储,那一个一个像素点就要存储YUV三个分量,这种形式就是444了。但是因为人的眼睛对色度和饱和度不是特别敏感,所以一定程度上丢失一部分UV并不影响我们分辨颜色,所以聪明的先驱们为了节省存储空间,在存储时就故意丢掉部分UV分量,用两个Y分量共用一组UV分量,这种形式就是422,或用四个Y分量共用一组UV,这种形式就是420了。用网上找的图表示比较形象。

下图中以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量

 

在存储时YUV各占一个字节Byte,如果444方式,那一个256X256分辨率的图片要占用256×256×3=196608Byte422方式要占用256×256×2=131072Byte420方式要占用256×256×2/3=98304Byte,可以看到采用420方式存储空间整整减少了一半。

常见存储格式

YU12/I420

该格式属于420类型,存储方式上面已经说过,就是先存储把全部的Y分量存完,再存U分量,最后存V分量,从网上找了一张很形象的图:

可以看到,第一行的Y1Y2和第二行的Y7Y8共同使用一组UV分量U1V1

YV12

该格式与YU12基本一样,唯一的区别是先存储V分量再存储U分量,对应到上图把第五行和第六行位置互换一下就是了。

以上两种格式我们可以看到都是420的,因为都是planar方式存储,简称420p

除了上面两种,还有两种420NV12NV21,这两种是比较特殊的存储格式,是planarpacked混合存储的,分别看下

NV12

该格式是先存储全部的Y分量,然后UV分量交叉存储,用图像表示下:

 

很直观,不多说了。

NV21

该格式与NV21的区别和上面YU12/YV12一样,唯一的区别只是UV分量交叉的顺序不同,NV12U排前面,NV21V排前面,用图像表示如下:

 

上面两种虽然也是420类型,但是并不是完全的planar格式,所以又称为420sp,与420p进行区分。

上面说的都是420类型的,下面说几个422类型较常见的

YUV422P

名字中带P表示是planar格式存储,该格式存储方式与I420是一样的,唯一的区别是UV分量的数量不同,I420中四个Y共用一组UV,而该格式中两个Y共用一组UV,也就是说UV分量相对于I420在数量上多了一倍,从网上找了一张图,如下:

 

如上图,在渲染时Y00Y01会共用U00V00.

YUYV/YUY2

该格式属于422类型,且是用packed形式存储的,上面也简单的说过,存储方式如下图:

 

可以看到,每两个Y分量共用一组UV分量,存储顺序是YUYV

YVYU

该格式与YUYV相似,只是存储时UV分量顺序不同而已,为YVYU

UYVY

该格式也是422类型,与上面两种方式并无大的不同,从网上找了一张图如下:

 

 可以看到存储时YUV分量的顺序如名字所示:UYVY

结语

上面是比较常见的存储格式,除了这些还有其它的,但是我个人查找资料看来,用的并不多,所以就没记录。

posted @ 2019-04-25 11:54  愉快编程  阅读(5363)  评论(2编辑  收藏  举报