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格式

  • 相关阅读:
    进度条
    打开文件的功能代码 JFileChooser
    我对JAVA的初认知
    集合之五:Set接口
    集合之四:List接口
    集合之三:泛型
    Maven web项目(简单的表单提交) 搭建(eclipse)
    集合之二:迭代器
    集合之一:集合概述
    java的函数
  • 原文地址:https://www.cnblogs.com/yanwei-wang/p/12749588.html
Copyright © 2011-2022 走看看