* 音视频入门文章目录 *

YUV & YCbCr 简介

  • YUV,是一种颜色编码方法。常使用在各个视频处理组件中。 YUV 在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。

  • Y 表示明亮度(Luminance或Luma),也就是灰阶值,U 和 V 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

  • Y'CbCr 不是一种绝对的色彩空间,是一种针对 RGB 资讯所做的编码。真正的颜色显示是根据实际 RGB 色盘(colorant)来决定的。因此 Y'CbCr 所表示的值只有在标准 RGB 色盘或是 ICC 数据(ICC profile)有提供的时候才能计算。Y'CbCr 在模拟分量影像(analog component video)中也常被称为 YPbPr。

  • YCbCr 不是一种绝对色彩空间,是 YUV 压缩和偏移的版本。YCbCr 的 Y 与 YUV 中的 Y 含义一致,Cb 和 Cr 与 UV 同样都指色彩,Cb 指蓝色色度,Cr 指红色色度,在应用上很广泛,JPEG、MPEG、DVD、摄影机、数字电视等皆采此一格式。

  • [ [ [ 因此一般俗称的 YUV 大多是指 YCbCr ] ] ]。

  • [ [ [ 因此一般俗称的 YUV 大多是指 YCbCr ] ] ]。

  • [ [ [ 因此一般俗称的 YUV 大多是指 YCbCr ] ] ]。

YUVFormats分成两个格式:

  • 紧缩格式(packedformats):将 Y、U、V 值存储成 MacroPixels 数组,和 RGB 的存放方式类似。

  • 平面格式(planarformats):将 Y、U、V 的三个分量分别存放在不同的矩阵中。

紧缩格式(packedformat)中的 YUV 是混合在一起的,对于 YUV4:4:4 格式而言,用紧缩格式很合适的,因此就有了 UYVY、YUYV 等。

平面格式(planarformats)是指每 Y 分量,U 分量和 V 分量都是以独立的平面组织的,也就是说所有的 U 分量必须在 Y 分量后面,而 V 分量在所有的 U 分量后面,此一格式适用于采样(subsample)。平面格式(planarformat)有 I420(4:2:0)、YV12、IYUV 等。

YUV 采样格式

为节省带宽起见,大多数 YUV 格式平均使用的每像素位数都少于 24 位。主要的采样(subsample)格式有 YCbCr4:2:0、YCbCr4:2:2、YCbCr4:1:1 和 YCbCr4:4:4。YUV 的表示法称为 A:B:C 表示法:

  • 4:4:4 表示完全取样。
  • 4:2:2 表示 2:1 的水平取样,垂直完全采样。
  • 4:2:0 表示 2:1 的水平取样,垂直 2:1 采样。
  • 4:1:1 表示 4:1 的水平取样,垂直完全采样。

表格中,每一格代表一个像素

未采样前

- 1 2 3 4
1 Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
2 Y4 U4 V4 Y5 U5 V5 Y6 U6 V6 Y7 U7 V7
3 Y8 U8 V8 Y9 U9 V9 Y10 U10 V10 Y11 U11 V11
4 Y12 U12 V12 Y13 U13 V13 Y14 U14 V14 Y15 U15 V15

4:4:4 采样

4:4:4 表示完全取样

- 1 2 3 4
1 Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
2 Y4 U4 V4 Y5 U5 V5 Y6 U6 V6 Y7 U7 V7
3 Y8 U8 V8 Y9 U9 V9 Y10 U10 V10 Y11 U11 V11
4 Y12 U12 V12 Y13 U13 V13 Y14 U14 V14 Y15 U15 V15

映射的像素:

- 1 2 3 4
1 Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
2 Y4 U4 V4 Y5 U5 V5 Y6 U6 V6 Y7 U7 V7
3 Y8 U8 V8 Y9 U9 V9 Y10 U10 V10 Y11 U11 V11
4 Y12 U12 V12 Y13 U13 V13 Y14 U14 V14 Y15 U15 V15

4:2:2 采样

4:2:2 表示 2:1 的水平取样,垂直完全采样

每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一个采集一个。

- 1 2 3 4
1 Y0 U0 - Y1 - V1 Y2 U2 - Y3 - V3
2 Y4 U4 - Y5 - V5 Y6 U6 - Y7 - V7
3 Y8 U8 - Y9 - V9 Y10 U10 - Y11 - V11
4 Y12 U12 - Y13 - V13 Y14 U14 - Y15 - V15

映射的像素:

