关于YUV和RGB图像格式的问题

关于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代表色彩度)

HIT it to large!

三、存储结构

4:4:4 ,32 Bits per Pixel

推荐使用基于FOURCC编码的AYUV4:4:4格式. 这是一个packed格式, 每个象素编码为4个连续的字节, 按以下序列排列:

HIT it to large!

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。

HIT it to large!

Fig.6 YUY2 内存布局

YUY2是被Microsoft DirectX? Video Acceleration (DirectX VA)所推荐的4:2:2格式。

UYVY

这个格式和YUY2是基本一样的,不同的是字节顺序正好相反(图7)。

HIT it to large!

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:

HIT it to large!

Figure 8. IMC1 内存布局

IMC3

这个格式和IMC1基本相同,不同在他们的U和V位置交换了。

HIT it to large!

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。

HIT it to large!

Figure 10. IMC2 内存布局

IMC4

和IMC2类似,不同的是U(Cb)和V(Cr)交换了位置。

HIT it to large!

Figure 11. IMC4 内存布局

YV12

所有的Y样本以unsigned char的数组形式出现在内存的最开始。接下来就是所有的V(Cr)样本,步幅是Y的一半,而且有一半Y的行数。接下来是所有的U(Cb)样本,和V有同样的行数。如图12:

HIT it to large!

Figure 12. YV12 内存布局

NV12

所有的Y样本以unsigned char的数组形式出现在内存的最开始,并且为偶数行。U和V的样本成对出现的紧跟Y平面紧跟其后,如图13。NV12是DirectX VA首选的4:2:0格式。

HIT it to large!

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格式之间的转换以后补上。或者可以查看参考资料。

By Lu Jun

80后男,就职于软件行业。习于F*** GFW。人生48%时间陪同电子设备和互联网,美剧迷,高清视频狂热者,游戏菜鸟,长期谷粉,临时果粉,略知摄影。

Leave a comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.