首页 > 其他 > 详细

YUV格式

时间:2020-05-13 15:56:26      阅读:78      评论:0      收藏:0      [点我收藏+]

YUV、RGB、YcbCr是色彩空间的模型,而平常听到的BMP、PNG、JPEG、GIF是文件储存的形式。

提出YUV格式的原因,是为了解决彩色电视和黑白电视兼容性问题,因此从rgb的颜色空间,转换为yuv的颜色空间,其中y代表亮度,u和v代表色度。

YUV种类分为很多,可以理解是一个二维的,即空间间,和空间内,这样的表述,借鉴了h264中的帧间和帧内的思想。

空间-间:不同空间,即描述一个像素的bit数不同,比如yuv444,yuv422,yuv411,yuv420

空间-内:相同空间,即描述一个像素的bit数相同,但是存储方式不同,比如对于yuv420而言,又可细分为yuv420p,yuv420sp,nv21,nv12,yv12,yu12,I420

为什么yuv444,yuv420,yuv422,yuv411都是用的4呢?

因为用到了共享的思想,这是yuv和rgb的本质区别

rgb是一个像素是一个家庭,家庭成员是r,g,b,但是yuv是若干像素是一个家庭,不同像素的y共享同一个u和v,这样,引入了共享的思想,虽然最小单位是一个字节,但实际上描述一个像素点的字节,不一定是字节的整数倍。

1、YUV444

[ y u v ] [ y u v ] [ y u v ] [ y u v ]
[ y u v ] [ y u v ] [ y u v ] [ y u v ]
[ y u v ] [ y u v ] [ y u v ] [ y u v ]
[ y u v ] [ y u v ] [ y u v ] [ y u v ]

1920*1080文件的大小:1920*1080*3(B)

2、YUV422

[ y u ] [ y v ] [ y u ] [ y v ]
[ y v ] [ y u ] [ y v ] [ y u ]
[ y u ] [ y v ] [ y u ] [ y v ]
[ y v ] [ y u ] [ y v ] [ y u ]

显然一个家庭的成员为

[ y u ] [ y v ]

1920*1080文件的大小:1920*1080+1920*1080*0.5+1920*1080*0.5(B)因为UV的数量减少了一半,相对于YUV444空间节省了1/3

3、 YUV420

yuv420的意思似乎是在yuv422的基础上,再拿掉两个v,这样不就没有v了吗?其实yuv420的取名方式不是很高明,更确切的命名为yuv420yuv402,也就是第一行只有U,而第二行只有V

[ y u ] [ y ] [ y u ] [ y ]
[ y v ] [ y ] [ y v ] [ y ]
[ y u ] [ y ] [ y u ] [ y ]

对于yuv420而言,这个家庭的成员为

[ y u ] [ y ]
[ y v ] [ y ]

1920*1080文件的大小:1920*1080+1920*1080*0.25+1920*1080*0.25(B)相对于YUV444空间节省1/2,因此也是比较主流的采样方式。

三种格式packet,planar,semi-plane

packet是打包格式,即存储yuv,然后再存储下一个yuv。
planar是平面格式,即先存储y平面,再存储u平面,最后存储v平面。
semi-planar即先存储y平面,再存储uv平面。

1、yuv422

yuyv(yuy2)

[ y u ] [ y v ] [ y u ] [ y v ]
[ y u ] [ y v ] [ y u ] [ y v ]
[ y u ] [ y v ] [ y u ] [ y v ]
[ y u ] [ y v ] [ y u ] [ y v ]

uyvy

[ u y ] [ v y ] [ u y ] [ v y ]
[ u y ] [ v y ] [ u y ] [ v y ]
[ u y ] [ v y ] [ u y ] [ v y ]
[ u y ] [ v y ] [ u y ] [ v y ]

yuv422p(yu16)或(yv16)

[ y y y y ]
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ u u u u ]
[ u u u u ]
[ v v v v ]
[ v v v v ]
--------------
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ v v v v ]
[ v v v v ]
[ u u u u ]
[ u u u u ]

yuv422sp(nv16)或(nv61)

[ y y y y ]
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ u v u v ]
[ u v u v ]
[ u v u v ]
[ u v u v ]
------------------
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ v u v u ]
[ v u v u ]
[ v u v u ]
[ v u v u ]

2、yuv420
yuv420p(yu12)或(yv12)

[ y y y y ]
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ u u ]
[ u u ]
[ v v ]
[ v v ]
--------------
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ v v ]
[ v v ]
[ u u ]
[ u u ]

yuv420sp(nv12)或(nv21)

[ y y y y ]
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ u v u v ]
[ u v u v ]
---------------
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ v u v u ]
[ v u v u ]

常见的有nv12,nv21,nv16,nv61等,这里代表什么意思呢?
其实nv系列,都属于semi-plane系列
这里nv12表示正常的顺序,即uv plane,先是u,然后是v
而nv21表示相反的顺序,即uv plane,先是v,然后是u

同样,nv16和nv61的区别也是仅仅是uv的次序而已

这里的12和16又代表什么呢?实际上代表的是一个像素所占的位数!
以nv12为例,表示一个像素占用12bit,其中y是定死的占8bit,也就是u占2bit,v占2bit,实际上就是yuv420格式,具体而言是yuv420sp格式
nv16,则表示一个像素占用16bit,其中y是定死的8bit,也即是u占4bit,v占4bit,实际上就是yuv422格式,具体而言是yuv422sp格式

出处:https://www.jianshu.com/p/6a361e86ccd5

编码测试

将YUV422P中的Y、U、V分别分离出来

int simplest_yuv420_split(char *url, int w, int h, int num) {
    FILE *fp = fopen(url, "r");
    if (fp < 0)
        cerr << "File doesn‘t exist.";

    FILE *fy, *fu, *fv;
    fy = fopen("output_420_y.y", "w");
    fu = fopen("output_420_u.y", "w");
    fv = fopen("output_420_v.y", "w");
    if (fv < 0 || fy < 0 || fu < 0)
        cerr << "Cannot create file.";

    //YUV420:Y->w*h + U->w*h*1/4 + V->w*h*1/4
    unsigned char *pic = (unsigned char*)malloc(w * h * 3 / 2);
    for (int i = 0; i < num; ++i)
    {
        fread(pic, 1, w * h * 3 / 2, fp);
        fwrite(pic, 1, w*h, fy);
        fwrite(pic + w * h, 1, w*h * 1 / 4, fu);
        fwrite(pic + w * h * 5 / 4, 1, w*h * 1 / 4, fv);
    }

    free(pic);
    fclose(fp);
    fclose(fy);
    fclose(fu);
    fclose(fv);

    return 0;
}
w、h分别为图像的宽高(px),那么图像的大小就是w*h*3/2(B),那么Y的数据储存位置便是w*h,紧接着的1/4便是U,最后1/4是V。

技术分享图片

转自:https://blog.csdn.net/leixiaohua1020/article/details/50534150(雷霄骅CSDN)

YUV格式

原文:https://www.cnblogs.com/zebra-bin/p/12882117.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!