YUV格式学习总结

遇到了P010格式,进一步了解发现是10bit的YUV格式,相比8bitYUV会有更好的动态范围,能表现出更丰富的细节和色彩信息。
遂决定系统学习所有的YUV格式

RGB和YUV的对比
我们日常中比较熟悉RGB图像,每个像素点有RGB红绿蓝三个分量,比例是1:1:1,每个分量8bit,1个字节。那么每个像素需要3字节的存储空间。
与之类似,YUV图像每个像素有Y、U、V三个分量,Y对应亮度,UV对应色度和饱和度

YUV图像的主流采样方式有三种:

  • YUV 4:4:4
  • YUV 4:2:2
  • YUV 4:2:0
  1. YUV 4:4:4
    这种采样方式Y、U、V三种分量比例相等,或者说压根没做“采样”。采样示意图如下,叉代表Y分量,圆圈代表UV分量。

    可以看到Y、UV每个都会采样,这种采样方式的存储空间和RGB图像一模一样。
采样前后对比:
原始图像像素:
[Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] [Y4 U4 V4]
[Y5 U5 V5] [Y6 U6 V6] [Y7 U7 V7] [Y8 U8 V8]
采样码流:
[Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] [Y4 U4 V4]
[Y5 U5 V5] [Y6 U6 V6] [Y7 U7 V7] [Y8 U8 V8]
采样后
[Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] [Y4 U4 V4]
[Y5 U5 V5] [Y6 U6 V6] [Y7 U7 V7] [Y8 U8 V8] (没变化)
存储空间对比:
图像size:4096x3072
RGB存储空间:(4096 x 3072 x 3)/1024/1024 = 36MB
YUV存储空间:(4096 x 3072 x 3)/1024/1024 = 36MB
  1. YUV 4:2:2
    这种采样厉害了,U、V分量是Y分量的1/2。采样示意图如下。

    看到Y分量逐个采样,UV分量每间隔一像素做一次采样,这样UV分量就是Y分量的1/2。那问题来了,最后输出每个像素肯定都是3Byte,那没做UV采样位置的UV分量从哪来?答案是与之前位置共用。可以看下面采样前后的对比。
采样前后对比:
原始图像像素:
[Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] [Y4 U4 V4]
[Y5 U5 V5] [Y6 U6 V6] [Y7 U7 V7] [Y8 U8 V8]
采样码流
[Y1 U1   ] [Y2    V2] [Y3 U3   ] [Y4    V4]
[Y5 U5   ] [Y6    V6] [Y7 U7   ] [Y8    V8] (UV分量做1/2采样,且交错进行)
采样码流映射到输出
[Y1 U1 V2] [Y2 U1 V2] [Y3 U3 V4] [Y4 U3 V4]
[Y5 U5 V6] [Y6 U5 V6] [Y7 U7 V8] [Y8 U7 V8] (总结,UV分量两个像素共用一个,Y分量是各自的)
存储空间对比:
图像size:4096x3072
RGB存储空间:(4096 x 3072 x 3)/1024/1024 = 36MB
YUV存储空间:(4096 x 3072 x 8 + 4096 x 3072 x 0.5 x 8 x 2)/8/1024/1024 = 24MB
(总结,U、V分量是Y分量1/2,所以U+V分量后才和Y分量相当,因此节省1/3空间也是符合理论的)
  1. YUV 4:2:0
    这种采样更厉害了,UV分量是Y分量的1/4,采样示意图如下。
采样前后对比:
原始图像像素:
[Y1 U1 V1]     [Y2 U2 V2]    [Y3 U3 V3]    [Y4 U4 V4]
[Y5 U5 V5]     [Y6 U6 V6]    [Y7 U7 V7]    [Y8 U8 V8]
[Y9 U9 V9]     [Y10 U10 V10] [Y11 U11 V11] [Y12 U12 V12]
[Y13 U13 V13]  [Y14 U14 V14] [Y15 U15 V15] [Y16 U16 V16]
采样码流
[Y1 U1   ]     [Y2      ]    [Y3 U3   ]    [Y4      ]
[Y5    V5]     [Y6      ]    [Y7    v7]    [Y8      ] (UV分量每间隔一行做1/2采样)
采样后
[Y1 U1 V5]     [Y2 U1 V5]    [Y3 U3 V7]    [Y4 U3 V7]
[Y5 U1 V5]     [Y6 U1 V5]    [Y7 U3 V7]    [Y8 U3 V7] (UV分量4个像素共用一个,Y分量是各自的)
存储空间对比:
图像size:4096x3072
RGB存储空间:(4096 x 3072 x 3)/1024/1024 = 36MB
YUV存储空间:(4096 x 3072 x 8 + 4096 x 3072 x 0.25 x 8 x 2)/8/1024/1024 = 18MB
(总结,U、V分量是Y分量1/4,所以U+V分量后相当于Y分量的1/2,U+V+Y相当于1.5个Y分量,因此节省1/2空间也是符合理论的)

YUV图像的存储方式有两种

  • packed格式存储:Y、U、V分量交替存储
如:Y1 U1 V1 Y2 U2 V2 Y3 U3 V3……
或者 Y1 U1 Y2 V2 Y3 U3……
  • planar格式存储:按照平面存储,先存Y平面,再存U/V平面
如:
Y1 Y2 Y3 Y4 
Y5 Y6 Y7 Y8
U1 U2 U3 U4
U5 U6 U7 U8
V1 V2 V3 V4
V5 V6 V7 V8……

不同的采样方式和存储方式相结合,就会有不同的YUV图像格式,常见的

  1. YUYV和UYVY格式(422采样+packed存储)
as name:
YUYV:Y1 U1 Y2 V2 Y3 U3……
UYVY:U1 Y1 V2 Y2 U3 Y3…… 
  1. YUV422P(422采样+planar存储)
    又叫做 I422,采用的是平面格式进行存储,先存储所有的 Y 分量,再存储所有的 U 分量,再存储所有的 V 分量。
  2. 420采样+planar存储
    整体分为两种格式:YUV420P和YUV420SP。两者都是先存Y分量,区别是420P接下来存U、再存V;420SP是U、V交替存储。
    YUV420P 的格式:

    YUV420SP 的格式:
  • YU12 和 YV12 格式都属于 YUV 420P 类型
    先存储 Y 分量,再存储 U、V 分量,区别在于:YU12 是先 Y 再 U 后 V,而 YV12 是先 Y 再 V 后 U
  • NV12 和 NV21 格式属于 YUV420SP 类型
    NV12 是 IOS 中有的模式,它的存储顺序是先存 Y 分量,再 UV 进行交替存储。
    NV21 是 安卓 中有的模式,它的存储顺序是先存 Y 分量,在 VU 交替存储。
posted @ 2024-07-02 10:54  JerryWanG97  阅读(2)  评论(1编辑  收藏  举报