注:本文旨在记录笔者的学习过程,仅代表笔者个人的理解,如果有表述不准确的地方,欢迎各位指正!因为涉及到的概念来源自网络,所以如有侵权,也望告知!
前言
本文主要是为了带大家了解一下YUV颜色编码的知识。
正文
一、什么是YUV
1.熟悉的RGB颜⾊编码
我们都知道,在图像显示中RGB 颜⾊编码是最常见的,RGB 三个字⺟分别代表了 红(Red)、绿(Green)、蓝(Blue),这三种颜⾊称为 三原⾊,将它们以不同的⽐例相加,可以产⽣多种多样的颜⾊。
2.那么什么是YUV 颜⾊编码?
二、为什么需要YUV
大家可能会疑惑,既然都已经有RGB颜色编码,为什么还需要YUV颜色编码?YUV颜色编码它的应用场景又是怎么样的呢?
笔者这边就不卖关子了,直截了当的回答一下这两个疑惑点:
1.问:为什么还需要YUV颜色编码?
答:YUV颜色编码可以⽐RGB颜色编码占⽤更少的内存空间。
2.问:YUV颜色编码它的应用场景?
答:在视频捕捉的场景中会使⽤YUV颜色编码,为了节省带宽。
通过这两个问题,大家不难发现,YUV颜色编码存在的原因就是因为它可以将图像压缩的更小。那接下来我们就通过与RGB对比来看看YUV是通过什么样的方式达到这种效果的呢?
a、RGB颜色编码下的图像大小
在图像显示中,如果有⼀张 1280 * 720 ⼤⼩的图⽚,就代表着它有 1280 * 720 个像素点。其中每⼀个像素点的颜⾊显示都采⽤ RGB 编码⽅法,每个像素点都有红、绿、蓝三个原⾊,其中每种原⾊都占⽤ 8 bit,也就是⼀个字节,那么⼀个像素点也就占⽤ 24 bit,也就是三个字节。那么⼀张 1280 * 720 ⼤⼩的图⽚,就会占⽤ 1280 * 720 * 3 / 1024 / 1024 = 2.63 MB 存储空间。
b、YUV颜色编码下的图像大小
YUV和 RGB 表示图像类似,每个像素点都包含 Y、U、V 分量。但是它的 Y 和 UV 分量是可以分离的,如果没有 UV 分量⼀样可以显示完整的图像,只不过是⿊⽩的。对于 YUV 图像来说,并不是每个像素点都需要包含了 Y、U、V 三个分量,根据不同的采样格式,可以每个 Y 分量都对应⾃⼰的 UV 分量,也可以⼏个 Y 分量共⽤ UV 分量。
1、YUV 采样格式 — YUV4 : 4 : 4
YUV 4:4:4 采样,意味着 Y、U、V 三个分量的采样⽐例相同,因此在⽣成的图像⾥,每个像素的三个分量信息完整,都是 8 bit,也就是⼀个字节。
如图示,蓝色圆形代表Y分量,黄色五角星代表UV分量。YUV 4:4:4 采样格式下像素点的表示:
使⽤如上YUV4:4:4 与使⽤图像RGB颜⾊模型图像⼤⼩是⼀样的. 并没有达到节省带宽的⽬的.
2、YUV 采样格式 — YUV4 : 2 : 2
如图示,蓝色圆形代表Y分量,黄色五角星代表UV分量。YUV 4:2:2 采样格式下像素点的表示:
也就是说,⼀张 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 模型图像节省了三分之⼀的存储空间,在传输时占⽤的带宽也会随之减少。
3、YUV 采样格式 — YUV4 : 2 : 0
如图示,蓝色圆形代表Y分量,黄色五角星代表UV分量。YUV 4:2:0 采样格式下像素点的表示:
从映射出的像素点中可以看到,四个 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 。
三、RGB / YUV 颜⾊编码的相互转换
那么这两者之间要怎样转换呢?
Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.147 * R - 0.289 * G + 0.436 * B
同理,YUV 到 RGB 的转换,就是将图像所有像素点的 Y、U、V 分量转换到 R、G、B 分量。
G = Y - 0.39 * U - 0.58 * V