前言
人类视觉系统对颜色信息的敏感度要弱于亮度信息。利用这一特点,通常相机会将捕获的 RGB 信息转换为 YUV 格式,然后对 YUV 格式进行色度信息采样(例如YUV420)以便压缩图像空间。
因采样格式和存储格式的不同,于是就有了多种YUV格式,根据使用场景选择最合适的格式。本文将介绍如何对YUV数据进行采样,以及采样后的数据是如何存储的。
采样格式
在 RGB 数据生成 YUV 数据时可以通过子采样(Subsampling)来减小平均每个像素对应的数据量。由于人的眼睛对亮度信息比色彩信息更加敏感,因此可以保留更多记录亮度信息的Y值,减少记录色彩信息的U、V值。这种减少U、V数据量的方式就是子(局部)采样。
根据子采样的方式,通常有YUV444、YUV422、YUV411和YUV420几种。简单来说,所谓子采样,就是生成数据时只留下部分U、V数据,使用数据时根据约定的规则使用相邻像素的色彩信息补齐需要的U、V数据的一种方法。
YUV 子采样命名规则
YUV[j][a][b]的命名规则是:
j,第一行的参考像素点个数,通常为4
a,第一行的 j 个参考像素点产生的数据中包含几个chrome (即U+V,下面表述为UV) 分量
b,与第一行的参考像素点紧挨的第二行的 j 个参考像素点产生的数据中包含几个chrome (即U+V,下面表述为UV) 分量
YUV444
YUV 4:4:4采样,每一个Y对应一组UV分量。
对于一个宽度为 4 个像素、高度为 2 个像素的采样区域(两行四列),第一行需要采样 4 个亮度分量 Y,4个色度分量组 UV,第二行需要采样 4 个亮度分量 Y,4个色度分量组 UV。
也即水平和垂直方向上,Y分量为全采样, UV 分量组相对于 Y分量做全采样。
YUV422
YUV 4:2:2采样,每两个Y共用一组UV分量。
对于一个宽度为 4 个像素、高度为 2 个像素的采样区域(两行四列),第一行需要采样 4 个亮度分量 Y,2个色度分量组 UV,第二行需要采样 4 个亮度分量 Y,2个色度分量组 UV。
也即水平方向上,Y分量为全采样, UV 分量组相对于 Y分量做1/2 降采样。
YUV411
YUV 4:1:1采样,每四个Y共用一组UV分量。
对于一个宽度为 4 个像素、高度为 2 个像素的采样区域(两行四列),第一行需要采样 4 个亮度分量 Y,1 个色度分量组 UV,第二行需要采样 4 个亮度分量 Y,1 个色度分量组 UV。
也即水平方向上,Y分量为全采样, UV 分量组相对于 Y分量做1/4 降采样。
YUV420
YUV 4:2:0采样,每四个Y共用一组UV分量。
对于一个宽度为 4 个像素、高度为 2 个像素的采样区域(两行四列),第一行需要采样 4 个亮度分量 Y,1 个色度分量组 UV,第二行需要采样 4 个亮度分量 Y,0个色度分量组 UV。
也即水平和垂直方向上,Y分量为全采样, UV 分量组相对于 Y分量做1/2 降采样。
存储格式
常见的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等。这些YUV格式可以分为两大类,打包格式与平面格式。
打包格式(packed formats)
将Y、U、V值存储成Macro Pixels数组,和RGB的存放方式类似。
平面格式(planar formats)
平面格式又可细分为平面格式(planar)与半平面格式(semi-planar)。
平面格式(Planar):将Y、U、V的三个分量分别存放在不同的矩阵中。
半平面格式(Semi-Planar):Y分量单独存放,UV分量交错一起存放。
如上图所示,I420和YV12为平面格式,NV12和NV21为半平面格式。
使用场景
那么为什么会有这么多的数据格式呢?
打包格式
优势:打包格式便于处理像素级别的操作,如图像处理和实时渲染等。由于YUV分量紧密排列,访问特定像素的YUV值时较为高效。
应用场景:适用于需要快速访问和处理单个像素的场景,如视频编辑、实时图像处理等。
平面格式
优势:平面格式便于进行大规模的数据处理和压缩。由于YUV分量分开存储,可以针对每个分量进行独立的处理,如滤波、压缩等。此外,这种格式也便于进行色彩空间的转换和图像处理算法的实现。
应用场景:适用于需要进行大规模数据处理、压缩或色彩空间转换的场景,如视频压缩、图像分析等。
内存布局
YUV中有一个关键参数stride,stride是指每一行像素数据所占用的字节数。确保数据按照特定的规则对齐存储,以提高内存访问的效率。
当像素数据没有按照对齐方式存储时,可能会导致一行像素跨越多个缓存行,即一行像素的数据分布在多个缓存行中。这样在处理器读取像素数据时,可能需要进行额外的内存访问操作,以获取完整的像素数据。例如,如果一行像素的数据分布在两个缓存行中,处理器可能需要进行两次内存访问操作才能获取到完整的像素数据,这就增加了额外的内存访问开销。
假设CPU以8字节字长访问内存,没有内存对齐的5*4的视频数据如下图所示,访问第二行像素需要两次内存访问操作。
假设CPU以8字节字长访问内存,内存对齐的5*4的视频数据如下图所示,访问第二行像素只需要一次内存访问操作。
总结
本文从采样格式、存储格式和内存布局三个方面来介绍YUV。关于YUV420和YUV411的采样,网上有看到两种说法,目前无从考证,如果有相关标准说明,欢迎留言指正,万分感谢。