• YUV格式与RGB格式


    YUV420介绍:

    YUV420格式是指,每个像素都保留一个Y(亮度)分量,而在水平方向上,不是每行都取U和V分量,而是一行只取U分量,则其接着一行就只取V分量,以此重复(即4:2:0, 4:0:2, 4:2:0, 4:0:2 .......),所以420不是指没有V,而是指一行采样只取U,另一行采样只取V。在取U和V时,每两个Y之间取一个U或V。但从4x4矩阵列来看,每4个矩阵点Y区域中,只有一个U和V,所以它们的比值是4:1。所以对于一个像素,RGB需要8 * 3 = 24位,即占3个字节;而YUV420P,8 + 8/4 + 8/4 = 12位,即占2个字节,其中8指Y分量,8/4指U和V分量。

    从这里也可以看出,YUV要比RGB节省存储空间。


    这里为什么一个分量是8位呢?
    不管是R G B还是 Y U V他们每个分量的取值都是0-255,而计算机都是用二进制来存储的。巧了,一个字节(8bit)刚好可以记录0-255的数,

    yuv420又分为yuv420p和yuv420sp.

     yuv420P格式如下:

    yuv420sp格式如下:

    还是图像比较直观,从上面的图片中就能看出来yuv420sp和yuv420p的区别了。
    对于所有YUV420图像,它们的Y值排列是完全相同的,因为只有Y的图像就是灰度图像。YUV420sp与YUV420p的数据格式它们的UV排列在原理上是完全不同的。420p它是先把U存放完后,再存放V,也就是说UV它们是连续的。而420sp它是UV、UV这样交替存放的。(记得结合上图查看)


    有了上面的理论,就可以准确的计算出一个YUV420在内存中存放的大小。
    Y = width * hight (总和)
    U = Y / 4
    V = Y / 4

    所以一张YUV图像他的存储空间就是:
    width * height + width * height / 4 + width * height / 4
    化简后就是 width * height *3 /2
    看来数学还是有点用的

    YUV420P内存中的存储方式:
    YUV格式通常有两大类:打包(packed)格式和平面(planar)格式。
    前者将YUV分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel);
    而后者使用三个数组分开存放YUV三个分量

    YUV420P(planar格式)在ffmpeg中存储是在struct AVFrame的data[]数组中
    data[0]-------Y分量
    data[1]------U分量
    data[2]-------V分量

    现在回过头看一下,我们前面保存yuv420图像的代码:

    int y_size=pCodecCtx->width*pCodecCtx->height;
    fwrite(pFrameYUV->data[0],1,y_size,fp_yuv); //Y
    fwrite(pFrameYUV->data[1],1,y_size/4,fp_yuv); //U
    fwrite(pFrameYUV->data[2],1,y_size/4,fp_yuv); //V

     原文 http://blog.yundiantech.com/?log=blog&id=18

    参考 http://blog.yundiantech.com/?log=blog&id=19

  • 相关阅读:
    odoo12 配置文件详解
    python 关于排序的问题
    odoo12 按钮点击前的提示功能(再确认功能)
    Django框架之ORM的相关操作之分页(六)
    Django框架之ORM的相关操作之多对多三种方式(五)
    Django框架之ORM的相关操作之一对一关系(四)
    Django框架之ORM的相关操作(三)
    Django框架之ORM的相关操作(二)
    Django框架之ORM的相关操作(一)
    Django框架之ORM常用字段
  • 原文地址:https://www.cnblogs.com/nanqiang/p/10040190.html
Copyright © 2020-2023  润新知