先贴一个好贴:https://www.cnblogs.com/ALittleDust/p/5935983.html
YUV
YUV是一种颜色空间,基于YUV的颜色编码是流媒体的常用编码方式。Y表示流明,U、V表示色度、浓度,这种表达方式起初是为了彩色电视与黑白电视之间的信号兼容。 对于图像每一点,Y确定其亮度,UV确认其彩度。
Y’CbCr也称为YUV,是YUV的压缩版本,不同之处在于Y’CbCr用于数字图像领域,YUV用于模拟信号领域,MPEG、DVD、摄像机中常说的YUV其实是Y’CbCr,二者转换为RGBA的转换矩阵是不同的。Y’为亮度,Cb、Cr分量代表当前颜色对蓝色和红色的偏移程度。
Y’=0.5时,Cb、Cr构成的颜色平面
如果输出Y’CbCr三个分量的值,那么会是这样的。
由上到下依次为Y’、Cb、Cr
为了方便,以下文中YUV特指Y’CbCr。
YUV颜色编码的作用
YUV编码是image/video pipeline的重要组成。比如常用的I420相对于RGB24(RGB三个分量各8个字节)的编码格式,只需要一半的存储容量。在流数据传输时降低了带宽压力。
YUV颜色编码在video pipeline中的运用
YUV颜色编码格式
YUV色彩编码格式由其色度抽样方式和存储方式决定。
YUV 采样
对光信号采样是把光由模拟信号变为数字信号,这不是我们要做的事,我们要做的是把射线透照产生的模拟图像变为数字图像,两者不是一码事。所以不应该对光信号谈采样定理。
对图像的采样,是把模拟图像变成数字图像,描述模拟图像的是连续的信息,但要把它变成离散的信息,
YUV采样
YUV的一个优点是色度通道可以具有比Y通道更低的采样率而不会显着降低感知质量。 称为A:B:C表示法的符号用于描述U和V相对于Y的采样频率:
- 4:4:4表示没有色度通道的下采样。
- 4:2:2表示2:1水平下采样,没有垂直下采样。 对于每两个U或V样本,每条扫描线包含四个Y样本。
- 4:2:0表示2:1水平下采样,2:1垂直下采样。
- 4:1:1表示4:1水平下采样,没有垂直下采样。 每个扫描线包含每个U或V样本的四个Y样本。 4:1:1采样不如其他格式常见,本文不再详细讨论。
图1显示了4:4:4图片中使用的采样网格。 Luma样本由十字表示,色度样本由圆表示。
Figure 1 展示了 4:4:4 格式的图片所用的采样网格. Luma samples are represented by a cross, and chroma samples are represented by a circle.(亮度信息是X,色度信息是O)
Figure 1. YUV 4:4:4 sample positions
4:2:2采样的主要形式在ITU-R建议书BT.601中定义。 Figure 2 shows the sampling grid defined by this standard.
Figure 2. YUV 4:2:2 sample positions
有两种常见的4:2:0采样变体。 其中一个用于MPEG-2视频,另一个用于MPEG-1和ITU-T建议H.261和H.263。 图3显示了MPEG-1方案中使用的采样网格,图4显示了MPEG-2方案中使用的采样网格。(视频使用的采样网格,就是视频中每一帧(一张图片)的采样网格)
Figure 3. YUV 4:2:0 sample positions (MPEG-1 scheme)
Figure 4. YUV 4:2:0 sample positions (MPEG-2 scheme)
与MPEG-1方案相比,在MPEG-2方案和为4:2:2和4:4:4格式定义的采样网格之间进行转换更为简单。 因此,MPEG-2方案在Windows中是首选,应被视为4:2:0格式的默认解释。
先记住下面这段话,以后提取每个像素的YUV分量会用到。
(每一个像素对应一个Y)
- YUV 4:4:4采样,每一个Y对应一组UV分量。(每个像素对应一组UV)
- YUV 4:2:2采样,每两个Y共用一组UV分量。 (两个像素共用一组UV)
- YUV 4:2:0采样,每四个Y共用一组UV分量(专指12bit/pixel的格式)。(四个像素共用一组UV)
4:2:0采样还有每四个Y共用2组UV分量(为16bit[pixel的格式)
YUV存储方式
宏像素(macropixel):一组包含了若干个亮度,色度(可能还有透明度)的数据组。有可能一个像素对应一个宏像素,也有可能几个像素共用一个宏像素
YUV存储像素信息有两种格式:
packed:Y,U,V的信息存储在同一个存储平面中(或者其中的两个存储在同一数组中),像素被组织成一组宏像素,,布局取决于格式
planar:Y,U,V 被存储为3个不同平面里
简而言之:packed就是宏像素混合存储,planar就是每种宏像素分开存储
存储平面(surface):一个抽象的平面表示了像素存储的方式,其中的单位是一个宏像素
原点:屏幕左上角
步幅stride:存储平面的宽度,始终为正
对齐:surface字对齐
4:4:4 格式, 32 Bits per Pixel
单个4:4:4格式,使用FOURCC代码AYUV。 这是一种打包格式,其中每个像素被编码为四个连续字节,按以下顺序排列。(每个像素对应一个宏像素,如像素p0对应宏像素 V0U0Y0A0)
Figure 5. AYUV memory layout
标为A的字节代表透明度
4:2:2 Formats, 16 Bits per Pixel
两种 4:2:2 格式, 编码方式如下:
- YUY2
- UYVY
都是packed格式, 其中每个宏像素用于两个像素,编码为四个连续的字节。 这导致色度的水平下采样两倍。
YUY2
在YUY2格式中,数据可以被视为无符号字符值的数组,其中第一个字节包含第一个Y样本,第二个字节包含第一个U(Cb)样本,第三个字节包含第二个Y样本,以及 第四个字节包含第一个V(Cr)样本,如图6(每两个像素对应一个宏像素,如像素p0,p1对应宏像素 Y0U0Y1V0, 第一个像素的显示信息为Y0U0V0,第二个像素的显示信息为Y1U0V0。相当于32个bit存储了2像素的信息,就叫做每个像素16bit,但实际上每个像素的完整信息仍需要12bit,只是其中8bit与另一个共用)
Figure 6. YUY2 memory layout
如果图像被放置为两个小端WORD值的数组,则第一个WORD在最低有效位(LSB)中包含Y0,在最高有效位(MSB)中包含U. 第二个WORD在LSB中包含Y1,在MSB中包含V.
YUY2是MicrosoftDirectX®视频加速(DirectX VA)的首选4:2:2像素格式。 预计这将是支持4:2:2视频的DirectX VA加速器的中期要求。
UYVY
这种格式与YUY2相同,只是字节顺序颠倒了 - 也就是说,色度和亮度字节被翻转(图7)。 如果图像被寻址为两个小端WORD值的数组,则第一个WORD在LSB中包含U,在MSB中包含Y0,第二个WORD在LSB中包含V,在MSB中包含Y1。(每两个像素对应一个宏像素,如像素p0,p1对应宏像素 Y0U0Y1V0, 第一个像素的显示信息为Y0U0V0,第二个像素的显示信息为Y1U0V0)
Figure 7. UYVY memory layout
4:2:0 Formats, 16 Bits per Pixel
两种4:2:0 格式,16位/像素,编码方式如下:
- IMC1
- IMC3
这两种都是planar格式. 色度通道在水平和垂直维度上次采样系数为2
IMC1
所有的Y首先在内存中存储, 就像一个无符号 char 值类型的数组. 紧接着是 V (Cr) 样本, 然后是U (Cb) 样本. V 和 U 平面的宽度和Y平面的宽度一样, 所以会导致一些没有用到的内存, 如图8. (4个像素对应一个宏像素, p0,p1,p2,p3对应 Y0Y1Y2Y3V0V1U0U1,p0的显示信息为Y0V0U0,p1的显示信息为Y1V0U0,p2的显示信息为Y2V1U1,p3的显示信息为Y3V1U1,U,V可能不是这么安排的。每个像素对应一个Y,对应一种U,V的组合,4个像素分别用各自的亮度信息,共用4个色度信息,平均每个像素使用16bit)
Figure 8. IMC1 memory layout
IMC3
此格式与IMC1相同,但U和V平面交换次序:
Figure 9. IMC3 memory layout
4:2:0 Formats, 12 Bits per Pixel
4种 4:2:0 12bit/pixel 格式 ,存储方式如下(4个像素用4个Y,1个U,一个V)
- IMC2
- IMC4
- YV12
- NV12
在这些所有格式中,色度通道在水平和垂直维度上次采样系数为2
IMC2
该格式与IMC1相同,除了V(Cr)和U(Cb)线在半步边界处交错。 换句话说,色度区域中的每个全步幅线以一行V样本开始,接着从下一个半步幅边界开始是一行U样本,(图10)。 这种布局比IMC1更有效地使用地址空间。 它将色度地址空间减半,因此总地址空间减少了25%。 在4:2:0格式中,IMC2是仅次于NV12的第二好的格式。
Figure 10. IMC2 memory layout
IMC4
此格式与IMC2相同,但U(Cb)和V(Cr)行交换:
Figure 11. IMC4 memory layout
YV12
所有Y样本首先在内存中显示为无符号char值的数组。 该阵列紧接着是所有V(Cr)样本。 V平面的步幅是Y平面的一半,V平面包含Y平面一半的行数。 紧接着V平面的所有U(Cb)样本,具有与V平面相同的步幅和行数(图12)。
Figure 12. YV12 memory layout
NV12
所有Y样本首先在内存中存储,Y平面是无符号char值的数组,共有偶数行。 Y平面后面紧跟着一个无符号字符值数组,其中包含打包的U(Cb)和V(Cr)样本,如图13所示。当组合的UV数组作为小端WORD值的数组进行寻址时, LSB包含U值,MSB包含V值。 NV12是DirectX VA的首选4:2:0像素格式。 预计这将是支持4:2:0视频的DirectX VA加速器的中期要求。
Figure 13. NV12 memory layout
I420多用于传输
摄像头采集得到的数据是NV12