zoukankan      html  css  js  c++  java
  • 像素数据YUV简介与数据存储格式介绍

    主要学习链接:博客园51CTO

    前言

    照例是先废话几句,下面的内容都是在学习时从网上找来的,并非我原创,我之所以要写这篇笔记是因为网的内容都很分散,找的时候要从各个地方看,很不方便,所以就自己总结了一篇,同样的,如果你搜到了这篇文章且有地方没看懂,请评论让我知道,谢谢!如果看懂了且对你有帮助可以点个赞:)

    认识YUV

    以下我的理解,因为学习时间不久,可能不一定准确:

    YUVRGB一样,都是像素数据的编码格式,一组YUV渲染屏幕上的一个像素,控制屏幕用色彩的形式将事物表现出来,其中Y表示像素中的亮度,英文是LuminanceU表示色度,英文是ChrominanceV表示浓度或饱和度,英文是Chroma。这是一种压缩后的颜色表示方法,占用更少的物理空间,且对颜色的表现失真不明显,所以现在非常常用,我见过的很多视频在播放时都是使用这种形式展现的。

    YUV的宏观存储方式

    在宏观上,YUV有两种存储方式:planarpacked

    planar:从字面意思上来看,planar是平面的意思,平面比较平整,对应到存储方式上就是把YUV三种分量分别存储,以I420为例,存储方式为:YYYYYYYYUUVV,简单明了,先把Y存完,再存U,再存V,这种在解析时很方便

    packed:从字面意思来看,packed是打包的意思,打包就不一定是平整的了,对应到存储方式上就是把YUV三种分量交叉存储,以YUY2为例,存储方式为:Y0U0Y1V0 Y2U1Y3V1,这种方式在解析时就会比较麻烦

    上面只是举了两个觉的例子,事实上还有很多其它的格式,后面一一细讲。

    采样方式

    采样方式即如何表现一个像素,现在主流的有三种采样方式,444422420,这三种比例是YUV三种分量的比例,咱们前面说过像素是用YUV三个分量控制显示的,所以一个像素应该包含一个Y,一个U,一个V,如果要完全存储,那一个一个像素点就要存储YUV三个分量,这种形式就是444了。但是因为人的眼睛对色度和饱和度不是特别敏感,所以一定程度上丢失一部分UV并不影响我们分辨颜色,所以聪明的先驱们为了节省存储空间,在存储时就故意丢掉部分UV分量,用两个Y分量共用一组UV分量,这种形式就是422,或用四个Y分量共用一组UV,这种形式就是420了。用网上找的图表示比较形象。

    下图中以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量

     

    在存储时YUV各占一个字节Byte,如果444方式,那一个256X256分辨率的图片要占用256×256×3=196608Byte422方式要占用256×256×2=131072Byte420方式要占用256×256×2/3=43690.7Byte,可以看到采用420方式存储空间整整减少了一半。

    常见存储格式

    YU12/I420

    该格式属于420类型,存储方式上面已经说过,就是先存储把全部的Y分量存完,再存U分量,最后存V分量,从网上找了一张很形象的图:

    可以看到,第一行的Y1Y2和第二行的Y7Y8共同使用一组UV分量U1V1

    YV12

    该格式与YU12基本一样,唯一的区别是先存储V分量再存储U分量,对应到上图把第五行和第六行位置互换一下就是了。

    以上两种格式我们可以看到都是420的,因为都是planar方式存储,简称420p

    除了上面两种,还有两种420NV12NV21,这两种是比较特殊的存储格式,是planarpacked混合存储的,分别看下

    NV12

    该格式是先存储全部的Y分量,然后UV分量交叉存储,用图像表示下:

     

    很直观,不多说了。

    NV21

    该格式与NV21的区别和上面YU12/YV12一样,唯一的区别只是UV分量交叉的顺序不同,NV12U排前面,NV21V排前面,用图像表示如下:

     

    上面两种虽然也是420类型,但是并不是完全的planar格式,所以又称为420sp,与420p进行区分。

    上面说的都是420类型的,下面说几个422类型较常见的

    YUV422P

    名字中带P表示是planar格式存储,该格式存储方式与I420是一样的,唯一的区别是UV分量的数量不同,I420中四个Y共用一组UV,而该格式中两个Y共用一组UV,也就是说UV分量相对于I420在数量上多了一倍,从网上找了一张图,如下:

     

    如上图,在渲染时Y00Y01会共用U00V00.

    YUYV/YUY2

    该格式属于422类型,且是用packed形式存储的,上面也简单的说过,存储方式如下图:

     

    可以看到,每两个Y分量共用一组UV分量,存储顺序是YUYV

    YVYU

    该格式与YUYV相似,只是存储时UV分量顺序不同而已,为YVYU

    UYVY

    该格式也是422类型,与上面两种方式并无大的不同,从网上找了一张图如下:

     

     可以看到存储时YUV分量的顺序如名字所示:UYVY

    结语

    上面是比较常见的存储格式,除了这些还有其它的,但是我个人查找资料看来,用的并不多,所以就没记录。

  • 相关阅读:
    MVC 网页制作
    Mvc 中国直辖市下拉列表(三级联动)
    MVC 登陆注册页面
    MVC 数据库增删改查(Razor)视图(2)
    MVC 数据库增删改查(Razor)方法(1)和数据库
    winform网页抓取邮箱单发群发并有附件
    winform截取网页邮箱
    winform 图标表chart
    winform图片读取存储于数据库SQL
    winform计算器
  • 原文地址:https://www.cnblogs.com/daner1257/p/10767570.html
Copyright © 2011-2022 走看看