理解YUV格式

做视频图像处理,YUV 格式是需要掌握的最基本的知识点

颜色空间

YUV是一个颜色空间,RGB是大家非常熟悉的另外一个颜色空间。

常用的颜色空间有:

  • YUV,用于视频图像的压缩、显示等。
  • RGB/RGBA,用于graphic上的显示等,最为常见。
  • HSL/HSV,同样用于显示。
  • CMYK,用于印刷之类。

比特深度/位深

每个数据采用几个比特表示,位深越大,表示数据的阶数越多

一般最为常见的是 8bit,也就是一个像素。现在已经有 10bit 视频流。医学显示器上位深可以达到 12bit

颜色空间

RGB颜色空间

RGB颜色空间是指每种颜色都可以用三原色来表示,RGB 分别取不同的值,展示不同的颜色。

RGB 相同时,可以简单降为灰度图。#000000表示黑色,#ffffff表示白色,是非常直观的,也易于理解

image-20200831163914279

用RGB表示的图像,每个像素点都有三原色,每种颜色都会占用 8bit,即一个字节,所以一个像素点占用 24bit,即 3 个字节

image-20200831171055478

假设,现在有一张 1920 * 1080 大小的图片,该图片就会有 1920 * 1080 个像素点,其中每个像素点都采用 RGB 颜色编码格式

那么,这张图片就会占用 1920 * 1080 * 3 / 1024 / 1024 = 5.932617188MB 的存储空间。

YUV颜色空间

YUV颜色空间与RGB颜色空间具有不同的标准,YUV格式有3 个分量:

- Y 亮度
- U/V 色度分量

和 RGB 类似,每个像素点都包含 Y、U、V 3个分量

image-20200831170247895

YUV 格式就相对没有那么直观。

YUV 的意义前面有介绍,其中U/V两个分量是有符号的,对比 8bit 的情况下,可以认为是有 bias = -2^7

因此,Y 的取值范围是[0, 255],U/V的取值范围是[-127, 128]

