RGB和YUV

718 阅读6分钟

什么是RGB?

RGB分别代表红、绿、蓝,这三种颜色称为三原色,将它们以不同的比例进行组合,可以产生多种多样的颜色。如(1.0,1.0,1.0)表示白色,(0.0,0.0,0.0)表示黑色,(1.0,0.0,0.0)表示红色,(0.3,0.75,0.24)也表示一种颜色。

我们的手机屏幕是由一个一个的像素点构成的,每一个像素点可以显示一种颜色,分别有RGB三个颜色通道,如下图:

RGB三个颜色通道在内存中保存时,分别占一个Byte,也就是8个bit的内存大小,即一个像素点所占的内存大小是3byte。

在一张1280720个像素点的图片上,共有972800像素点,每一个像素点占3byte。那么这张图片所点的内存大小为1280720*3/1024/1024 = 2.63M。

所以我们在保存图片时,会对图片进行压缩成png,jpg...。这些以png,jpg为后缀的文件就是以对应的压缩格式得到的图片的压缩文件。在日常开发中,只有当我们需要显示图片时,才会对图片进行解压,因为解压图片的过程需要大量的计算,非常消耗计算机的性能。

什么是YUV?

YUV和RGB一样是一种颜色编码方式,YUV采用的是明亮度和色度来指定像素的颜色。其中,Y表示明亮度,UV表示色度,色度又包含U(色调)和V(饱和度)

当使用YUV颜色编码时,每一个像素点表示如下图:

和RGB表示图像类似,每个像素点都包含Y、U、V分量。但是它的Y和UV分量是可以分离的,如果没有UV一样可以显示完整的图像,只不过是黑白的。对于YUV图像来说,并不是每个像素点都需要三个分量,根据不同的采样格式,可以每个分量都对应自己的UV分量,也可以几个Y分量共用UV分量。

如上图这张图片,当我们对图像中人物的鼻子位进行放大时,得到如下的图: 在YUV颜色编码中,两个相邻像素点之前的UV分量其实是非常相近的,当它们的Y分量共用同一个UV分量时,肉眼是无法分辨的。

为什么视频采集中要使用YUV颜色编码方式来采集图像?

我们知道,当使用RGB颜色编码方式来采集图像时,一张1280*720的图像的占的内存大小就达到2.63M,而视频其实是由一帧的图像组成的,有非常多的图像。如果使用RGB编码方式来采集视频,所消耗的内存将是非常大的。所以为了在采集视频时减少内存的消耗,我们可以考虑使用YUV的方式来实现。

前面我们已经提到过,没有UV分量,一样可以显示完整的图像,只不过是黑白的。加上相邻像素点之间的UV分量非常接近,所以我们可以对相邻像素点进行采集Y分量,UV分量只采集一个像素点的。其实采样方式有以下几种

YUV 采样格式 — YUV4 : 4 : 4

如同RGB编码方式一样,YUV三个分量都采集对应像素点的数据, 例如原始图像像素为:【Y0,U0,V0】,【Y1,U1,V1】,【Y2,U2,V2】

采样的时候数据流为:Y0,U0,V0;Y1,U1,V1;Y2,U2,V2

还原时映射的像素点:【Y0,U0,V0】,【Y1,U1,V1】,【Y2,U2,V2】

这种采样方式起不到节约内存的目的,但是有利于理解后面的YUV采样方式

YUV 采样格式 — YUV4 : 2 : 2

例如原始图像像素为:【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】

⼀一张 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 采样格式 — YUV4 : 2 : 0

例如原始图像像素为:

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

【Y4,U4,V4】,【Y5,U5,V5】,【Y6,U6,V6】,【Y7,U7,V7】

采样时候数据流为:

Y0,U0,Y1,Y2,U2,Y3; Y4,V4,Y5,Y6,V6,Y7;

即,每采样一个像素点,都会采样Y分量,而U、V会间隔一行一列采样。

还原时映射的像素点:

【Y0,U0,V4】,【Y1,U0,V4】,【Y2,U2,V6】,【Y3,U2,V6】

【Y4,U0,V4】,【Y5,U0,V4】,【Y6,U2,V6】,【Y7,U2,V6】

从映射出的像素点中可以看到,四个 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颜色编码方式,我们成功的将一张图片的内存大小由RGB的2.63M,降到了YUV 4:2:0采样方式下的1.32M。这样就可以有效的减小视频所占的内存大小。

通过YUV编码方式我们成功的将视频采集的内存进行了减少,在视频采集中,我们还可以使用H264的方式对采集的视频进行压缩,进一步减少视频所占的内存大小,有着视频H264的压缩请移步大神的博客:www.jianshu.com/u/1b4c832fb…

RGB和YUV颜色编码的相互转换

对于图像显示器来说,它是通过RGB模型来显示图像的,而在存储和传输图像数据时又是使用YUV模型来实现节省内存和带宽,提升效率的目的,因此就需要采集图像时将RGB转换成YUV,在显示时将YUV转换成RGB,其转换方式如下:

RGB转YUV

Y = 0.299*R + 0.587*G + 0.114*B
U = 0.147*R - 0.289*G + 0.436*B
V = 0.615*R - 0.515*G - 0.100*B

YUV转RGB

R = Y + 1.14*V
G = Y - 0.39*U - 0.58*V
B = Y + 2.03*U

END