与 RGB 编码方法类似,YUV 也是一种颜色编码方法。其中“Y”表示明亮度(Luminance 或 Luma),也就是灰阶值,U 和 V 表示的则是色度(Chrominance 或 Chroma),分别用 CrCb来表示,作用是描述影像色彩及饱和度,用于指定像素的颜色。
这样分开的好处:
1. 可以避免相互干扰(没有 UV 信息一样可以显示完整的图像,因而解决了彩色电视与黑白电视的兼容问题);
2. 降低色度的采样率而不会对图像质量影响太大,降低了视屏是`信号传输时对频宽(带宽)的要求。
YUV 是一个比较笼统地说法,针对它的具体排列方式,可以分为很多种具体的格式。
YUV采用A:B:C表示法来描述Y,U,V采样频率比例,下图中黑点表示采样像素点Y分量,空心圆表示采样像素点的UV分量。
1. 4:4:4 表示色度频道没有下采样,即一个Y 分量对应着一个U分量和一个V分量。一个YUV占 8+8+8=24bits 3个字节;
2. 4:2:2 表示 2:1 的水平取样,垂直完全采样。一个 YUV 占 8+4+4=16bits 2个字节;
3. 4:2:0 表示 2:1 的水平取样,垂直 2:1 采样。一个 YUV 占 8+2+2=12bits 1.5个字节;
4. 4:1:1 表示 4:1 的水平取样,垂直完全采样。 与其他格式相比,4:1:1 采样不太常用。
即:
YUV 存储可以分为两种:packed(打包)和planar(平面);
packed:Y、U、V 分量穿插着排列,三个分量存在一个 Byte 型数组里;
planar:Y、U、V 分量分别存在三个 Byte 型数组中;
2.1 YUV422:YUYV、YVYU、UYVY、VYUY
这四种格式每一种又可以分为 2 类(packed和planar),以 YUYV 为例,一个 6*4 的图像的存储方式如下:
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y
U U U U U U Y U Y V Y U Y V Y U Y V
U U U U U U Y U Y V Y U Y V Y U Y V
V V V V V V Y U Y V Y U Y V Y U Y V
V V V V V V Y U Y V Y U Y V Y U Y V
- Planar - - Packed -
2.2 YUV420:I420、YV12、NV12、NV21
同样,对于一个6*4的图像,这四种像素格式的存储方式如下:
Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y
Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y
Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y
Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y
U U U U U U V V V V V V U V U V U V V U V U V U
V V V V V V U U U U U U U V U V U V V U V U V U
- I420 - - YV12 - - NV12 - - NV21 -
AYUV:这是一个打包格式,其中每个像素都被编码为四个连续字节,其组织顺序如下所示,其中 A AA 标示了alpha通道。
1. YUY2:在 YUY2 格式中,数据可被视为一个不带正负号的char值组成的数组,其中第一个字节存储第一个Y样例,第二个字节存储第一个U(Cb)样例,第三个字节存储第二个Y 样例,第四个字节存储第一个V(Cr)样例,如下图:
2. UYVY:此格式与 YUY2 相同,只是字节顺序是与之相反的。
1 IMC1:所有 Y YY 样例都会作为不带正负号的 char 值组成的数组首先存储在内存中。后面跟着存储所有V(Cr)样例,然后是所有U(Cb)样例。V和U平面与Y平面具有相同的跨距(即存储数组的宽度),从而遗留了如下图所示的未使用的内存区域。
2. IMC3:此格式与 IMC1 相同,只是 U 和 V 平面进行了交换:
3. IMC2:此格式与 IMC1 相同,只是V(Cr) 和U(Cb)行在半跨距边界处进行了交错。换句话说,就是色度区域中的每个完整跨距行都以一行V样例开始,然后是一行在下一个半跨距边界处开始的 U 样例:
此布局与 IMC1 相比,IMC2 能够更加高效地利用存储空间。它的色度存储空间缩小了一半,因此整体存储空间缩小了 25%。在各个 4:2:0 格式中,IMC2 是第二首选格式,排在 NV12 之后。
4. IMC4:此格式与 IMC2 相同,只是U(Cb) 和V(Cr) 行进行了交换:
5. NV12: 所有 Y 样例都会作为由不带正负号的 char 值组成的数组首先存储在内存中,并且行数为偶数。Y平面后面紧接着一个由不带正负号的 char 值组成的数组,其中包含了打包的U(Cb) 和V(Cr)样例。
7. NV21: NV21 格式和 NV12 存储格式基本相同,只是 U V 存储位置互换。
8. YU12: 也叫做 I420 格式,首先是所有 Y YY,然后是所有U,最后是所有V
也就是为什么 U UU 和 V VV 看到的是四幅图像:
8. YV12: YV12 格式与 YU12 基本相同,首先是所有 Y 值,然后是所有 V 值,最后是所有 U 值。
1. 4:2:2 -> 4:2:0 的有损压缩转换:Y YY 存储数据不变,对 U UU 和 V VV 分量在行垂直下采样进行隔行抽样。
2. 4:2:0 -> 4:2:2的补足转换:Y YY 存储数据不变,对 U UU 和 V VV 分量在行垂直下采样进行隔行拷贝补足下一行色度数据。
r = y + (140 * (v-128))/100; //r
g = y - (34 * (u-128))/100 - (71 * (v-128))/100; //g
b = y + (177 * (u-128))/100; //b