0x01 颜色空间RGB
提到颜色空间,一般都能想到RGB: 红色Red,绿色Green,蓝色Blue。这三种颜色被称为光学三原色,自然界中肉眼所能看到的任何色彩都可以由这三种色彩混合叠加而成,因此也称为加色模式。 屏幕上显示的像素还有摄像头采集的像素都是由RGB组成的。一般来讲一个像素存储着R、G、B、三个值,他们是依次排列存储的。一张8bit位深的RGB图片,一个像素就会占用3个字节。
0x02 YUV是什么
YUV跟RGB一样,也是颜色空间的一种表示方式,可以像RGB一样表示一张色彩艳丽的图片。YUV 图像将亮度信息 Y 与色彩信息 U、V 分离开来。Y 表示亮度,是图像的总体轮廓,称之为 Y 分量。U、V 表示色度,主要描绘图像的色彩等信息,分别称为 U 分量和 V 分量。即使一张图像如果没有了色度信息 U、V,只剩下亮度 Y,则依旧可以表示一张图像,一张黑白图像。
0x03 YUV起源
在只有黑白电视的那个年代,显示图像不需要RGB这么多的颜色,只有黑色和白色就可以表示一张图片,后来有了彩色电视机,为了兼容黑白电视机,为了兼容黑白电视,图像传输的时候就采用了YUV这种颜色空间。黑白电视机可以只使用Y这个分量,显示图像轮廓信息,没有彩色信息。彩色电视机则可以使用YUV显示彩色图像。 由于人眼对色彩信息的敏感度低,对亮度的敏感度高。基于这个原理,我们可以大幅减少存储在每个像素的的颜色信息而不至于图片的质量严重受损,这个过程称为色彩的二次抽样。
0x04 YUV常用类型
YUV主要分为YUV4:4:4、 YUV4:2:2、YUV4:2:0这几种常用类型,这三种类型分别代表了YUV在像素点上的个数和采样类型。其中比较常用的类型是YUV4:2:0。 YUV4:4:4: 每一个Y对一个一个UV
YUV4:2:2: 每2个Y共用一个UV
YUV4:2:0: 每4个Y共用一个UV ,这种采样方式会大量节省空间,iphone的摄像头一般采用这种采样方式,采集的视频质量非常高。
0x05 YUV存储方式YUV的存储方式主要分为两大类:Planar和Packed Planar是连续存储Y的所有点,在存储U或者存储V的 Packed是连续存储Y的所有点,然后U、V交叉存储YUV二次采样方式不同,存储方式也略有差异,下面列举几个YUV的存储方式:
- YUV4:4:4的存储方式:
YUV4:2:2存储方式主要有4种类型:
YUV4:2:0存储方式主要有4种类型
0x06 YUV和RG B的转换 一般来说,视频图像的编码是采用的YUV的色彩空间,但是显示到屏幕上一般都是需要转换成RGB的。
YUV转换RGB是跟ColorRange有关系,也就是色域范围。我们理解的RGB的颜色范围是从0~255,这种被称为Full Range(全色域),还有一种范围是16~235 称之为Limited Range(局部色域)。YUV转换RGB转换有两个标准:BT609,BT701,BT2020 BT609针对标清视频
BT701针对HD高清视频 BT2020针对超高清视频 这个目前用的比较少下面是转换公式
BT601:
BT601 全色域 1、RGB > YUV Y = 0.299 * R + 0.578 * G + 0.114 * B U = -0.172 * R - 0.339 * G + 0.511 * B + 128 V = 0.511 * R + 0.428 * G - 0.083 * B + 128 2、YUV > RGB R = Y + 1.37 * (V - 128) G = Y - 0.336* (U - 128) - 0.698 * (V - 128) B = Y + 1.732 * (U - 128)
BT601 局部色域 1、RGB > YUV Y = 16 + 0.257 * R + 0.504 * G + 0.098 * B U = 128 -0.148 * R - 0.291* G + 0.439 * B + 128 V = 128 + 0.439 * R + 0.368 * G - 0.071 * B 2、YUV > RGB R = 1.164 * (Y - 16) + 1.596 * (V - 128) G = 1.164 * (Y - 16) - 0.392 * (U - 128) - 0.812 * (V - 128) B = 1.164 * (Y - 16) + 2.016 * (U - 128)
BT709:
BT709 全色域 1、RGB > YUV Y = 0.213 * R + 0.715 * G + 0.072 * B U = -0.117 * R - 0.394 * G + 0.511 * B + 128 V = 0.511 * R + 0.464 * G - 0.047 * B + 128 2、YUV > RGB R = Y + 1.540 * (V - 128) G = Y - 0.183* (U - 128) - 0.459 * (V - 128) B = Y + 1.816 * (U - 128)
BT709 局部色域 1、RGB > YUV Y = 16 + 0.183 * R + 0.614 * G + 0.062 * B U = 128 -0.101 * R - 0.339 * G + 0.439 * B + 128 V = 128 + 0.439 * R + 0.339 * G - 0.040 * B 2、YUV > RGB R = 1.164 * (Y - 16) + 1.792 * (V - 128) G = 1.164 * (Y - 16) - 0.213 * (U - 128) - 0.534 * (V - 128) B = 1.164 * (Y - 16) + 2.114 * (U - 128)
在iOS平台,摄像头采集出一帧数据后可以CVBuffferGetAttachment来获取YCbCrMatrix来进行矩阵转换