- 1 2 3 4
1 Y0 U0 V1 Y1 U0 V1 Y2 U2 V3 Y3 U2 V3
2 Y4 U4 V5 Y5 U4 V5 Y6 U6 V7 Y7 U6 V7
3 Y8 U8 V9 Y9 U8 V9 Y10 U10 V11 Y11 U10 V11
4 Y12 U12 V13 Y13 U12 V13 Y14 U14 V15 Y15 U14 V15

4:2:0 采样

4:2:0 表示 2:1 的水平取样,垂直 2:1 采样

每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一行按照 2 : 1 进行采样。

- 1 2 3 4
1 Y0 U0 - Y1 - - Y2 U2 - Y3 - -
2 Y4 - V4 Y5 - - Y6 - V6 Y7 - -
3 Y8 U8 - Y9 - - Y10 U10 - Y11 - -
4 Y12 - V12 Y13 - - Y14 - V14 Y15 - -

映射的像素:

- 1 2 3 4
1 Y0 U0 V4 Y1 U0 V4 Y2 U2 V6 Y3 U2 V6
2 Y4 U0 V4 Y5 U0 V4 Y6 U2 V6 Y7 U2 V6
3 Y8 U8 V12 Y9 U8 V12 Y10 U10 V14 Y11 U10 V14
4 Y12 U8 V12 Y13 U8 V12 Y14 U10 V14 Y15 U10 V14

4:1:1 采样

4:1:1 表示 4:1 的水平取样,垂直完全采样

每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一行按照 2 : 1 进行采样。

- 1 2 3 4
1 Y0 U0 - Y1 - - Y2 - V2 Y3 - -
2 Y4 U4 - Y5 - - Y6 - V6 Y7 - -
3 Y8 U8 - Y9 - - Y10 - V10 Y11 - -
4 Y12 U12 - Y13 - - Y14 - V14 Y15 - -

映射的像素:

- 1 2 3 4
1 Y0 U0 V2 Y1 U0 V2 Y2 U0 V2 Y3 U0 V2
2 Y4 U4 V6 Y5 U4 V6 Y6 U4 V6 Y7 U4 V6
3 Y8 U8 V10 Y9 U8 V10 Y10 U8 V10 Y11 U8 V10
4 Y12 U12 V14 Y13 U12 V14 Y14 U12 V14 Y15 U12 V14

YUV 存储方式

YUV 的存储方式,一般有两种方式,一种叫 packed 模式,一种叫 planar 模式。packed 模式 Y,U,V 交错排列,而 planar 模式 Y 和 U,V 的排列是分开的,而具体 U 与 V 继续分开或者继续交错排列根据具体的格式相关。

常见的基于 YUV422 采样的格式:

YUV422 采样
YUYV 格式
UYVY 格式
YUV422P 格式

常见的基于 YUV420 采样的格式:

YUV420P 类型 YUV420SP 类型
YV12 格式 YU12 格式
NV12 格式 NV21 格式

基于 YUV444 采样的格式

4x4 像素 YUV444 采样:

- 1 2 3 4
1 Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
2 Y4 U4 V4 Y5 U5 V5 Y6 U6 V6 Y7 U7 V7
3 Y8 U8 V8 Y9 U9 V9 Y10 U10 V10 Y11 U11 V11
4 Y12 U12 V12 Y13 U13 V13 Y14 U14 V14 Y15 U15 V15

YUV444P 格式

存储时:

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
U0 U1 U2 U3 U4 U5 U6 U7
U8 U9 U10 U11 U12 U13 U14 U15
V0 V1 V2 V3 V4 V5 V6 V7
V8 V9 V10 V11 V12 V13 V14 V15

基于 YUV422 采样的格式

4x4 像素 YUV422 采样:

- 1 2 3 4
1 Y0 U0 - Y1 - V1 Y2 U2 - Y3 - V3
2 Y4 U4 - Y5 - V5 Y6 U6 - Y7 - V7
3 Y8 U8 - Y9 - V9 Y10 U10 - Y11 - V11
4 Y12 U12 - Y13 - V13 Y14 U14 - Y15 - V15

YUYV 格式

YUYV 格式是采用打包格式进行存储的,指每个像素点都采样 Y 分量,但是每隔一个像素采样它的 UV 分量。

存储时(每个方括号里是 Macropixel=2 image pixels):

[Y0  U0  Y1  V1 ][Y2  U2  Y3  V3 ]
[Y4 U4 Y5 V5 ][Y6 U6 Y7 V7 ]
[Y8 U8 Y9 V9 ][Y10 U10 Y11 V11]
[Y12 U12 Y13 V13][Y14 U14 Y15 V15]

对 U,V 分量重新编号:

