YUV各种采样格式的说明

通常我们用RGB表示一种彩色。计算机系统里的LCD显示的数据就是RGB来表示每个像素的颜色。
而在我们生活里,有黑白电视机与彩色电视机两种,拍摄节目源时不可以用两种不同的摄像机来存放两种图像数据。
所以为了兼容两种电视机,专家就引入YUV格式代替RGB,其中Y表示亮度, U和V表示色差。 黑白电视机只用Y信号, 而彩色电视机可由YUV转换成RGB再显示颜色。

通常我们所用的YUV格式是 ITU-R 的标准 , 也叫YCbCr.

YUV是由RGB格式的数据转换得来。

Y    Y = 0.299 x R + 0.587 x G + 0.114 x B +
U Cb = -0.169 x R - 0.331 x G + 0.499 x B +
V Cr = 0.499 x R - 0.418 x G - 0.0813 x B + Y Y = 0.299 x R + 0.587 x G + 0.114 x B +
U Cb = -0.169 x R - 0.331 x G + 0.499 x B +
V Cr = 0.499 x R - 0.418 x G - 0.0813 x B +

///////
YUV4:4:4 
其实就是YUV的数据各占用8位, 每个像素都由YUV组成

同一行的相邻4个像素数据:   Y0U0V0    Y1U1V1   Y2U2V2  Y3U3V3
存储时: Y0U0V0 Y1U1V1 Y2U2V2 Y3U3V3 //即每个像素YUV的数据都会存放起来
为什么叫4:: , 意思就是4个像素里的数据有4个Y, 4个U, 4个V

//////
YUV4:2:2
其实绝大部分相邻的两个像素,数据差异应不大。所以为了节点空间便于存储,丢失每个像素的部分数据。
专家研究表明我们人对亮度比较敏感,而对色彩不怎么敏感。所以每个像素的亮度Y数据是绝对不动的,而色差数据可以进行丢弃。

同一行的相邻4个像素数据:   Y0U0V0    Y1U1V1   Y2U2V2  Y3U3V3
   存储时: Y0U0 Y1V1    Y2U2   Y3V3 // 每两个相邻的像素, 一个丢弃V数据,一个丢弃U数据
为什么叫4::, 意思就是相邻的4个像素里有4个Y, 2个U, 2个V。 按上面存储的顺序也叫YUYV. 但还原成RGB数据必须需要YUV, 像第一个像素只有Y0U0是没法还原的,这时只能用下一像素的V1数据。
还原时的YUV: [Y0U0V1] [Y1U0V1] [Y2U2V3] [Y3U2V3] // 这样还原理论上会对图像的质量有影响的,但我们看不出来的.

/////
YUV4:2:0
专家们进一步研究表示,每一行的相邻两个像素与下一行同位置的两个像素数据差异不大,可以进一步的丢数据。

如两行的像素数据:
Y00U00V00 Y01U01V01 Y02U02V02 Y03U03V03 ....
Y88U88V88 Y89U89V89 Y90U90V90 Y91U91V91 .... 存储时: Y00U00    Y01      Y02U02   Y03 // 每个像素的Y数据保留, 两个像素数据只保留一个U数据。这一行不保留V数据(YUV: 420)
Y88V88    Y89      Y90V90   Y91 // .... 两个像素数据只保留一个V数据, 这行不保留U数据(YUV: 402) 还原时只能相同位置的上下两行4个像素结合还原:
Y00U00V88 Y01U00V88 Y02U02V90 Y03U02V90
Y88U00V88 Y89U00V88 Y90U02V90 Y91U02V90

YUV各种采样格式的比较

我们以一张大小为1280*720的图像为例:
在RGB 图像中,每个像素点都有红、绿、蓝三个原色,其中每种原色都占用 8 bit,也就是一个字节,那么一个像素点也就占用 24 bit,也就是三个字节。
一张 1280 * 720 大小的图片,就占用 1280 * 720 * 3 / 1024 / 1024 = 2.63 MB 存储空间。

【使用YUV4:4:4格式采样的大小】
YUV4:4:4格式意味着Y、U、V三个分量的采集比例相同,因此在生成的图像里,每个像素的三个分量信息完整,都是8bit,也就是一个字节。
那么它的采样大小为
3 * 1280 * 720 / 1024 / 1024 = 2.63MB
与原始RGB图像相比大小是一样的。

【使用YUV4:2:2格式采样的大小】
YUV4:2:2格式的采样特征是在每相临的两个像素,一个丢弃U分量,一个丢弃V分量,那么它的采样大小为:
(8 + 8) * 1280 * 720 / 8 / 1024 / 1024 = 1.76MB
可以看到 YUV 4:2:2 采样的图像比 RGB 模型图像节省了三分之一的存储空间,在传输时占用的带宽也会随之减少。

【使用YUV4:2:0格式采样的大小】
YUV4:2:0格式的采样特征是所有像素都保留Y分量,同一行的像素只保留U分量,或者是V分量,同一行中相临的两个像素只保留同一个Y分量或者U分量。
那么它的采样大小为:
(8 * 1280 * 720 + 8 * 1280 * 720 / 2 / 2 + 8 * 1280 * 720 / 2 / 2) / 8 / 1024 / 1024 = 1.32MB
可以看到 YUV 4:2:0 采样的图像比 RGB 模型图像节省了一半的存储空间,因此它也是比较主流的采样方式。

