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

参考资料
http://www.fourcc.org/
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwmt/html/YUVFormats.asp
[BOOK]Fundamental of Multimedia  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值