当 U/V 为 0 的时候,表示没有颜色,颜色为灰色,其二进制表示为0x80。(0x80 - bias = 0

所以0x008080是黑色,0xff8080 为白色

image-20200831171109106

采样率

YUV格式有 4:4:4, 4:2:2, 4:2:0 三种常见的采样方式

  • 4:4:4,每个像素采样YUV三个分量
  • 4:2:2,每个像素采样Y分量,UV分量水平方向每两个像素采样一次
  • 4:2:0,每个像素采样Y分量,UV分量水平、垂直方向每4个像素采样一次

image-20200901145018057

之所以压缩视频采用YUV格式,最主要的原因是人的眼睛的物理特性。

人的眼睛对亮度信息最为敏感,颜色信息相对没有那么明显。

因此降低对色度的采样,可以基本保持视觉效果不变。

结合采样率和位深概念,有 bit per pixel 的概念,即平均每个像素需要多少比特

YUV 4:4:4

每个像素的 YUV 分量的采样比例都是相同。

简单理解为:原始像素原样输出,没有任何压缩

  • 假设原始图形的像素为:

    [Y0,U0,V0]、[Y1,U1,V1]、[Y2,U2,V2]、[Y3,U3,V3]

  • YUV4:4:4 采样的码流:

    Y0,U0,V0,Y1,U1,V1,Y2,U2,V2,Y3,U3,V3

  • 映射还原的像素点:

    [Y0,U0,V0]、[Y1,U1,V1]、[Y2,U2,V2]、[Y3,U3,V3]

假设每个分量占用 8bit,一个像素点占用1个字节,那么,与 RGB 颜色编码相比,存储空间并没有减少。

假设,现在有一张 1920 * 1080 大小的图片,该图片就会有 1920 * 1080 个像素点,其中每个像素点都采用 YUV 4:4:4 颜色编码格式

那么,这张图片就会占用 1920 * 1080 * 3 / 1024 / 1024 = 5.932617188MB 的存储空间。

YUV 4:2:2

每个像素采样Y分量是UV分量的 2 倍,即 Y 分量与 UV 分量是按照 2:1 的比例采样。

简单总结:每个像素采样 Y 分量,UV分量水平方向每两个像素采样一次

  • 假设原始图像的像素为:

    [Y0,U0,V0]、[Y1,U1,V1]、[Y2,U2,V2]、[Y3,U3,V3]

  • YUV4:2:2 采样的码流:

    Y0,U0,Y1,V1,Y2,U2,Y3,V3

  • 映射还原的像素点:

    [Y0,U0,V1]、[Y1,U0,V1]、[Y2,U2,V3]、[Y3,U2,V3]

假设,现在有一张 1920 * 1080 大小的图片,该图片就会有 1920 * 1080 个像素点,其中每个像素点都采用 YUV 4:2:2 颜色编码格式

Y分量的字节数 = 1920 * 1080 * 8

UV分量的字节数 = 1920 * 1080 * (1 / 2) * 8 * 2

那么,这张图片就会占用 (Y字节数 + UV 字节数) / 8 / 1024 / 1024 = 3.955078125MB 的存储空间。

YUV 4:2:0

YUV4:2:0并不意味着只有Y、Cb两个分量,而没有 Cr 分量。实际上,对每行扫描线来说,只有一种色度分量,它以 2:1 的采样率存储。

例如:

  • 当第一行扫描时,YU 按照 2:1 采样
  • 当第二行扫描时,YV 按照 2:1 采样

简单理解:每个像素采样 Y 分量,UV分量水平、垂直方向每4个像素采样一次

  • 假设原始图像的像素为:

    [Y0,U0,V0]、[Y1,U1,V1]、[Y2,U2,V2]、[Y3,U3,V3]

    [Y5,U5,V5]、[Y6,U6,V6]、[Y7,U7,V7]、[Y8,U8,V8]

  • YUV4:2:0 采样的码流:

    Y0,U0,Y1, Y2,U2,Y3

    Y5, V5, Y6,Y7,V7,Y8

  • 映射还原的像素点:

    [Y0, U0, V5]、[Y1, U0, V5]、[Y2, U2, V7]、[Y3, U2, V7]

    [Y5, U0, V5]、[Y6, U0, V5]、[Y7, U2, V7]、[Y8, U2, V7]

假设,现在有一张 1920 * 1080 大小的图片,该图片就会有 1920 * 1080 个像素点,其中每个像素点都采用 YUV 4:2:0 颜色编码格式

Y分量的字节数 = 1920 * 1080 * 8

UV分量的字节数 = 1920 * 1080 * (1 / 4) * 8 * 2

那么,这张图片就会占用 (Y字节数 + UV 字节数) / 8 / 1024 / 1024 = 2.966308594MB 的存储空间。

YUV格式优势

从RGB颜色编码计算的图片存储空间,一张1920*1080就要占用5.93MB,如果在视频渲染中也采样RBG颜色编码格式,其中视频也是由一帧一帧的图片组成,可想而知,占用的内存有多大。

而使用YUV编码格式则可以极大的节省内存,节约带宽

RGB与YUV颜色编码转换

  • 对于图像显示器,是通过RGB颜色编码来展示图像的
  • 传输时的图形数据一般使用 YUV 模型,主要是可以节省带宽

因此,在图像采集时,需要将 RGB 格式转换到 YUV 格式;显示时,需要将 YUV 格式转为 RGB 格式

转换公式:

//YUV和RGB的转换:
Y = 0.299 R + 0.587 G + 0.114 B
U = -0.1687 R - 0.3313 G + 0.5 B + 128
V = 0.5 R - 0.4187 G - 0.0813 B + 128

R = Y + 1.402 (V-128)
G= Y - 0.34414 (U-128) - 0.71414 (V-128)
B= Y + 1.772 (U-128)