参考链接:

1.一文读懂 YUV 的采样与格式

2.最简单解释 YUV444,YUV422,YUV420中的4,2,0

音视频编解码: YUV采样格式中的YUV444,YUV422,YUV420理解的更多相关文章

  1. Android 音视频编解码——YUV视频格式详解

    一.YUV 介绍 YUV是一种颜色编码方方式,通常由彩色摄像机进行取像,然后把取得的彩色图像信号经过分色.分别放大校正后得到RGB,再经过矩阵变换得到亮度信号Y和两个色差信号B-Y(即U).R-Y(即 ...

  2. 音视频编解码——YUV视频格式详解

    一.YUV 介绍 YUV是一种颜色编码方方式,通常由彩色摄像机进行取像,然后把取得的彩色图像信号经过分色.分别放大校正后得到RGB,再经过矩阵变换得到亮度信号Y和两个色差信号B-Y(即U).R-Y(即 ...

  3. 音视频编解码: YUV存储格式中的YUV420P,YUV420SP,NV12, NV21理解(转)

    概述  之前介绍了YUV码流的采样格式,下面分析下YUV码流的存储格式,YUV码流的存储格式与采样格式息息相关.总的来讲,YUV存储格式主要分为两种: planar 平面格式 指先连续存储所有像素点的 ...

  4. 音视频编解码技术(一):MPEG-4/H.264 AVC 编解码标准

    一.H264 概述 H.264,通常也被称之为H.264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC) 1. H.264视频编解码的意义 H.264的出现就是为了创 ...

  5. [转帖]AVS音视频编解码技术了解

    AVS高清立体视频编码器 电视技术在经历了从黑白到彩色.从模拟到数字的技术变革之后正在酝酿另一场技术革命,从单纯观看二维场景的平面电视跨越到展现三维场景的立体电视3DTV.3DTV系统的核心问题之一是 ...

  6. 【FFMPEG】各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式

    目录(?)[-] 编解码学习笔记二codec类型 编解码学习笔记三Mpeg系列Mpeg 1和Mpeg 2 编解码学习笔记四Mpeg系列Mpeg 4 编解码学习笔记五Mpeg系列AAC音频 编解码学习笔 ...

  7. 集显也能硬件编码:Intel SDK && 各种音视频编解码学习详解

    http://blog.sina.com.cn/s/blog_4155bb1d0100soq9.html INTEL MEDIA SDK是INTEL推出的基于其内建显示核心的编解码技术,我们在播放高清 ...

  8. 【miscellaneous】各种音视频编解码学习详解

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...

  9. FFmpeg音视频编解码实践总结

    PS:由于目前开发RTSP服务器传输模块时用到了h264文件,所以攻了一段时间去实现h264的视频编解码,借用FFmpeg SDK实现了任意文件格式之间的转换,并实现了流媒体实时播放,目前音视频同步需 ...

随机推荐

  1. Burp Suite之截断代理功能及相关设置(一)

    Burpsuite 1.burpsuite 简介2.设置代理3.Target4.爬网模块5.扫描模块6.扩展模块7.intrude8.Repeater9.Sequencer10.Decoder11.C ...

  2. mac下配置Apache虚拟域名方案,以及遇到的坑

      1. 配置Apache虚拟域名 1.执行    sudo vi /etc/apache2/httpd.conf 开始配置httpd.conf 的文件; //配置listen 80端口(默认配置), ...

  3. 每天刷Web面试题(前10天汇总)

    一.算法题部分   1. 如何获取浏览器URL中查询字符串中的参数? function getParamsWithUrl(url) {       var args = url.split('?'); ...

  4. 2016年3月11日Android学习日记

    1.调试技巧:当一次调试过后,可以在App重新返回当前的状态,然后再调试,而不用再点击Android studio的Debug按钮. 参考:http://www.2cto.com/kf/201506/ ...

  5. 数据结构+算法面试100题~~~摘自CSDN

    数据结构+算法面试100题~~~摘自CSDN,作者July 1.把二元查找树转变成排序的双向链表(树) 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调 ...

  6. 【熊掌号mip插件】织梦DEDECMS百度熊掌号mip改造教程

    第一部分:模板修改 1.js部分:删除或使用现有组件替换 2.调用百度mip文件: head里加<link rel="stylesheet" type="text/ ...

  7. CentOS 7卸载Docker

    1.先查询所有安装的包 yum list installed | grep docker*或者rpm -qa docker* 2.删除查询出来的包 # 一般情况会有一个 yum remove -y d ...

  8. WTL中最简单的实现窗口拖动的方法(转)

    目前,很多基于对话框的应用程序中对话框都是不带框架的,也就是说对话框没有标题栏.众所周知,窗口的移动都是通过鼠标拖动窗口的标题栏来实现的,那么现在应用程序中的对话框没有了标题栏,用户如何移动对话框呢? ...

  9. Java 多线程(七) 线程间的通信——wait及notify方法

    线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/ ...

  10. Linux TC(Traffic Control)框架原理解析

    近日的工作多多少少和Linux的流控有点关系.自打几年前知道有TC这么一个玩意儿而且多多少少理解了它的原理之后,我就没有再动过它,由于我不喜欢TC命令行,实在是太繁琐了.iptables命令行也比較繁 ...