为什么是YUV420?------- YUV数据格式解析

YUV数据格式解析

一、 YUV简介

YUV,是一种颜色编码方法,常使用在各个视频处理组件中。“Y”表示明亮度(Luminance或Luma),也就是灰阶值,“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。YUV最大的优点在于只需占用极少的带宽。
Y’UV、YUV、YCbCr、YPbPr 几个概念其实是一回事儿。由于历史关系,Y’UV、YUV 主要是用在彩色电视中,用于模拟信号表示。YCbCr 是用在数字视频、图像的压缩和传输,如 MPEG、JPEG。今天大家所讲的 YUV 其实就是指 YCbCr。

二、YUV格式

YUV有两种格式:
1.紧缩模式(packed):和RGB的存放方式类似,每个像素点的Y、U、V分量交错储存。
2.平面格式(planar):将Y、U、V的三个分量分别存放在不同的矩阵中。

三、YUV常用储存格式

YUV的存储格式与其采样方式相关。主流的采样方式分为YUV4:4:4,YUV4:2:2,YUV4:2:0三种。他们的区别是:
1.YUV 4:4:4采样,每一个Y分量对应一组UV分量。
2.YUV 4:2:2采样,每两个Y分量共用一组UV分量。
3.YUV 4:2:0采样,每四个Y分量共用一组UV分量。
下图中的黑点表示采样该像素点的Y分量,空心圆圈表示采用该像素点的UV分量
为什么是YUV420?------- YUV数据格式解析_第1张图片
为什么是YUV420?------- YUV数据格式解析_第2张图片
上图左侧,每个小正方形代表一个图形像素,小黑点代表色度像素值(Cb+Cr),我们可以看出:y的比例始终为4,这代表着每个图形像素都有亮度值,而对于色度像素来说呢:
4:4:4 一个图形像素对应了一个色度像素
4:4:0 表示一个色度像素对应了两个图形像素。
4:2:2 表示一个色度像素对应了两个图形像素。
4:2:0 表示一个色度像素对应了四个图形像素。

上图右侧,是二次采样模式记号表示, 是 J:a:b 模式,实心黑色圆圈表示包含色度像素(Cb+Cr),空心圆圈表示不包含色度像素。对于 J: a: b 模式,主要是围绕参考块的概念定义的,这个参考块是一个 J x 2 的矩形,J 通常是 4。这样,此参考块就是宽度有 4 个像素、高度有 2 个像素的矩形。a 表示参考块的第一行包含的色度像素样本数,b 表示在参考块的第二行包含的色度像素样本数。

4:4:0 参考块第一行包含四个色度样本,第二行没有包含色度样本。
4:2:2 参考块第一行包含两个色度样本,第二行也包含两个色度样本,他们是交替出现。
4:2:0 参考块第一行包含两个色度样本,第二行没有包含色度样本。

现在我们发现 yuv444,yuv422,yuv420 yuv 等像素格式的本质是:每个图形像素都会包含亮度值,但是某几个图形像素会共用一个色度值,这个比例关系就是通过 4 x 2 的矩形参考块来定的。这样很容易理解类似 yuv440,yuv420 这样的格式了。

四、YUV储存格式详解

(1) YUYV 格式 (属于YUV422)
为什么是YUV420?------- YUV数据格式解析_第3张图片
YUYV为YUV422采样的存储格式中的一种,相邻的两个Y共用其相邻的两个Cb、Cr,分析,对于像素点Y’00、Y’01 而言,其Cb、Cr的值均为 Cb00、Cr00,其他的像素点的YUV取值依次类推。

(2) UYVY 格式 (属于YUV422)
为什么是YUV420?------- YUV数据格式解析_第4张图片
UYVY格式也是YUV422采样的存储格式中的一种,只不过与YUYV不同的是UV的排列顺序不一样而已,还原其每个像素点的YUV值的方法与上面一样。

(3) YUV422P(属于YUV422)
为什么是YUV420?------- YUV数据格式解析_第5张图片
YUV422P也属于YUV422的一种,它是一种Plane模式,并不是将YUV数据交错存储,而是先存放所有的Y分量,然后存储所有的U(Cb)分量,最后存储所有的V(Cr)分量,如上图所示。其每一个像素点的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即两个Y共用一个UV。比如,对于像素点Y’00、Y’01 而言,其Cb、Cr的值均为 Cb00、Cr00。

(4)YV12,YU12格式(属于YUV420)
为什么是YUV420?------- YUV数据格式解析_第6张图片
YU12和YV12属于YUV420格式,也是一种Plane模式,将Y、U、V分量分别打包,依次存储。其每一个像素点的YUV数据提取遵循YUV420格式的提取方式,即4个Y分量共用一组UV。注意,上图中,Y’00、Y’01、Y’10、Y’11共用Cr00、Cb00,其他依次类推。

(5)NV12、NV21(属于YUV420)
为什么是YUV420?------- YUV数据格式解析_第7张图片
NV12和NV21属于YUV420格式,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane。其提取方式与上一种类似,即Y’00、Y’01、Y’10、Y’11共用Cr00、Cb00

五、一些基本操作

分离YUV420P像素数据中的Y、U、V分量

/**
 * Split Y, U, V planes in YUV420P file.
 * @param url  Location of Input YUV file.
 * @param w    Width of Input YUV file.
 * @param h    Height of Input YUV file.
 * @param num  Number of frames to process.
 *
 */

int yuv20p_spilt(char* url, int w, int h, int number)
{
    FILE* fp = fopen(url,"rb+");
    FILE* fp1 = fopen("output420_y.y","wb+");
    FILE* fp2 = fopen("output420_u.y","wb+");
    FILE* fp3 = fopen("output420_v.y","wb+");
    
    
    unsigned char* pic = (unsigned char* )malloc(w*h*3/2);
    
    for (int i = 0; i < number; i++)
    {
        fread(pic, 1, w*h*3/2, fp);
        fwrite(pic, 1, w*h, fp1);
        fwrite(pic+w*h, 1, w*h/4, fp2);
        fwrite(pic+w*h*5/4, 1, w*h/4, fp3);
    }
    
    free(pic);
    fclose(fp1);
    fclose(fp2);
    fclose(fp3);
    fclose(fp4);
    return 0;
}

你可能感兴趣的:(音视频技术,数字图像处理)