• 【转载】一文读懂YUV的采样与格式


    转载出自:Glumes:一文读懂YUV的采样与格式

    YUV是一种颜色编码方法,和它等同的还有RGB颜色编码方法。

    像素以及分辨率:(点构成线->线组成面—>图片),也就是同等的采集区域当你的分辨率越高,你采集到的像素点就越多,那么你相机的像素就越高

    RGB(红绿蓝)一个颜色就可以用RGB便是 光的三原色

    RGB图像中,每个像素点都有红,绿,蓝三个原色,其中每种原色都占用8位,也就是一个字节,那么一个像素点也就占用24位,也就是三个字节。

    一张1280 * 720大小的图片,就占用1280 * 720 * 3/1024/1024 = 2.63 MB存储空间。

    像素是组成图象的最基本单元要素:点。分辨率是指在长和宽的两个方向上各拥有的像素个数。一个像素有多大呢?主要取决于显示器的分辨率,相同面积不同分辨率的显示屏,其像素点大小就不相同。

    大家都知道线是由无数个点组成的,而面是由无数条线组成,即一个平面是由无数个点所组成。但无论技术多先进发达,人类总是不可能做到一幅图象由无数个点来构成的境界,只能在长和宽的方向上由有限个点组成而已。

    这些有限的点就叫做像素,每一个长度方向上的像素个数乖每一个宽度方向上的像素个数的形式表示,就叫做图片的分辨率。

    RGB颜色编码

    RGB三个字母分别代表了红(红),绿(绿),蓝(蓝),这三种颜色称为三原色,将它们以不同的比例相加,可以产生多种多样的颜色。

    在图像显示中,一张1280 * 720大小的图片,就代表着它有1280 * 720个像素点。其中每一个像素点的颜色显示都采用RGB编码方法,将RGB分别取不同的值,就会展示不同的颜色。

    RGB图像中,每个像素点都有红,绿,蓝三个原色,其中每种原色都占用8位,也就是一个字节,那么一个像素点也就占用24位,也就是三个字节。

    一张1280 * 720大小的图片,就占用1280 * 720 * 3/1024/1024 = 2.63 MB存储空间。

    YUV颜色编码

    YUV颜色编码采用的是明亮度色度来指定像素的颜色。

    其中,Y表示明亮度(Luminance,Luma),而U和V表示色度(Chrominance,Chroma)。

    而色度又定义了颜色的两个方面:色调和饱和度。

    使用YUV颜色编码表示一幅图像,它应该下面这样的:

    和RGB表示图像类似,每个像素点都包含Y,U,V分量。但是它的Y和UV分量是可以分离的,如果没有UV分量一样可以显示完整的图像,只不过是黑白的。

    对于YUV图像来说,并不是每个像素点都需要包含了Y,U,V三个分量,根据不同的采样格式,可以每个Y分量都对应自己的UV分量,也可以几个Y分量共用紫外分量。

    RGB到YUV的转换

    对于图像显示器来说,它是通过RGB模型来显示图像的,而在传输图像数据时又是使用YUV模型,这是因为YUV模型可以节省带宽。因此就需要采集图像时将RGB模型转换到YUV模型,显示时再将YUV模型转换为RGB模型。

    RGB到YUV的转换,就是将图像所有像素点的R,G,B分量转换到Y,U,V分量。

    有如下公式进行转换:

    此时的转换结束后,每个像素点都有完整的Y,U,V分量。而之前提到Y和UV分量是可以分离的,接下来通过不同的采样方式,可以将图像的Y,U ,V分量重新组合。

    接下来的不同采样格式都是在一张图像所有像素的RGB转换到YUV基础上进行的。

    YUV采样格式

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

    • YUV 4:4:4采样
    • YUV 4:2:2采样
    • YUV 4:2:0采样

    YUV 4:4:4采样

    YUV 4:4:4采样,意味着Y,U,V三个分量的采样比例相同,因此在生成的图像里,每个像素的三个分量信息完整,都是8位,也就是一个字节。

    如下图所示:

    其中,Y分量用叉表示,UV分量用圆圈表示。

    1. 举个例子 :
    2. 假如图像像素为:[Y0 U0 V0][Y1 U1 V1][Y2 U2 V2][Y3 U3 V3]
    3. 那么采样的码流为:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
    4. 最后映射出的像素点依旧为 [Y0 U0 V0][Y1 U1 V1][Y2 U2 V2][Y3 U3 V3]

    可以看到这种采样方式的图像和RGB颜色模型的图像大小是一样,并没有达到节省带宽的目的,当将RGB图像转换为YUV图像时,也是先转换为YUV 4:4:4采样的图像。

    YUV 4:2:2采样

    YUV 4:2:2采样,意味着UV分量是Y分量采样的一半,Y分量和UV分量按照2:1的比例采样。如果水平方向有10个像素点,那么采样了10个Y分量,而只采样了5个紫外分量。

    如下图所示:

    其中,Y分量用叉表示,UV分量用圆圈表示。

    1. 举个例子 :
    2. 假如图像像素为:[Y0 U0 V0][Y1 U1 V1][Y2 U2 V2][Y3 U3 V3]
    3. 那么采样的码流为:Y0 U0 Y1 V1 Y2 U2 Y3 V3
    4. 其中,每采样过一个像素点,都会采样其 Y 分量,而 UV 分量就会间隔一个采集一个。
    5. 最后映射出的像素点为 [Y0 U0 V1][Y1 U0 V1][Y2 U2 V3][Y3 U2 V3]

    采样的码流映射为像素点,还是要满足每个像素点有Y,U,V三个分量。但是可以看到,第一和第二像素点公用了U0,V1分量,第三和第四个像素点公用了U2,V3分量,这样就节省了图像空间。

    一张1280 * 720大小的图片,在YUV 4:2:2采样时的大小为:

    (1280 * 720 * 8 + 1280 * 720 * 0.5 * 8 * 2)/ 8/1024/1024 = 1.76 MB。

    可以看到YUV 4:2:2采样的图像比RGB模型图像节省了三分之一的存储空间,在传输时占用的带宽也会随之减少。

    YUV 4:2:0采样

    YUV 4:2:0采样,并不是指只采样U分量而不采样V分量。而是指,在每一行扫描时,只扫描一种色度分量(U或者V),和Y分量按照2: 1的方​​式采样。比如,第一行扫描时,YU按照2:1的方式采样,那么第二行扫描时,YV分量按照2:1的方式采样。对于每个色度分量来说,它的水平方向和竖直方向的采样和Y分量相比都是2:1。

    如下图所示:

    其中,Y分量用叉表示,UV分量用圆圈表示。

    假设第一行扫描了V分量,那么需要扫描两行才能够组成完整的UV分量。

    1. 举个例子 :
    2. 假设图像像素为:
    3. [Y0 U0 V0][Y1 U1 V1][Y2 U2 V2][Y3 U3 V3]
    4. [Y5 U5 V5][Y6 U6 V6][Y7 U7 V7][Y8 U8 V8]
    5. 那么采样的码流为:Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8
    6. 其中,每采样过一个像素点,都会采样其 Y 分量,而 UV 分量就会间隔一行按照 2 : 1 进行采样。
    7. 最后映射出的像素点为:
    8. [Y0 U0 V5][Y1 U0 V5][Y2 U2 V7][Y3 U2 V7]
    9. [Y5 U0 V5][Y6 U0 V6][Y7 U2 V7][Y8 U2 V8]

    从映射出的像素点中可以看到,四个Y分量是共用了一套UV分量,而且是按照2 * 2的小方格的形式分布的,相比YUV 4:2:2采样中两个Y分量共用一套UV分量,这样更能够节省空间。

    一张1280 * 720大小的图片,在YUV 4:2:0采样时的大小为:

    (1280 * 720 * 8 + 1280 * 720 * 0.25 * 8 * 2)/ 8/1024/1024 = 1.32 MB。

    可以看到YUV 4:2:0采样的图像比RGB模型图像节省了一半的存储空间,因此它也是比较主流的采样方式。

    YUV存储格式

    说完了采样,接下来就是如何把采样的数据存储起来。

    YUV的存储格式,有两种:

    • 平面平面格式
      • 指先连续存储所有像素点的Y分量,然后存储U分量,最后是V分量。
    • 打包打包模式
      • 指每个像素点的Y,U,V分量是连续交替存储的。

    根据采样方式和存储格式的不同,就有了多种YUV格式。这些格式主要是基于YUV 4:2:2和YUV 4:2:0采样。

    常见的基于YUV 4:2:2采样的格式如下表:

    YUV 4:2:2采样
    YUYV格式
    UYVY格式
    YUV 422P格式

    常见的基于YUV 4:2:0采样的格式如下表:

      YUV 4:2:0采样 YUV 4:2:0采样
    YUV 420P类型 YV12格式 YU12格式
    YUV 420SP类型 NV12格式 NV21格式

    更多的YUV格式信息参考这里:YUV像素格式

    基于YUV 4:2:2采样的格式

    YUV 4:2:2采样规定了Y和UV分量按照2:1的比例采样,两个Y分量公用一组UV分量。

    YUYV格式

    YUYV格式是采用打包格式进行存储的,指每个像素点都采用Y分量,但是每隔一个像素采样它的UV分量,排列顺序如下:

    Y0 UO Y1 V0 Y2 U2 Y3 V2

    Y0和Y1公用U0 V0分量,Y2和Y3公用U2 V2分量....

    UYVY格式

    UYVY格式也是采用打包格式进行存储,它的顺序和YUYV相反,先采用Y分量再采样Y分量,排列顺序如下:

    U0 Y0 V0 Y1 U2 Y2 V2 Y3

    Y0和Y1公用U0 V0分量,Y2和Y3公用U2 V2分量....

    根据UV和Y的顺序还有其他格式,比如,YVYU格式,VYUY格式等等,原理大致一样了。

    YUV 422P格式

    YUV 422P格式,又叫做I422,采用的是平面格式进行存储,先存储所有的Y分量,再存储所有的U分量,再存储所有的V分量。

    基于YUV 4:2:0采样的格式

    基于YUV 4:2:0采样的格式主要有YUV 420P和YUV 420SP两种类型,每个类型又对应其他具体格式。

    • YUV 420P类型
      • YU12格式
      • YV12格式
    • YUV 420SP类型
      • NV12格式
      • NV21格式

    YUV 420P和YUV 420SP都是基于Planar平面模式进行存储的,先存储所有的Y分量后,YUV420P类型就会先存储所有的U分量或者V分量,而YUV420SP则是按照UV或者VU的交替顺序进行存储了,具体查看看下图:

    YUV420SP的格式:

    YUV420P的格式:

    YU12和YV12格式

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

    YV 12的存储格式如下图所示:

    YU 12又称作I420格式,它的存储格式就是把V和U反过来了。

    NV12和NV21格式

    [化学杂志

    NV12是IOS中有的模式,它的存储顺序是先存Y分量,再UV进行交替存储。

    NV21是安卓中有的模式,它的存储顺序是先存Y分量,在VU交替存储。

    小结

    以上就是关于YUV的知识总结,你有看明白了嘛?

    参考

    1. http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html
    2. https://blog.csdn.net/MrJonathan/article/details/17718761
    3. https://blog.csdn.net/wudebao5220150/article/details/13295603
    4. https://msdn.microsoft.com/zh-cn/library/ms867704.aspx
    5. https://www.fourcc.org/yuv.php 
  • 相关阅读:
    【转】编写高质量代码改善C#程序的157个建议——建议27:在查询中使用Lambda表达式
    python的reduce()函数
    SpringBoot中的配置文件
    23种设计模式概况性应用场景
    设计模式---合成模式
    tmpfs(转)
    Nginx配置文件(nginx.conf)配置详解
    Java设计模式------策略模式
    ubuntu下操作端口的方法
    ubuntu下安装ssh服务器方法
  • 原文地址:https://www.cnblogs.com/rootshaw/p/13299845.html
Copyright © 2020-2023  润新知