「YUV」为什么有如此之多的YUV格式

前言

人类视觉系统对颜色信息的敏感度要弱于亮度信息。利用这一特点,通常相机会将捕获的 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的采样,网上有看到两种说法,目前无从考证,如果有相关标准说明,欢迎留言指正,万分感谢。

  • 29
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值