我们从视频的信号表示方法开始讲起,逐步深入到视频压缩编码的原理。我们主要从下面几个要点来讲解或者加深记忆。
主流的采样方式有 4 种:YUV(4:4:4), YUV(4:2:2), YUV(4:2:0), YUV(4:1:1)
YUV 的存储格式与其采样方式密切相关。
存储示意图
-
(1)视频的信号表示
-
(2)RGB色彩空间
-
(3)YUV色彩空间
-
(4)如何存储
-
(5)两者如何转化
1. 视频的信号表示
我们知道视频是由图像组成。而图像,大家都知道,是由很多“带有颜色的点”组成的。这个点,就是“像素点”。真实世界中的影像与早期的视频处理与传输系统所处理的都是模拟信号。然而为了能适应现代的计算机、网络传输与数字视频处理系统,模拟的视频信号必须转换成数字格式。这就牵出了“彩色分量数字化”的概念。
-
2. RGB色彩空间
懂绘画的童鞋一定知道,任何颜色,都可以通过红色(Red)、绿色(Green)、蓝色(Blue)按照一定比例调制出来。这三种颜色,被称为“三原色”。
-
屏幕上的不同颜色,都由这红色,绿色,蓝色三种基本色光按照不同的比例(权重)混合而成的。一组红色绿色蓝色就是一个最小的显示单位。屏幕上的任何一个颜色都可以由一组RGB值来记录和表达。因此这红色绿色蓝色又称为三原色光,用英文表示就是R(red)、G(green)、B(blue)。RGB的所谓“多少”就是指亮度,并使用整数来表示。在用8位表示时,RGB各有256级亮度,用数字量化表示为从0、1、2...直到255。注意虽然数字最高是255,但0也是数值之一,因此共256级。
使用这种方式表示彩色图像的方式为RGB颜色空间。RGB颜色空间常用于显示器系统。通过这种形式表示的图像,每个像素的每一个颜色分量用1个字节表示,则可以表示256×256×256种不同的颜色。在常见的图像格式中,如位图(bmp)格式以RGB形式保存数据。
RGB 颜色空间可以看作是三维直角颜色坐标系中的一个正立方体。如上右图所示。红绿蓝三色在立方体的三个顶点上;洋红、青、黄色在立方体的立方体的另外三个顶点;黑色在坐标原点;而白色在离原点最远的定点上。在连接黑色与白色的对角线上,是亮度等量的三基色混合而成的灰色,该线称为灰色线。
2. YUV色彩空间
YUV,是另外一种颜色编码方法。
YUV是编译true-color颜色空间(color space)的种类,Y'UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度、浓度(Chrominance、Chroma),
Y′UV, YUV, YCbCr, YPbPr所指涉的范围,常有混淆或重叠的情况。从历史的演变来说,其中YUV和Y'UV通常用来编码电视的模拟信号,而YCbCr则是用来描述数字的影像信号,适合视频与图片压缩以及传输,例如MPEG、JPEG。 但在现今,YUV通常已经在电脑系统上广泛使用。
Y'代表明亮度(luma; brightness)而U与V存储色度(色讯; chrominance; color)部分; 亮度(luminance)记作Y,而Y'的prime符号记作伽玛校正。
对于 YUV 所表示的图像,Y 和 UV 分量是分离的。如果只有 Y 分量而没有 UV 分离,那么图像表示的就是黑白图像。彩色电视机采用的就是 YUV 图像,解决与和黑白电视机的兼容问题,使黑白电视机也能接受彩色电视信号。
人眼对色度的敏感程度低于对亮度的敏感程度。主要原因是视网膜杆细胞多于视网膜锥细胞,其中视网膜杆细胞的作用就是识别亮度,视网膜锥细胞的作用就是识别色度。所以,眼睛对于亮度的分辨要比对颜色的分辨精细一些。
利用这个原理,可以把色度信息减少一点,人眼也无法查觉这一点。
所以,并不是每个像素点都需要包含了 Y、U、V 三个分量,根据不同的采样格式,可以每个 Y 分量都对应自己的 UV 分量,也可以几个 Y 分量共用 UV 分量。相比 RGB,能够节约不少存储空间。
在视频通信系统中(特别是视频编解码)的“YUV”图像就是YCbCr。在平常的工作交流中,所称的YUV也是YCbCr。以下用YUV指代YCbCr
3. YUV存储
YUV格式有两大类:Planar(平面格式), Packed(打包格式)。
-
Planar:先连续存储所有像素点的 Y,紧接着存储所有像素点的 U,随后是所有像素点的 V。相当于将 YUV 拆分成三个平面 (plane) 存储。
-
Packed:每个像素点的 Y, U, V 是连续交替存储的。
-
YUV 4:4:4 采样:每一个 Y 对应一组 UV 分量(4 个 Y 采样就对应 4 个 Cb 和 4 个 Cr 采样)。平均一个像素占用 8+8+8 = 24 位。
-
YUV 4:2:2 采样:每两个 Y 共用一组 UV 分量(4 个 Y 采样就对应 2 个 Cb 和 2 个 Cr 采样)。平均一个像素占用 8+4+4 = 16 位。
-
YUV 4:2:0 采样:每四个 Y 共用一组 UV 分量(4 个 Y 采样就对应 2 个 Cb 或 2 个 Cr 采样)。平均一个像素占用 8+4+0 = 12 位。
-
YUV 4:1:1 采样:每四个 Y 共用一组 UV 分量(4 个 Y 采样就对应 1 个 Cb 和 1 个 Cr 采样)。平均一个像素占用 8+2+2 = 12 位。
在存储时YUV各占一个字节Byte,
4:4:4方式,那一个256X256分辨率的图片要占用256×256×3=196608Byte,
4:2:2方式要占用256×256×2=131072Byte,
4:2:0方式要占用256×256×2/3=43690.7Byte,
可以看到采用4:2:0方式存储空间整整减少了一半。
另外一种表示(参考)
YUV422 采样的格式 ( YCbYCr / YUYV ,CbYCrY / UYVY / I422 ,422P , 422SP )
打包格式 (Packed) :YCbYCr / YUYV ,CbYCrY / UYVY / I422
平面格式 (Planar) :422P , 422SP
UYVY422:
UYVY格式也是YUV422采样的存储格式中的一种,只不过与YUYV不同的是UV的排列顺序不一样而已,还原其每个像素点的YUV值的方法与上面一样.
YUV422P:
YUV422P也属于YUV422的一种,它是一种Plane模式,即平面模式,并不是将YUV数据交错存储,而是先存放所有的Y分量,然后存储所有的U(Cb)分量,最后存储所有的V(Cr)分量,如上图所示。其每一个像素点的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即两个Y共用一个UV。比如,对于像素点Y'00、Y'01 而言,其U、V的值均为 U1、V1。
YUV422SP:
先存放所有的Y分量,然后交叉存储UV
YUV422P(参考)
YUV422SP
YUV420 采样的格式( I420 / YU12 , YV12 , NV12 , NV21 )
分为:YUV420P ( I420 / YU12 , YV12 ),YUV420SP ( NV12 , NV21 )
YU12 是 I420 的别称,YV12 与之是 UV 顺序不同。
NV12 和 NV21 则是 UV 交织顺序不同。
- YUV420p((Planar)平面)是先存储完U分量后再存储V分量,也就是说UV分量各自都是连续的,
- YUV420sp((Semi-Planar)半平面)则交叉存储UV分量 因此一个YUV420图片的存储空间为:
Y分量 = width * hight
U分量 = Y / 4
V分量 = Y / 4
YUV420图像存储空间 = width * hight * 3 / 2
例如一张分辨率为8X4的YUV420图像,数据存储格式如下图:
YUV420sp格式:
YUV420p格式:
格式属于4:2:0类型,存储方式上面已经说过,就是先存储把全部的Y分量存完,再存U分量,最后存V分量,从网上找了一张很形象的图:
可以看到,第一行的Y1Y2和第二行的Y7Y8共同使用一组UV分量U1V1。
YV12
该格式与YU12基本一样,唯一的区别是先存储V分量再存储U分量,对应到上图把第五行和第六行位置互换一下就是了。
以上两种格式我们可以看到都是4:2:0的,因为都是planar方式存储,简称420p。
除了上面两种,还有两种4:2:0,NV12和NV21,这两种是比较特殊的存储格式,是planar和packed混合存储的,分别看下
NV12
该格式是先存储全部的Y分量,然后UV分量交叉存储,用图像表示下:
NV21
该格式与NV21的区别和上面YU12/YV12一样,唯一的区别只是UV分量交叉的顺序不同,NV12是U排前面,NV21是V排前面,用图像表示如下:
需要注意的是,
NV12是iOS中有的模式,它的存储顺序是先存Y分量,再YV进行交替存储。
NV21是Android中有的模式,它的存储顺序是先存Y分量,再VU交替存储。
4. YUV和RGB的转换
RGB格式转为YUV格式
Y'= 0.299*R' + 0.587*G' + 0.114*B' U'= -0.147*R' - 0.289*G' + 0.436*B' = 0.492*(B'- Y') V'= 0.615*R' - 0.515*G' - 0.100*B' = 0.877*(R'- Y')
YUV格式转为RGB格式
R' = Y' + 1.140*V' G' = Y' - 0.394*U' - 0.581*V' B' = Y' + 2.032*U'
RGB格式转为YCbCr格式
按ITU-R BT.709标准。
Y = 0.183R + 0.614G + 0.062B + 16 Cb = -0.101R - 0.339G + 0.439B + 128 Cr = 0.439R - 0.399G - 0.040B + 128
按JPEG的全范围取值格式
Y = 0.299R + 0.587G + 0.144B + 0
Cb = -0.169R - 0.331G + 0.500B + 128
Cr = 0.500R - 0.419G - 0.081B + 128