根据上面的图片,不难看出:
RGB是构成多种颜色的三基色(红绿蓝),也称为加成色。
三个分量共同组成一个像素,且每一个分量占8bit,RGB常常用于图像的存储,并且十分简单。
但是在视频领域中,RGB就不那么常见了。我们知道,视频其实是由一张张连续的图片序列组成的,我们假设有一个1080p(1920 * 1080)分辨率、帧率为30帧的视频,如果使用RGB进行存储的话,仅仅一分钟的视频就能达到 ( 1920 * 1080 * 8 * 30 * 60 )bit (约等于27G)。
YUV是编译true-color颜色空间的种类,Y表示明亮度,U和V则是色度、浓度。 YCbCr的Y与YUV中的Y含义一致,Cb和Cr与UV同样都指色彩,Cb指蓝色色度,Cr指红色色度。
YUV 的最大特点是将亮度信息和色彩信息分离,没有了色彩信息依旧可以显示一张完整的黑白图片。
YUV, YCbCr所指涉的范围,常有混淆或重叠的情况。从历史的演变来说,其中YUV通常用来编码电视的模拟信号,而YCbCr则是用来描述数字的影像信号,适合影片与图片压缩以及传输,例如MPEG、JPEG。因此一般俗称的YUV大多是指YCbCr。
YUV 图像的主流采样方式有如下三种:
下图中黑点表示采样像素点Y分量,空心圆表示采样像素点的UV分量
YUV 4:4:4 采样,意味着 Y、U、V 三个分量的采样比例相同,因此在生成的图像里,每个像素的三个分量信息完整,都是 8 bit,也就是一个字节。
举个例子 :
假如图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那么采样的码流为:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
最后映射出的像素点依旧为 [Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
可以看到这种采样方式的图像和 RGB 颜色模型的图像大小是一样,并没有达到节省带宽的目的,当将 RGB 图像转换为 YUV 图像时,也是先转换为 YUV 4:4:4 采样的图像。
YUV 4:2:2 采样,意味着 UV 分量是 Y 分量采样的一半,Y 分量和 UV 分量按照 2 : 1 的比例采样。如果水平方向有 10 个像素点,那么采样了 10 个 Y 分量,而只采样了 5 个 UV 分量。
举个例子 :
假如图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那么采样的码流为:Y0 U0 Y1 V1 Y2 U2 Y3 V3
其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一个采集一个。
最后映射出的像素点为 [Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]
采样的码流映射为像素点,还是要满足每个像素点有 Y、U、V 三个分量。但是可以看到,第一和第二像素点公用了 U0、V1 分量,第三和第四个像素点公用了 U2、V3 分量,这样就节省了图像空间。
一张 1280 * 720 大小的图片,在 YUV 4:2:2 采样时的大小为:
(1280 * 720 * 8 + 1280 * 720 * 0.5 * 8 * 2)/ 8 / 1024 / 1024 = 1.76 MB 。
可以看到 YUV 4:2:2 采样的图像比 RGB 模型图像节省了三分之一的存储空间,在传输时占用的带宽也会随之减少。
YUV 4:2:0 采样,并不是指只采样 U 分量而不采样 V 分量。而是指,在每一行扫描时,只扫描一种色度分量(U 或者 V),和 Y 分量按照 2 : 1 的方式采样。比如,第一行扫描时,YU 按照 2 : 1 的方式采样,那么第二行扫描时,YV 分量按照 2:1 的方式采样。对于每个色度分量来说,它的水平方向和竖直方向的采样和 Y 分量相比都是 2:1 。
假设第一行扫描了 U 分量,第二行扫描了 V 分量,那么需要扫描两行才能够组成完整的 UV 分量。
举个例子 :
假设图像像素为:
[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3]
[Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
那么采样的码流为:Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8
其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一行按照 2 : 1 进行采样。
最后映射出的像素点为:
[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7]
[Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]
从映射出的像素点中可以看到,四个 Y 分量是共用了一套 UV 分量,而且是按照 2*2 的小方格的形式分布的,相比 YUV 4:2:2 采样中两个 Y 分量共用一套 UV 分量,这样更能够节省空间。
一张 1280 * 720 大小的图片,在 YUV 4:2:0 采样时的大小为:
(1280 * 720 * 8 + 1280 * 720 * 0.25 * 8 * 2)/ 8 / 1024 / 1024 = 1.32 MB 。
可以看到 YUV 4:2:0 采样的图像比 RGB 模型图像节省了一半的存储空间,因此它也是比较主流的采样方式。
根据采样方式和存储格式的不同,就有了多种 YUV 格式。
下面是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 |
I444:先存储所有的 Y 分量,再存储所有的 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
U8 U9 U10 U11 U12 U13 U14 U15
V0 V1 V2 V3 V4 V5 V6 V7
V8 V9 V10 V11 V12 V13 V14 V15
YV24:先存储所有的 Y 分量,再存储所有的 V 分量,再存储所有的 U 分量
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
V0 V1 V2 V3 V4 V5 V6 V7
V8 V9 V10 V11 V12 V13 V14 V15
U0 U1 U2 U3 U4 U5 U6 U7
U8 U9 U10 U11 U12 U13 U14 U15
:先存储所有的 Y 分量,再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
U4 V4 U5 V5 U6 V6 U7 V7
U8 V8 U9 V9 U10 V10 U11 V11
U12 V12 U13 V13 U14 V14 U15 V15
NV42:先存储所有的 Y 分量,再V和U交错存放
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
V0 U0 V1 U1 V2 U2 V3 U3
V4 U4 V5 U5 V6 U6 V7 U7
V8 U8 V9 U9 V10 U10 V11 U11
V12 U12 V13 U13 V14 U14 V15 U15
下面是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 |
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
YV16:先存储所有的 Y 分量,再存储所有的 V 分量,再存储所有的 U 分量。
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
V1 V3 V5 V7 V9 V11 V13 V15
U0 U2 U4 U6 U8 U10 U12 U14
NV16:先存储所有的 Y 分量,再U和V交错存放。
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
U0 V1 U2 V3 U4 V5 U6 V7
U8 V9 U10 V11 U12 V13 U14 V15
NV61:先存储所有的 Y 分量,再V和U交错存放。
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
V1 U0 V3 U2 V5 U4 V7 U6
V9 U8 V11 U10 V13 U12 V15 U14
UYVY:(每个方括号里是2个像素)
[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]
YUYV:(每个方括号里是2个像素)
[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]
YVYU(每个方括号里是2个像素)
[Y0 V1 Y1 U0 ] [Y2 V3 Y3 U2 ]
[Y4 V5 Y5 U4 ] [Y6 V7 Y7 V6 ]
[Y8 V9 Y9 U8 ] [Y10 V11 Y11 U10]
[Y12 V13 Y13 U12] [Y14 V15 Y15 U14]
下面是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 - - |
I420 :是先 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
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
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
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
REF:
一文读懂 YUV 的采样与格式
https://www.cnblogs.com/zuojie/p/16438496.html
https://www.zhihu.com/question/24994945/answer/3255831372
YUV与RGB格式转换 | ibabyblue's Blog
攻克视频技术_声网_视频技术_视频_YUV_RGB_编码原理_编码压缩_SVC_花屏_卡顿_音画同步_MP4_FLV-极客时间