Multimedia学习_YUV数据格式

YUV数据格式

https://technet.microsoft.com/en-us/subscriptions/dd206750(v=vs.85).aspx

概要:

与RGB编码方法类似,YUV也是一种图像编码方法,主要用于电视系统以及模拟视频领域,它是指将亮度分量(Y:Luminance或Luma)和色度分量(UV:Chrominance或Chroma)分开进行表示的像素编码格式。而这样分开的好处:不但可以避免相互干扰--没有UV信息一样可以显示完整的图像,因而解决了彩色电视与黑白电视的兼容问题;还可以降低色度的采样率而不会对图像质量影响太大,降低了视频信号传输时对频宽(带宽)的要求。针对YUV具体排列方式,可以分为很多种格式

 

YUV格式类别:

  • 打包(packed)格式:将每个像素点的Y,U,V分量交叉排列并以像素点为单元连续的存放在同一数组中,通常几个相邻的像素组成一个宏像素(macro-pixel)
  • 平面(planar)格式:使用三个数组分开连续地存放Y,U,V三个分量,即Y,U,V分别存放在各自的数组中。

 

YUV采样表示:

YUV采用A:B:C表示法来描述Y,U,V采样频率比例,下图中黑点表示采样像素点Y分量,空心圆表示采样像素点的UV分量。

 

  • 4:4:4(32bpp) : 色度频道没有下采样,即一个Y分量对应着一个U分量和一个V分量。

       AYUV

  • 4:2:2(16bpp) : 2:1水平下采样,无垂直下采样,即每两个Y分量共用一个U和V分量。

       YUY2/UYVY

  • 4:2:0(16bpp) : 2:1水平下采样,2:1垂直下采样,即每四个Y分量共用一个U和V分量。

       IMC1/IMC3

  • 4:1:1 (12bpp) : 4:1 水平下采样,无垂直下采样,即每四个Y分量共用一个U分量或一个V分量,与其他格式相比,4:1:1 采样不太常用。

        IMC2/IMC4/YV12/NV12

 

YUV数据存储:

下面以每个分量数据存储在一个char(或byte)中为例描述YUV的数据存储方式, 图中每个方格表示一个char。

  1. 4:4:4格式,每像素32位

     推荐一个4:4:4格式,FOURCC码为:AYUV。这是一个打包格式,其中每个像素都被编码为四个连续字节,其组织顺序如下所示,其中A标示了alpha通道。

  1. 4:2:2格式,每像素16位

    支持两个4:2:2格式,FOURCC码为: YUY2和UYVY。两个都是打包格式,其中每个像素都是编码为四个连续字节的两个像素。这样会使得色度水平下采样乘以系数2。

  • YUY2

     在YUY2格式中,数据可被视为一个不带正负号的char值组成的数组,其中第一个字节存储第一个Y样例,第二个字节存储第一个U (Cb)样例,第三个字节存储第二个Y样例,第四个字节存储第一个V (Cr)样例,如下图。

     如果该图像被看作由两个little-endian WORD值组成的数组,则第一个WORD在最低有效位(LSB) 中包含Y0,在最高有效位(MSB)中包含U0。第二个WORD在LSB中包含Y1,在MSB中包含V0。

  • UYVY

此格式与 YUY2 相同,只是字节顺序是与之相反的。

如果该图像被看作由两个little-endian WORD值组成的数组,则第一个WORD在LSB中包含U0,在MSB中包含Y0,第二个WORD在LSB中包含V0,在MSB中包含Y1。

  1. 4:2:0格式,每像素16位

支持两个4:2:0格式,FOURCC码:IMC1和IMC3。两个FOURCC码都是平面格式。色度分量在水平方向和垂直方向上都要以系数 2 来进行再次采样。

  • IMC1

所有Y样例都会作为不带正负号的char值组成的数组首先存储在内存中。后面跟着存储所有V (Cr)样例,然后是所有U (Cb)样例。V和U平面与Y平面具有相同的跨距(即存储数组的宽度),从而遗留了如下图所示的未使用的内存区域。

  • IMC3

此格式与 IMC1 相同,只是 U 和 V 平面进行了交换。

  1. 4:2:0格式,每像素12位

支持四个4:2:0格式,FOURCC码:IMC2, IMC4, YV12, NV12。在所有这些格式中,色度分量在水平方向和垂直方向上都要以系数 2 来进行再次采样。

  • IMC2

此格式与IMC1相同,只是V (Cr)和U (Cb)行在半跨距边界处进行了交错。换句话说,就是色度区域中的每个完整跨距行都以一行V样例开始,然后是一行在下一个半跨距边界处开始的 U 样例。

 

此布局与 IMC1 相比,IMC2能够更加高效地利用存储空间。它的色度存储空间缩小了一半,因此整体存储空间缩小了25%。在各个4:2:0格式中,IMC2是第二首选格式,排在NV12之后。

  • IMC4

此格式与IMC2相同,只是U (Cb)和V (Cr) 行进行了交换。

  • YV12 (YU12格式和YV12存储格式基本相同,只是UV存储位置互换)

所有Y样例都会作为不带正负号的char值组成的数组首先存储在内存中。此数组后面紧接着存储所有V (Cr) 样例。V平面的跨距为Y平面跨距的一半,V平面包含的行为Y平面包含行的一半。V 平面后面紧接着存储所有U (Cb) 样例,它的跨距和行数与V平面相同。

  • NV12(NV21格式和NV12存储格式基本相同,只是UV存储位置互换)

所有 Y 样例都会作为由不带正负号的 char 值组成的数组首先存储在内存中,并且行数为偶数。Y 平面后面紧接着一个由不带正负号的 char 值组成的数组,其中包含了打包的 U (Cb) 和 V (Cr) 样例。

当组合的U-V数组被视为一个由 little-endian WORD 值组成的数组时,LSB 包含U值,MSB包含 V 值。NV12是用于DirectX VA的首选4:2:0像素格式

 

YUV数据转换:

  1. 4:2:2 -> 4:2:0的有损压缩转换

Y存储数据不变,对U和V分量在行垂直下采样进行隔行抽样。

  1. 4:2:0 -> 4:2:2的补足转换

Y存储数据不变,对U和V分量在行垂直下采样进行隔行拷贝补足下一行色度数据。

在YUV中,一个像素点对应一个Y分量,同一图像无论是4:4:4, 4:2:2, 4:2:0, 4:1:1的格式,其中Y分量数据都是完全相同的。YUV420sp和YUV420p的数据存储格式区别在于UV分量排列的顺序不同,YUV420p是先存储完U分量后再存储V分量,也就是说UV分量各自都是连续的,而YUV420sp则交叉存储UV分量,因此一个YUV420图片的存储空间为:

Y分量 = width * hight

U分量 = Y / 4

V分量 = Y / 4

YUV420图像存储空间 = width * hight * 3 / 2

例如一张分辨率为8X4的YUV420图像,数据存储格式如下图:

YUV420sp格式

YUV420p格式

 

RGB to YUVbt.2020

L=Kr*R+Kb*B+1-Kr-Kb*G,  Kr=0.2627, Kb=0.0593

Y =                   floor(2^(M-8) * (219*(L-Z)/S + 16) + 0.5)

U = clip3(0, (2^M)-1, floor(2^(M-8) * (112*(B-L) / ((1-Kb)*S) + 128) + 0.5))

V = clip3(0, (2^M)-1, floor(2^(M-8) * (112*(R-L) / ((1-Kr)*S) + 128) + 0.5))

clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))

M表示每个像素用几位表示

Z表示黑点值,即0

S表示采样值,即255