[Y0  U0  Y1  V0 ][Y2  U1  Y3  V1 ]
[Y4 U2 Y5 V2 ][Y6 U3 Y7 V3 ]
[Y8 U4 Y9 V4 ][Y10 U5 Y11 V5 ]
[Y12 U6 Y13 V6 ][Y14 U7 Y15 V7 ]

UYVY 格式

UYVY 格式也是采用打包格式进行存储,它的顺序和 YUYV 相反,先采样 U 分量再采样 Y 分量。

存储时(每个方括号里是 Macropixel=2 image pixels):

[U0  Y0  V1  Y1 ][U2  Y2  V3  Y3 ]
[U4 Y4 V5 Y5 ][U6 Y6 V7 Y7 ]
[U8 Y8 V9 Y9 ][U10 Y10 V11 Y11]
[U12 Y12 V13 Y13][U14 Y14 V15 Y15]

对 U,V 分量重新编号:

[U0 Y0  V0 Y1 ][U1 Y2  V1 Y3 ]
[U2 Y4 V2 Y5 ][U3 Y6 V3 Y7 ]
[U4 Y8 V4 Y9 ][U5 Y10 V5 Y11]
[U6 Y12 V6 Y13][U7 Y14 V7 Y15]

YUV422P 格式(又叫做 I422)

YUV422P 格式,又叫做 I422,采用的是平面格式进行存储,先存储所有的 Y 分量,再存储所有的 U 分量,再存储所有的 V 分量。

存储时:

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
U0 U2 U4 U6 U8 U10 U12 U14
V1 V3 V5 V7 V9 V11 V13 V15

对 U,V 分量重新编号:

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
U0 U1 U2 U3 U4 U5 U6 U7
V0 V1 V2 V3 V4 V5 V6 V7

基于 YUV420 采样的格式

YUV420P 和 YUV420SP 都是基于 Planar 平面模式进行存储的。

4x4 像素 YUV420 采样:

- 1 2 3 4
1 Y0 U0 - Y1 - - Y2 U2 - Y3 - -
2 Y4 - V4 Y5 - - Y6 - V6 Y7 - -
3 Y8 U8 - Y9 - - Y10 U10 - Y11 - -
4 Y12 - V12 Y13 - - Y14 - V14 Y15 - -

YUV420P 类型

YUV420P 类型先存储所有的 Y 分量后,会先存储所有的 U 分量或者 V 分量。

YU12 和 YV12 格式都属于 YUV420P 类型,即先存储 Y 分量,再存储 U、V 分量,区别在于:YU12 是先 Y 再 U 后 V,而 YV12 是先 Y 再 V 后 U 。

YU12 格式(又叫做I420)

YU12 是先 Y 再 U 后 V

存储时:

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
U0 U2 U8 U10 V4 V6 V12 V14

对 U,V 分量重新编号:

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
U0 U1 U2 U3 V0 V1 V2 V3

YV12 格式

YV12 是先 Y 再 V 后 U

存储时:

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
V4 V6 V12 V14 U0 U2 U8 U10

对 V,U 分量重新编号:

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
V0 V1 V2 V3 U0 U1 U2 U3

YUV420SP 类型

YUV420SP 类型先存储所有的 Y 分量后,是按照 UV 或者 VU 的交替顺序进行存储。

NV12 和 NV21 格式都属于 YUV420SP 类型。它也是先存储了 Y 分量,但接下来并不是再存储所有的 U 或者 V 分量,而是把 UV 分量交替连续存储。

NV12 格式

NV12 是 iOS 中有的模式,它的存储顺序是先存 Y 分量,再 UV 进行交替存储。

存储时:

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
U0 V4 U2 V6 U8 V12 U10 V14

对 U,V 分量重新编号:

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
U0 V0 U1 V1 U2 V2 U3 V3

NV21 格式

NV21 是 Android 中有的模式,它的存储顺序是先存 Y 分量,在 VU 交替存储。

存储时:

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
V4 U0 V6 U2 V12 U8 V14 U10

对 U,V 分量重新编号:

Y0  Y1  Y2  Y3  Y4  Y5  Y6  Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
V0 U0 V1 U1 V2 U2 V3 U3

参考资料:

维基百科-YUV

维基百科-YCbCr

百度百科-YUV

百度百科-YCbCr

一文读懂 YUV 的采样与格式

内容有误?联系作者:


