做视频图像处理,YUV 格式是需要掌握的最基本的知识点
颜色空间
YUV是一个颜色空间,RGB是大家非常熟悉的另外一个颜色空间。
常用的颜色空间有:
- YUV,用于视频图像的压缩、显示等。
- RGB/RGBA,用于graphic上的显示等,最为常见。
- HSL/HSV,同样用于显示。
- CMYK,用于印刷之类。
比特深度/位深
每个数据采用几个比特表示,位深越大,表示数据的阶数越多
一般最为常见的是 8bit,也就是一个像素。现在已经有 10bit 视频流。医学显示器上位深可以达到 12bit。
颜色空间
RGB颜色空间
RGB颜色空间是指每种颜色都可以用三原色来表示,RGB 分别取不同的值,展示不同的颜色。
RGB 相同时,可以简单降为灰度图。#000000表示黑色,#ffffff表示白色,是非常直观的,也易于理解

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

假设,现在有一张
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个分量

YUV 格式就相对没有那么直观。
YUV 的意义前面有介绍,其中U/V两个分量是有符号的,对比 8bit 的情况下,可以认为是有 bias = -2^7的
因此,Y 的取值范围是[0, 255],U/V的取值范围是[-127, 128]
当 U/V 为 0 的时候,表示没有颜色,颜色为灰色,其二进制表示为0x80。(0x80 - bias = 0)
所以0x008080是黑色,0xff8080 为白色

采样率
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个像素采样一次

之所以压缩视频采用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 * 8UV分量的字节数 =
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,Y3Y5, 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 * 8UV分量的字节数 =
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)