需求

需要熟悉 YUV 格式

解决

RGB 和 YUV

介绍

  • RGB 是最简单的三原色,三个字节标识一个点
  • YUV Y是明亮度,U是色调,V是饱和度,也是可以用三个字节标识一个点。

优点

YUV 有如下的好处:

  • Y 可以和 UV 分离,只有 Y 也可以显示图像,就是以前的黑白电视。
  • 多个 Y 还可以共用 UV 分量,来压缩数据。

转换

  • Y = 0.299 * R + 0.587 * G + 0.114 * B

  • U = -0.147 * R - 0.289 * G + 0.436 * B

  • V = 0.615 * R - 0.515 * G - 0.100 * B

  • R = Y + 1.14 * V

  • G = Y - 0.39 * U - 0.58 * V

  • B = Y + 2.03 * U

YUV 采样格式

YUV 主流有 4:4:4, 4:2:2, 4:2:0 三种。

YUV 444

三个分量都是正常比例,每个分量1个字节。

  • 原始: [Y0 U0 V0] [Y1 U1 V1]
  • 采样码流: Y0 U0 V0 Y1 U1 V1

YUV444 可以和 RGB 直接进行转换

YUV 422

UV 采样只有 Y 的一半,UV 是间隔采集,然后共用。

  • 原始: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
  • 采样码流: Y0 U0 Y1 V1 Y2 U2 Y3 V3
  • 最终: [Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]

YUV422 可以节省空间,占用的空间是 (4 + 2 + 2) / (4 + 4 + 4), 大概可以节省 1/3 的空间。

YUV 420

第一行只采样 U,并且按照 Y 的 1/2 来采样,第二行只采样 V,也是按照 Y 的 1/2 来采样,两行共用 UV,相当于从水平和垂直方向都是 2:1 的采样。

  • 原始: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3], [Y4 U4 V4] [Y5 U5 V5] [Y6 U6 V6] [Y7 U7 V7]
  • 采样码流: Y0 U0 Y1 Y2 U2 Y3, Y4 V4 Y5 Y6 V6 Y7
  • 最终: [Y0 U0 V4] [Y1 U0 V4] [Y2 U2 V6] [Y3 U2 V6], [Y4 U0 V4] [Y5 U0 V4] [Y6 U2 V6] [Y7 U2 V6]

YUV420 最节省空间,占用空间是 (4 + 2 + 0) / ( 4 + 4 + 4), 大概可以节省 1/2 的空间。

YUV 存储格式

  • plannar 平面格式,先连续存储所有的 Y, 然后是 U,最后是 V
  • packed 打包格式,按照每个像素点 YUV 这样进行存储。

常见格式

  • YUV422: YUYV, UYVY, YUV422P
  • YUV420: YUV420P: YV12, YU12; YUV420SP: NV12, NV21

YUV422-YUYV

Y 在前,UV 在后

byte ordering(lowest byte): Y0 U0 Y1 V0 Y2 U2 Y3 V2

YUV422-UYVY

UV 在前,Y 在后

byte ordering(lowest byte): Y0 U0 Y1 V0 Y2 U2 Y3 V2

YUV420P 和 YUV420SP

这两种都是 plannar 模式,都是先所有的 Y 分量。区别是:

  • YUV420P: 所有的 U 之后 再是所有的 V
  • YUV420SP: UV 或者 UV 这样打包起来一个一个的。

YUV420P-YU12

YU12 又叫做 I420 格式。

byte ordering(lowest byte): Y0 Y1 Y2 Y3… U0 U1… V0 V1…

YUV420P-YV12

byte ordering(lowest byte): Y0 Y1 Y2 Y3… V0 V1… U0 U1…

YUV420SP-NV12

NV12 是 IOS 特有格式。

byte ordering(lowest byte): Y0 Y1 Y2 Y3… U0 V0 U1 V1…

YUV420SP-NV21

NV12 是 安卓 特有格式。

byte ordering(lowest byte): Y0 Y1 Y2 Y3… V0 U0 V1 U1…

参考