笔记-YUV和RGB的那些事~

3,451 阅读5分钟

在学习Metal绘制渲染的过程中,看到了颜色编码转换有关的YUV,之前知道YUV和RGB都是颜色变色编码种类,但是一直不知道具体是啥以及有啥联系。所以花了点时间翻看资料并思考理解和整理了一下知识点。

RGB和YUV

​ 我们知道颜色都是有三原色(红、绿、蓝)组成的,也就是RGB,可以组成非常多的颜色,这些我们都知道的知识。在我们录制视频和播放视频的时候采用的一般都是RGB编码格式,在屏幕上每一个像素点都含有R分量、G分量、B分量,由这些一个个的像素上展示的颜色才构成了我们看见的图片,视频是一帧帧图片组成的。 说完了RGB,寡下YUV,YUV和RGB一样,也是每个像素都含有Y、U、V三中分量。YUV和黑白电视有关,正是因为工程师想要在黑白设备上呈现彩色而发明的编码格式😝,YUV是由Y(明亮度)、UV(色度)组成的,其实只要有Y值就能看见图片、视频,只不过是黑白的。

​ RGB编码格式中每个分量占一个字节,即8bit,一个像素占用24bit空间,而YUV4:4:4编码格式中也是一样的(后面会说到YUV编码格式)大小。

假如一张图片大小为1024*1024,那么他的大小为:

imageSize = 1024x1024x3x8/8/1024/1024 = 3.0MB

RGB和YUV的转换

Y = 0.299R + 0.587G + 0.114B

U = -0.14713R - 0.28886G + 0.436B

V = 0.615G - 0.51499G - 0.10001B

R = 1.0Y + 1.13983V

G = 1.0Y - 0.39465U - 0.58060V

B = 1.0Y + 2.03211U

YUV编码格式

主流采样方式三种:YUV4:4:4、YUV4:2:2、YUV4:2:0。YUV编码方式可以减少图片的大小,减少带宽和资源。

YUV 4:4:4采样

图中展示的有6个像素,每个像素有YUV分量组成。从图片我们知道YUV4:4:4采样方式每个分量都采样,所以同等宽高的图片的大小和RGB的大小是一致的。通过这个采样方式图片大小并没有减少,但是在编码转换的时候,图像从RGB转YUV,首先转成该采样方式的图像,然后再通过其他采样方式进行转换。

YUV 4:2:2采样

从这张图片我们知道该采样的特点就是UV分量分别隔一个像素进行采样,即两个像素共用一个UV分量,Y和UV分量按2:1的比例取样。采用这种编码方式,图片大小是原图大小的66.7%,这就是为啥会广泛采用YUV编码方式来进行传输,可以减少带宽、节约资源。

YUV 4:2:0采样

从上面我们知道YUV4:2:2方式图片大小就减少了1/3,但是常用的是YUV 4:2:0采样方式。

从上图可知,我们知道图片比在RGB空间的大小减少了50%,是不是很夸张!但这就是他的神奇之处。图中有两行像素,每行像素有6个像素。该采样方式的特点就是4个像素共用一套UV分量,每个像素均取Y分量,一行像素取U分量,邻行像素取V分量,并且UV分量像素取一次。例如图中的第0、1、7、8像素共用了U0和V8。正是由于该采样方式可以直接减少一半的图片大小,该方式很常用。

YUV存储格式

YUV采样存储数据有两种方式:

  • planr: 平面格式,先连续存储像素点的Y分量,其次存储U分量,最后存储V分量。
  • packed: 打包模式,每个像素点的Y分量、U分量、V分量连续交替存储的。

正式由于采样的方式不同和存储格式的不同所以有多种YUV格式,这些格式主要基于YUV 4:2:2采样和YUV4:2:0采样。

YUV存储格式 基于YUV 4:2:2采样格式 基于YUV 4:2:0采样格式
planr YUV420P、YUV420SP
packed YUYV、UYVY、YUV422P(I422)
packed方式

上表中的打包样式YUYV、UYVY都是根据每个像素均取Y分量,隔像素取U、V分量。所以他的存储排序如下:

YUYV:

Y0U0 Y1V0 Y2U2 Y3V2 Y4U4 Y5V4 Y6U6

UYVY:

U0Y0 V0Y1 U2Y2 V2Y3 U4Y4 V4Y5 U6Y6

YUV422P格式和上面差不多,都是类似的组合方式。

planr方式
基于YUV 4:2:0样式 格式
YUV420P YU12、YV12
YUV420SP NV12、NV21

YU12和YV12是YUV420P类型,先存储Y分量,然后在存储UV分量,不同的是YU12是先Y再U后V,YV12是先Y再V后U存储。

Y0 Y1 Y2 Y3 Y4 ...

Uo U1 ...

V0 V1 ...

YUV420SP有NV12和NV21两种格式。与YUV 420P不同的是先存储Y分量,然后UV分量交替存储。其中NV12是iOS中有的模式,就是先存储Y分量,UV分量交替存储时先U后V;而NV21时Android Q中有的模式,就是先存储Y分量,UV分量交替存储时先V后U。

总结

通过了解YUV、RGB编码两者的关系,以及YUV编码格式带来的收益可以让我们在开发中有一定的帮助,以及YUV存储方式可以开拓一下知识点。

参考:

1.YUV-维基百科

2.YUV采样与格式