YUV小结

作者: 小毛驴Jim | 来源:发表于2020-11-10 00:10 被阅读0次

    背景

    一般视频采集芯片采集到数据都是按照YUV格式输出,包括很多现在很多的相机。所以对音视频开发者来说,掌握YUV知识非常必要的。

    RGB

    RGB是一种颜色空间,以红(R)绿(G)蓝(B)三基色为坐标。

    YUV

    YUV也是一种颜色空间,一种编码格式,当初是为了兼容黑白电视和彩色电视机设计的。

    • Y 表示明亮度(Luminance、Luma),也就是灰阶值。
    • U、V 表示色度(Chrominance 或 Chroma),描述的是色调和饱和度

    YUV采样

    YUV采样格式有3种:

    • YUV444 采样: 每1个Y分量对应一组UV分量,一个像素共占用(8+8+8)bit = 3byte
    • YUV422 采样: 每2个Y分量对应一组UV分量,一个像素共占用(8+81/2 + 81/2)bit = 2byte
    • YUV420 采样: 每4个Y分量对应一组UV分量,一个像素共占用(8+81/4+81/4) = 1.5byte****

    如下图所示:
    实心圆点表示Y分量,空心圆点表示UV分量


    2019091109122264

    分别介绍一下这三种格式:
    YUV444

    v2-a210bb73a7e4d9abfc84716798aab63e_1440w

    四个像素为:
    [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]
    一张 1920 * 1280 大小的图片,如果按照YUV444采样,其存储占用共
    (192012808 + 192012808 + 192012808)/8/1024/1024 = 7.03M
    这种采样方式和RGB大小一样
    YUV422

    v2-a99ba29d8f672a04128e98fd8be847ab_1440w

    四个像素为:
    [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]
    一张 1920 * 1280 大小的图片,如果按照YUV444采样,其存储占用共
    (192012808 + 1920128081/2 + 1920128081/2)/8/1024/1024 = 4.68M
    相比于RGB,节省了1/3空间
    YUV420

    v2-6811dfa7e2f914eee232b490a496e80e_1440w

    图像像素为:
    [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]
    一张 1920 * 1280 大小的图片,如果按照YUV444采样,其存储占用共
    (192012808 + 1920128081/4 + 1920128081/4)/8/1024/1024 = 3.51M
    相比于RGB,节省了1/2空间

    YUV存储

    YUV存储方式分成两种:

    • packed格式: 打包格式,YUV分量交替存储。
    • planar格式: 先连续存储所有像素点Y分量,再存储所有像素点的U分量,最后存储所有像素 点的V分量。

    不同的采样方式和不同存储方式组合成很多格式,比如YUYV,UYVY,YUV420P,YUV420SP,YU12,YU21,NV12,NV21

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

    UYVY
    UYVY 也是 YUV422 采样的存储格式中的一种,只不过与 YUYV 排列顺序相反。
    U0 Y0 V0 Y1 U2 Y2 V2 Y3

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

    YUV420P 和 YUV420SP
    YUV420P 是基于 planar 平面模式进行存储,先存储所有的 Y 分量,然后存储所有的 U 分量或者V 分量。

    v2-cb7e35268a89e09d2ca7b75a383d03b2_1440w

    同样,YUV420SP 也是基于 planar 平面模式存储,与 YUV420P 的区别在于它的 U、V 分量是按照 UV 或者 VU 交替顺序进行存储。


    v2-ab706465d4a728f68c29946c04a7fa02_1440w

    YU12 和 YV12
    YU12 和 YV12 格式都属于 YUV 420P 类型,即先存储 Y 分量,再存储 U、V 分量,区别在于:YU12 是先 Y 再 U 后 V,而 YV12 是先 Y 再 V 后 U 。

    NV12 和 NV21
    NV12 和 NV21 格式都属于 YUV420SP 类型。它也是先存储了 Y 分量,但接下来并不是再存储所有的 U 或者 V 分量,而是把 UV 分量交替连续存储。
    NV12 是 IOS 中有的模式,它的存储顺序是先存 Y 分量,再 UV 进行交替存储。
    NV21 是 安卓 中有的模式,它的存储顺序是先存 Y 分量,在 VU 交替存储。

    RGB和YUV转换

    RGB转YUV公式如下:
    \begin{array}{rll} Y &= 0.299 * R + 0.587 * G + 0.114 * B \\ U &= -0.169 * R - 0.331 * G + 0.5 * B + 128 \\ V &= 0.5 * R - 0.419 * G - 0.081 * B + 128 \end{array}

    YUV转RGB公式如下:
    \begin{array}{rll} R & = Y + 1.13983 * (V - 128) \\ G & = Y - 0.39465 * (U - 128) - 0.58060 * (V - 128) \\ B & = Y + 2.03211 * (U - 128) \end{array}

    矩阵表示法如下:
    \begin{bmatrix} Y \\ U \\ V \end{bmatrix} = \begin{bmatrix} 0.299 & 0.587 & 0.114 \\ -0.169 & -0.331 & 0.5 \\ 0.5 & -0.419 & -0.081 \end{bmatrix}\begin{bmatrix} R \\ G \\ B\end{bmatrix} + \begin{bmatrix} 0 \\ 128 \\ 128 \end{bmatrix}

    相关文章

      网友评论

        本文标题:YUV小结

        本文链接:https://www.haomeiwen.com/subject/zpkdbktx.html