音视频入门-07-认识YUV的更多相关文章

  1. 音视频入门-08-RGB&YUV

    * 音视频入门文章目录 * YUV & RGB 相互转换公式 YCbCr 的 Y 与 YUV 中的 Y 含义一致,Cb 和 Cr 与 UV 同样都指色彩,Cb 指蓝色色度,Cr 指红色色度,在 ...

  2. 音视频入门-10-使用libyuv对YUV数据进行缩放、旋转、镜像、裁剪、混合

    * 音视频入门文章目录 * libyuv libyuv 是 Google 开源的实现各种 YUV 与 RGB 之间相互转换.旋转.缩放等的库.它是跨平台的,可在 Windows.Linux.Mac.A ...

  3. 音视频入门-09-RGB&YUV互转-使用开源库

    * 音视频入门文章目录 * 介绍开源库 使用第三方开源库来简化开发,屏蔽一些底层的复杂度,节省大量编写代码的时间. libyuv: Google 开源的实现各种 YUV 与 RGB 之间相互转换.旋转 ...

  4. 音视频入门-01-认识RGB

    * 音视频入门文章目录 * RGB 简介 RGB 色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB 即是代表红 ...

  5. 音视频入门-11-PNG文件格式详解

    * 音视频入门文章目录 * PNG 文件格式解析 PNG 图像格式文件由一个 8 字节的 PNG 文件署名域和 3 个以上的后续数据块(IHDR.IDAT.IEND)组成. PNG 文件包括 8 字节 ...

  6. 音视频入门-12-手动生成一张PNG图片

    * 音视频入门文章目录 * 预热 上一篇 [PNG文件格式详解]详细介绍了 PNG 文件的格式. PNG 图像格式文件由一个 8 字节的 PNG 文件署名域和 3 个以上的后续数据块(IHDR.IDA ...

  7. 音视频入门-14-JPEG文件格式详解

    * 音视频入门文章目录 * JPEG 文件格式解析 JPEG 文件使用的数据存储方式有多种.最常用的格式称为 JPEG 文件交换格式(JPEG File Interchange Format,JFIF ...

  8. 音视频入门-13-使用开源库生成PNG图片

    * 音视频入门文章目录 * RGB-to-PNG 回顾 上一篇 [手动生成一张PNG图片] 根据 [PNG文件格式详解] 一步一步地手动实现了将 RGB 数据生成了一张 PNG 图片. 有许多开源的 ...

  9. 音视频入门-05-RGB-TO-BMP使用开源库

    * 音视频入门文章目录 * RGB-TO-BMP 回顾 将 RGB 数据转成 BMP 图片: 了解 BMP 文件格式 准备 BMP 文件头信息 准备 BMP 信息头 BMP 存储 RGB 的顺序是 B ...

随机推荐

  1. ubuntu18设置root账号的开机登录

    date: 2019-08-20  17:36:49 author: headsen chen notice :个人原创 1,用普通用户登录. su - root 打开终端 vi /etc/pam.d ...

  2. Flutter 目录结构介绍、入口、自定义 Widget、MaterialApp 组件、Scaffold 组件

    Flutter 目录结构介绍 文件夹 作用 android android 平台相关代码 ios ios 平台相关代码 lib flutter 相关代码,我们主要编写的代 码就在这个文件夹 test ...

  3. osg 渲染ifc数据-测试

    直接使用osg渲染ifc数据,提高渲染速度. #include "teslamanage.h" #include <QtWidgets/QApplication> #i ...

  4. SftpUtil FTP文件上传

    package ftputil; import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream; ...

  5. Linux记录-limits.conf 配置

    limits.conf 文件实际是 Linux PAM(插入式认证模块,Pluggable Authentication Modules)中 pam_limits.so 的配置文件,而且只针对于单个会 ...

  6. 123457123456#0#-----com.tym.NaojingJiZhuanWan--前拼后广--脑筋急转弯

    com.tym.NaojingJiZhuanWan--前拼后广--脑筋急转弯

  7. 抓取二维数组某值出来,到一维数组---array_column

    /*** * '抓取二维数组某值出来,到一维数组' * @param $arr * @param $item * @return array */ function get_arr_item_val( ...

  8. C++高精度整数加减乘除模板

    其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的. 其中高精度除法返回一对string,分别表示商和余数. 代码: #include <bits/stdc++.h> ...

  9. LeetCode:打印零与奇偶数【1116】

    LeetCode:打印零与奇偶数[1116] 题目描述 假设有这么一个类: class ZeroEvenOdd { public ZeroEvenOdd(int n) { ... } // 构造函数 ...

  10. 【转】mysql 存储过程的示例

    原文地址:https://blog.csdn.net/lishaojun0115/article/details/50183661 begin #定义变量 declare local_sender v ...