YUV格式详解

之前工作中有接触到YUV格式,懒得去了解。最近做一些音视频的处理,该来的还是会来的,逃不掉的,总结下,便于后续自己查阅。

YUV,是一种颜色编码方法,常使用在各个影像处理组件中。Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度、浓度(Chrominance、Chroma)。相对我们都比较熟悉的编码格式RGB,RGB诉求于人眼对色彩的感应,YUV则着重于视觉对于亮度的敏感程度。 YUV在对照片或影片编码时,考虑到人类的感知能力,允许降低色度的带宽。换句话说,也就是编码的时候允许Y的量比UV要多,允许对图片的UV分量进行下采样,这样数据占用的空间就比RGB更小(关于下采样,简单来说就是以比原来更低的采样率进行采样。)

采样格式

YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0

YUV444
YUV 4:4:4 采样,意味着 Y、U、V 三个分量的采样比例相同,因此在生成的图像里,每个像素的三个分量信息完整,都是 8 bit,也就是一个字节。
在这里插入图片描述

图像像素数据:   Y0U0V0    Y1U1V1   Y2U2V2  Y3U3V3 
采样的码流:    Y0 U0 V0  Y1 U1 V1 Y2 U2 V2 Y3 U3 V3 
为什么叫4:4:4 , 意思就是每4个像素里的数据有4个Y, 4个U, 4个V 
Y分量的大小: w*h 
U分量的大小: w*h 
V分量的大小: w*h 

通过YUV444采样的图像大小和RGB颜色模型的图像大小是一样的。
一张 1280 * 720 大小的图片,在 YUV 4:4:4 采样时的大小为:

(1280*720*8 + 1280*720*8 + 1280*720*8)/8/1024/1024 = 2.64 MB

YUV422
YUV 4:2:2 采样,意味着 UV 分量是 Y 分量采样的一半,Y 分量和 UV 分量按照 2 : 1 的比例采样。如果水平方向有 10 个像素点,那么采样了 10 个 Y 分量,而只采样了 5 个 UV 分量。
在这里插入图片描述

图像像素数据:   Y0U0V0    Y1U1V1   Y2U2V2  Y3U3V3 
采样的码流:     Y0 U0 Y1 V1 Y2 U2 Y3 V3 
其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一个采集一个。 
为什么叫4:2:2,意思是每4个像素里面有4个Y,2个U,2个V 
Y分量的大小: w*h 
U分量的大小: w*h/2 
V分量的大小: w*h/2 

一张 1280 * 720 大小的图片,在 YUV 4:2:2 采样时的大小为:

(1280*720*8 + (1280*720)/2*8 + (1280*720)/2*8)/8/1024/1024 = 1.76 MB

可以看到 YUV 422 采样的图像比rRGB模型图像节省了三分之一的存储空间,在传输时占用的带宽也会随之减少。

YUV420
YUV 4:2:0 采样,并不是指只采样 U 分量而不采样 V 分量。而是指,在每一行扫描时,只扫描一种色度分量(U 或者 V),和 Y 分量按照 2 : 1 的方式采样。比如,第一行扫描时,YU 按照 2 : 1 的方式采样,那么第二行扫描时,YV 分量按照 2:1 的方式采样。对于每个色度分量来说,它的水平方向和竖直方向的采样和 Y 分量相比都是 2:1 。
在这里插入图片描述

图像像素数据:   [Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3]
                 [Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8] 
采样的码流:     Y0 U0 Y1 Y2 U2 Y3
                  Y5 V5 Y6 Y7 V7 Y8         其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一行按照 2 : 1 进行采样。 
为什么叫4:2:0,意思是每4个像素中有4个Y,2个U,0个V,而下一行的四个像素中有4个Y,0个U,2个V  
Y分量的大小: w*h 
U分量的大小: w*h/4 
V分量的大小: w*h/4  

一张 1280 * 720 大小的图片,在 YUV 4:2:0 采样时的大小为:

(1280*720*8 + (1280*720)/4*8 + (1280*720)/4*8)/8/1024/1024 = 1.32 MB

可以看到 YUV 420 采样的图像比 RGB 模型图像节省了一半的存储空间,因此它也是比较主流的采样方式。

存储格式

YUV存储格式

YUV存储格式有两大类:planar 和 packed
planar,平面格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,然后是所有像素点的V;将几个分量分开存,比如YUV420中,data[0]专门存Y,data[1]专门存U,data[2]专门存V
packed,打包格式,每个像素点的Y,U,V是连续交错存储的,所有数据都存在data[0]中。
根据采样方式和存储格式的不同,就有了多种 YUV 格式。这些格式主要是基于 YUV 4:2:2 和 YUV 4:2:0 采样。

常见的YUV格式

常见的基于 YUV 4:2:2 采样的格式如下:
YUYV
YUYV 格式是采用打包格式进行存储的,指每个像素点都采用 Y 分量,但是每隔一个像素采样它的 UV 分量,排列顺序如下:

Y0 U0 Y1 V0 Y2 U2 Y3 V2

Y0 和 Y1 公用 U0 V0 分量,Y2 和 Y3 公用 U2 V2 分量

UYVY
UYVY 格式是采用打包格式进行存储,它的顺序和 YUYV 相反,先采用 U 分量再采样 Y 分量,排列顺序如下:

U0 Y0 V0 Y1 U2 Y2 V2 Y3

YUV422P
YUV 422P 格式,又叫做 I422,采用的是平面格式进行存储,先存储所有的 Y 分量,再存储所有的 U 分量,再存储所有的 V 分量。

Y0 Y1 Y2 Y3 U0 U1 V0 V1

常见的基于 YUV 4:2:0 采样的格式如下:
YV12
YV12,采用的是平面格式进行存储,先存 Y 分量,再存 V 分量,最后U分量

Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 V0 U0

YU12
YU12,采用的是平面格式进行存储,先存 Y 分量,再存 U分量,最后V分量

Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 U0 V0

NV12 (ios常用)
NV12,采用的是平面格式进行存储,再 UV 进行交替存储

Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 U0 V0

NV21(android常用)

NV21,采用的是平面格式进行存储,再 VU 进行交替存储

Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 V0 U0

YUV420P
基于 Planar 平面模式 进行存储的,先存储所有的 Y 分量后,再存储所有的 U 分量或者 V 分量

YUV420SP
基于 Planar 平面模式 进行存储的,先存储所有的 Y 分量后,按照 UV 或者 VU 的交替顺序进行存储

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值