关于YUV和RGB图像格式的问题
一、概念
首先名词解释:
RGB
对一种颜色进行编码的方法统称为“颜色空间”或“色域”。用最简单的话说,世界上任何一种颜色的“颜色空间”都可定义成一个固定的数字或变量。RGB
(红、绿、蓝)只是众多颜色空间的一种。采用这种编码方法,每种颜色都可用三个变量来表示—红色、绿色以及蓝色的强度。记录及显示彩色图像时,RGB是最
常见的一种方案。但是,它缺乏与早期黑白显示系统的良好兼容性。因此,件多电子电器厂商普遍采用的做法是,将RGB转换成YUV颜色空同,以维持兼容,再
根据需要换回RGB格式,以便在电脑显示器上显示彩色图形。
YUV
YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL)。YUV主要用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。与RGB视频信号传
输相比,它最大的优点在于只需占用极少的带宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是
灰阶值;而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是通过
RGB输入信号来创建的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面—色调与饱和度,分别用U和V来表示。其中,V反映了
GB输入信号红色部分与RGB信号亮度值之间的差异。而U反映的是RGB输入信号蓝色部分与RGB信号亮度值之同的差异。
YCrCb 是YUV的一个特例,它是将UV的值限定在了0-1之间
Cb相当于U, Cr相当于V,与RGB之间的转换如下:
R′G′B′是指伽玛修正过的RGB值,正常的RGB值的公式是同样的。
公式一:(标准公式)
Y = 0.299 R + 0.587 G + 0.114 B
Cr = ((B-Y)/1.772) + 0.5
Cb = ((R-Y)/1.402) + 0.5
用8-bit格式表示就是
以下两个公式已经修正到[0-255]的范围
公式二:(RGB => YCbCr)
Y = 0.257R′ + 0.504G′ + 0.098B′ + 16
Cb = -0.148R′ – 0.291G′ + 0.439B′ + 128
Cr = 0.439R′ – 0.368G′ – 0.071B′ + 128
公式三:(YCbCr => RGB)
R′ = 1.164(Y – 16) + 1.596(Cr – 128)
G′ = 1.164(Y – 16) – 0.813(Cr – 128) – 0.392(Cb – 128)
B′ = 1.164(Y – 16) + 2.017(Cb – 128)
二、介绍
以下文章使用的YUV即表示YCbCr。
YUV的一个好处就是,色差通道可以比亮度通道是用更低的采样率。采样率通常有以下几种:
1. 4:4:4 Chroma(UV)通道没有downsampling。
2. 4:2:2 表示 2:1 水平(horizontal) downsampling, 没有垂直(vertical) downsampling. 在每个扫描行,每4个Y样本对应2个U或V。
3. 4:2:0 表示 2:1 水平 downsampling, with 2:1 垂直 downsampling.
4. 4:1:1 表示 4:1 水平 downsampling, 没有垂直 downsampling. 在每个扫描行,每4个Y样本对应1个U或V。4:1:1 比其他采样方式要使用的少很多。
下面的图Fig.1 ~ Fig4用图来表示这4个采样方式:(X代表亮度,O代表色彩度)
三、存储结构
4:4:4 ,32 Bits per Pixel
推荐使用基于FOURCC编码的AYUV4:4:4格式. 这是一个packed格式, 每个象素编码为4个连续的字节, 按以下序列排列:
Fig.5 AYUV 内存布局
4:2:2 Formats, 16 Bits per Pixel
现在最常用的有两种 4:2:2 格式, 使用FOURCC编码:
YUY2
UYVY
这两个都是 packed 格式, 每个逻辑象素是由两个实际象素编码成4个连续的字节. 这就使水平方向的(减象素)downsampling.
YUY2
对于YUY2格式,样本数据可以被看成一个unsigned char的数组,第一个字节是Y样本,第二个是第一个U(Cb)样本,第三个是第二个Y样本,第四个是第一个V(Cr)样本。如图Fig.6。
Fig.6 YUY2 内存布局
YUY2是被Microsoft DirectX? Video Acceleration (DirectX VA)所推荐的4:2:2格式。
UYVY
这个格式和YUY2是基本一样的,不同的是字节顺序正好相反(图7)。
Fig.7 UYVY 内存布局
4:2:0 Formats, 16 Bits per Pixel
这里推荐两种4:2:0 16-bits per pixel的格式,使用FOURCC编码:
IMC1
IMC3
这两种FOURCC编码都是平面格式,色度通道在水平和垂直方向作了2次采样。
IMC1
所有的Y样本以unsigned char的数组形式出现在内存的最开始。接下来是所有的V(Cr)样本,再下来是U(Cb)样本。V和U平面和Y平面有一样的移动幅度,结果造成了未使用的空间。如图8:
Figure 8. IMC1 内存布局
IMC3
这个格式和IMC1基本相同,不同在他们的U和V位置交换了。
Figure 9. IMC3 内存布局
4:2:0 Formats, 12 Bits per Pixel
这里介绍4种4:2:0 12-bpp的格式,使用FOURCC编码:
IMC2
IMC4
YV12
NV12
所有的这些格式,色度通道在水平和垂直方向都作了2次采样。
IMC2
这种格式和IMC1也是基本相同,不同的是U(Cb)和V(Cr)采样交叉存取。也就是说,色度区域的每行都以U样本开始,到一半的时候V样本开始,也就是U和V各25%的地址空间。在所有的4:2:0的格式中,IMC2是第二个最佳的格式,第一的是NV12。
Figure 10. IMC2 内存布局
IMC4
和IMC2类似,不同的是U(Cb)和V(Cr)交换了位置。
Figure 11. IMC4 内存布局
YV12
所有的Y样本以unsigned char的数组形式出现在内存的最开始。接下来就是所有的V(Cr)样本,步幅是Y的一半,而且有一半Y的行数。接下来是所有的U(Cb)样本,和V有同样的行数。如图12:
Figure 12. YV12 内存布局
NV12
所有的Y样本以unsigned char的数组形式出现在内存的最开始,并且为偶数行。U和V的样本成对出现的紧跟Y平面紧跟其后,如图13。NV12是DirectX VA首选的4:2:0格式。
Figure 13. NV12 内存布局
四、换算公式
这节介绍一些在不同的YUV和RGB之间转换的公式。
这里的RGB指完整的RGB即24bitRGB,RGB888。R = G = B = 0代表黑色,R = G = B = 255为白色。
我们首先讲述 RGB 和 4:4:4 YUV 之间的转换。要将 4:2:0 或 4:2:2 YUV 转换为 RGB,我们建议首先将 YUV
数据转换为 4:4:4 YUV,然后再将 4:4:4 YUV 转换为 RGB。AYUV 格式是一个 4:4:4 格式,它对于每个 Y、U 和
V 样例都使用 8 位。对于某些应用,还可以使用每样例多于 8 位的位数定义 YUV。
1. RGB888 to YUV 4:4:4
见公式二
2. YUV 4:4:4 to RGB888
见公式三
至于各个YUV格式之间的转换以后补上。或者可以查看参考资料。