YUV

YUV 是一种颜色编码方法。常使用在各个影像处理组件中。 “Y” 表示**亮度(Luminance、Luma),“U” 和 “V” 则是色度浓度**(Chrominance、Chroma)。YCrCb 颜色空间是由 YUV 颜色空间派生的一种颜色空间。YCbCr中,Y 是指亮度分量,Cb 指蓝色色度分量,而 Cr 指红色色度分量。在 YUV 家族中,YCbCr 是在计算机系统中应用最多的成员,其应用领域很广泛,JPEG、MPEG 均采用此格式。一般所讲的 YUV 大多是指 YCbCr

为什么会有 YUV? YUV 的发明是由于彩色电视与黑白电视的过渡时期,早期的黑白电视只能显示黑色和白色两种颜色,随着技术的发展,彩色电视出现了,但对于电视台来说,不可能同时广播两套数字电视信号(当然也不是不行,但是同一个节目信号广播两次也是浪费),于是人们就在思考能否能以更简便的方式来改进现有的技术方案,即是说,广播电视中心只需要广播一套电视信号就能同时满足黑白电视和彩色电视的显示需求。那具体如何实现呢?这时候 YUV就出来了,我们用 Y 表示黑白图像,用 UV 表示彩色图像,你要是黑白电视,那你接收到 YUV 信号后,只需要拿到 Y 就可以了,因为 Y 代表的就是黑白图像,UV 可以直接扔掉;如果是彩色电视,那你可以收到 YUV 三个信号后再叠加显示,就可以显示出彩色图像。这样便一举解决了彩色电视与黑白电视的兼容问题

YUV 采样

我们经常提到:YUV4:4:4YUV4:2:2YUV4:2:0,到这里可能会有疑问:“YUV 不是颜色空间吗?为什么后面还会跟着一串数字?” 因为当你看到 YUV 后面跟着一串数字的时候,YUV 已经不再是颜色空间的基的含义了,而是意味着在原始 YUV 流 上的采样
YUV4:4:4YUV4:2:2YUV4:2:0 是三种 YUV(在数字电路中指代 YCbCr)的采样,三位数分别代表 Y\U\V(数字电路中为 Y\Cb\Cr,本段后同)通道的抽样比。所以可以理解,444 是全采样;而 422 是对 Y 进行全采样,对 U\V 分别进行 1/2 均匀采样。有趣的问题来了,420 难道是完全丢弃了 V通道/分量 数据嘛?答案是否定的
首先,必须要搞明白一个问题,一帧图像是由一个个像素组成的矩形,譬如 4x4 的尺寸的图像,就是由 16 个像素点组成的。在平时接触的 RGB 图像中,每个像素必然至少由 R\G\B 这三个通道组成的(有的图像还有 alpha 分量),每个分量的取值一般都是 [0, 255],因此经常说一个像素占用 3 字节(如果还有其他分量,比如 RGBA,就另当别论)。YUV 图像同理,它的每个像素是由 Y\U\V 组成的

YUV4:4:4

YUV4:4:4,就是每个像素对应一个 Y 分量,一个 U 分量,一个 V 分量,即每个 Y 对应一组 UV 分量

1
2
3
四个像素为:     [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
采样的码流为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
映射出的像素点为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]

YUV4:2:2

YUV4:2:2 表示 UV 分量的采样率是 Y 分量的一半,即每两个 Y 共用一组 UV 分量

1
2
3
四个像素为:     [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
采样的码流为: Y0 U0 Y1 V1 Y2 U2 Y3 U3
映射出的像素点为:[Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]

YUV4:2:0

YUV4:2:0 并不意味着不采样 V 分量。它指的是对每条扫描线来说,只有一种色度分量以 2:1 的采样率存储,相邻的扫描行存储不同的色度分量。也就是说,如果第一行是 4:2:0,下一行就是 4:0:2,在下一行就是 4:2:0,以此类推。换句话说是四个像素共用一个 U,共用一个 V

1
2
3
4
5
6
7
8
9
10
11
图像像素为:
[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

映射出的像素点为:
[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7]
[Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]

RGB 或 YUV4:4:4 每 4 个像素需要的内存 = 4 * 3 * 8bit = 12 byte,而 YUV4:2:0 则为 (4 + 2) * 8bit = 6 byte,只有 YUV4:4:4 或 RGB 的一半,总的数据量 = w x h x 1.5(YUV4:4:4 = w x h x 3)

存储格式

YUV 存储格式有:

  • 紧凑格式(Packed Format):将 Y、U、V 值存储成 Macro Pixels 数组,和 RGB 的存放方式类似(YUV YUV YUV)
  • 平面格式(Planar Format):将 Y、U、V 的三个分量分别存放在不同的矩阵中(YYYYY…UUUUU…VVVVV)
  • 半平面格式(Semi Planar Format):将 Y 分量单独存储,UV 分量交错存储(YYYYY…UVUVUV、YYYYY…VUVUVU)
采样方式 格式 具体名称
YUV420 Planar I420 / 420P
Planar YV12
Semi Planar NV12
Semi Planar NV21
YUV422 Planar 422P
Semi Planar 422SP
Packed YUYV / YUVY / YUY2
Packed UYVY
Packed VYUY
YUV444 Planar 444P
Semi Planar 444SP

YUV420P/YUV420SP

YUV420P 是基于 Packed 格式存储,先存储所有的 Y 分量,然后存储所有的 U 分量或者 V 分量

1
2
YYYYY...UUUUU...VVVVV
YYYYY...VVVVV...UUUUU

YUV420SP 基于 Semi Planar 格式存储,与 YUV420P 的区别在于它的 U、V 分量是按照 UV 或者 VU 交替顺序进行存储

1
2
YYYYYYY...UVUVUVUV...............
YYYYYYY...VUVUVUVU...............

YU12 和 YV12

YU12 和 YV12 格式都属于 YUV420P 类型

  • YU12:先存 Y 分量,再 U 后 V
  • YV12:先存 Y 分量,再 V 后 U

NV12 和 NV21

NV12 和 NV21 格式都属于 YUV420SP 类型

  • NV12:先存 Y 分量,再 UV 交替存储
  • NV21:先存 Y 分量,在 VU 交替存储

YUV422

YUYV

YUYV 格式属于 YUV422,采用 Packed 格式进行存储,Y 和 UV 分量按照 2:1 比例采样,每个像素都采集 Y 分量,每隔一个像素采集它的 UV 分量。Y0 和 Y1 共用 U0 V0 分量,Y2 和 Y3 共用 U2 V2 分量

1
2
采样的码流为:    Y0 U0 Y1 V0 Y2 U2 Y3 V2
映射出的像素点为:[Y0 U0 V0]、[Y1 U0 V0]、[Y2 U2 V2]、[Y3 U2 V2]

UYVY

UYVY 也是 YUV422 采样的存储格式中的一种,只不过与 YUYV 排列顺序相反,还有 YVYU, VYUY 这些都是类似的

1
2
采样的码流为:    U0 Y0 V0 Y1 U2 Y2 V2 Y3
映射出的像素点为:[Y0 U0 V0]、[Y1 U0 V0]、[Y2 U2 V2]、[Y3 U2 V2]

YUV422P

YUV422P 属于 YUV422 的一种,它是一种 Planar 格式,即 Y、U、V 分别存储

1
YYYYY....UUUUU...VVVVV...

Reference

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×