zoukankan      html  css  js  c++  java
  • YUV格式

    转自:https://www.jianshu.com/p/6a361e86ccd5

    ☞ 对格式采样的理解

    提出yuv格式的原因,是为了解决彩色电视和黑白电视兼容性问题,因此从rgb的颜色空间,转换为yuv的颜色空间,其中y代表亮度,u和v代表色度。
    yuv种类分为很多,可以理解是一个二维的,即空间间,和空间内,这样的表述,借鉴了h264中的帧间和帧内的思想

    为什么这么说呢?
    下面分别从这两种情况阐述一下这个观点:

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

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

    因此,我们在理解yuv格式时,时刻需要记住要从bit数,和存储结构两方面考察

    ☞ 对于4的理解

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

    我仔细的研究了一下,
    首先yuv的命名方式和rgb的命名方式是不相同的,如果是rgb4444,这里的数字代表的是不同颜色分量所占的bit数
    这里,rgb4444代表alpha 4bit,red 4bit,green 4bit,blue 4bit,从宏观上看,是16bit,也就是2字节,但是从微观上看,是以bit区分的

    yuv的命名方式则不是这种情况,yuv不会分细到bit级别,最低最低的单位,也是1字节,即8bit,说到这里,就会抛出一个问题,
    难道每个像素点都需要至少1字节的整数倍来描述吗?
    如果说描述的最小单位是1字节,那么每个像素都是由y,u,v共同描述的,难道说明每个像素点至少都是

    1字节y+1字节u+1字节v = 3字节

    来描述吗?显然这是不合理的,因为人眼对y是很敏感的,但是u和v是可以在一定程度上压缩的,也就是说,同一个像素点,u和v的描述可以小于1字节,那么这是不是和最小单位为一字节矛盾呢?答案是不矛盾,因为用到了共享的思想,这是yuv和rgb的本质区别

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

    该进入正题了,为什么是4?因为这个4,实际上表达了共享的最大单位!也就是最多4个像素进行共享,因此4实际上是隐含的采样全集

    ☞ 不同空间下yuv格式

    这里从空间的角度考虑yuv格式

    ① yuv444

    那么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 ]

    这无疑是最理想的状态了y,u,v都为4,说明大家都是满的

    ② yuv422

    那么,yuv422呢?说明这里,u由4变为2,v由4变为2,也就是在原来满的情况下,每行需要去掉两个u和两个v
    如何去掉呢?最简单的方法就是第一个点保留u,第二个点保留v,第三个点保留u,第四个点保留v ..

    图示如下:

    [ 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 ]

    也就是两个像素点共享uv

    ③ yuv411

    yuv411又是什么情况呢?显然在原来yuv422的基础上,每行再去掉一个u和一个v

    图示如下:

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

    这个家庭的成员为

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

    也就是四个像素点共享uv

    ④ 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 ]

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

    仔细体会yuv420和yuv411的区别
    对于yuv420而言,这个家庭的成员为

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

    也是四个像素点共享uv,但是这个家庭显然比yuv411的家庭关系更近一些

    思考:从这个课题讨论来看,我们是否可以进一步提高yuv的压缩效率?可以更多y共享uv吗?可以自适应吗?

    小结:从这里可以看出,yuv211和yuv422显然格式上是不一样的,因此这里的数字不仅仅代表了比例,还代表了实际的值

    ☞ 三种格式packet,planar,semi-plane

    在这一课题,我们探讨一下相同bit数的不同存储格式,主要讨论yuv422和yuv420

    packet是打包格式,即存储yuv,然后再存储下一个yuv ..
    planar是平面格式,即先存储y平面,再存储u平面,最后存储v平面
    semi-planar是两个平面,正常的planar是三个平面,即y平面,u平面,v平面,现在的semi-planar是两个平面,也就是说uv为同一个平面,即一个y平面,一个uv平面

    ① 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)

    [ 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 ]

    或(yv16)

    [ 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)

    [ 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 ]

    或(nv61)

    [ 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 ]

    ② yuv420

    yuv420p(yu12 / I420)

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

    或(yv12)

    [ 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)

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

    或(nv21)

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

    ☞ 对nv系列理解

    常见的有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格式

  • 相关阅读:
    【SAS NOTE】OUTPUT
    【SAS NOTES】_NULL_
    【SAS NOTE】sas 9.2 安装
    【SAS NOTE】FREQ
    纯数学教程 Page 203 例XLI (1)
    纯数学教程 Page 203 例XLI (3)
    纯数学教程 Page 203 例XLI (2)
    Prove Cauchy's inequality by induction
    纯数学教程 Page 325 例LXVIII (15) 调和级数发散
    纯数学教程 Page 325 例LXVIII (15) 调和级数发散
  • 原文地址:https://www.cnblogs.com/yanwei-wang/p/12749588.html
Copyright © 2011-2022 走看看