需求
需要熟悉 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…