1、计算机彩色显示器显示色彩的原理与彩色电视机一样,都是采用 R(Red ) 、G(Green) 、 B(Blue)相加混色的原理:通过发射出 三种不同强度的电子束,使屏幕内侧覆盖的红、绿、蓝磷光材料发光而产生色彩。这种色彩的表示方法称为 RGB 色彩空间表示(它也是多媒体计算机技术中用得最 多的一种色彩空间表示方法) 。根据三基色原理,任意一种色光 F 都可以用不同分量的 R、G、B 三色相加混合而成。F = r R + g G + b B 其中,r 、g、 b 分别为三基色参与混合的系数。当三基色分量都为 0(最弱)时混合为黑色光;而当三基色分量都为 k(最强)时混合为白色光。调整 r、g、b
2、三个系数的值,可以混合出介于黑色光和白色光之间的各种各样的色光。那 么 YUV 又从何而来呢?在现代彩色电视系统中,通常采用三管彩色摄像机或彩色 CCD 摄像机进行摄像,然后把摄得的彩色图像信号经分色、分别放大校正后得到 RGB,再经过矩阵变换电路得到亮度信号 Y 和两个色差信号BY(即 U) 、RY(即 V) ,最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送 出去。这种色彩的表示方法就是所谓的 YUV 色彩空间表示。采用 YUV 色彩空间的重要性是它的亮度信号 Y 和色度信号 U、V 是分离的。如果只有 Y 信号分量而没有 U、V 分量,那么这样表示的图像就是黑白灰度图像。彩色电
3、视采用 YUV 空间正是为了用亮度信号 Y 解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。YUV 与 RGB 相互转换的公式如下(参考 Keith Jack 的Video Demystified ):Y = 0.299R + 0.587G + 0.114BU = -0.147R - 0.289G + 0.436B = 0.492(B-Y)V = 0.615R - 0.515G - 0.100B = 0.877(R-Y)R = Y + 1.14VG = Y - 0.395U - 0.581VB = Y + 2.032U(注:RGB 取值范围均为 0255,Y=0255,
4、U=-12+112,V=-157+157)常 见的 RGB 格式有RGB1、RGB4、RGB8、RGB565、RGB555、RGB24 、RGB32 、ARGB32 等;常见的 YUV 格式有 YUY2、 YUYV、YVYU、UYVY 、 AYUV、Y41P、Y411、 Y211、IF09 、IYUV 、YV12、YVU9 、YUV411、YUV420 等。作为 视频媒体类型的辅助说明类型(Subtype) 。表 1 常见的 RGB 和 YUV 格式(这里虽引用了 directshow 中的 YUV subtype 列表,但本文并非针对 directshow 来阐述的)GUID 格式描述MED
5、IASUBTYPE_RGB1 2 色,每个像素用 1 位表示,需要调色板MEDIASUBTYPE_RGB4 16 色,每个像素用 4 位表示,需要调色板MEDIASUBTYPE_RGB8 256 色,每个像素用 8 位表示,需要调色板MEDIASUBTYPE_RGB565 每个像素用 16 位表示,RGB 分量分别使用 5 位、6 位、5 位MEDIASUBTYPE_RGB555 每个像素用 16 位表示,RGB 分量都使用 5 位(剩下的 1 位不用)MEDIASUBTYPE_RGB24 每个像素用 24 位表示,RGB 分量各使用 8 位MEDIASUBTYPE_RGB32 每个像素用 3
6、2 位表示,RGB 分量各使用 8 位(剩下的 8 位不用)MEDIASUBTYPE_ARGB32 每个像素用 32 位表示,RGB 分量各使用 8 位(剩下的 8 位用于表示 Alpha 通道值)MEDIASUBTYPE_YUY2 YUY2 格式,以 4:2:2 方式打包MEDIASUBTYPE_YUYV YUYV 格式(实际格式与 YUY2 相同)MEDIASUBTYPE_YVYU YVYU 格式,以 4:2:2 方式打包MEDIASUBTYPE_UYVY UYVY 格式,以 4:2:2 方式打包MEDIASUBTYPE_AYUV 带 Alpha 通道的 4:4:4 YUV 格式MEDIA
7、SUBTYPE_Y41P Y41P 格式,以 4:1:1 方式打包MEDIASUBTYPE_Y411 Y411 格式(实际格式与 Y41P 相同)MEDIASUBTYPE_Y211 Y211 格式MEDIASUBTYPE_IF09 IF09 格式MEDIASUBTYPE_IYUV IYUV 格式MEDIASUBTYPE_YV12 YV12 格式MEDIASUBTYPE_YVU9 YVU9 格式下面介绍 RGB 格式: RGB1、RGB4 、RGB8 都是调色板类型的 RGB 格式,在描述这些媒体类型的格式细节时,通常会在 BITMAPINFOHEADER 数据结构后面跟着 一个调色板(定义一系
8、列颜色) 。它们的图像数据并不是真正的颜色值,而是当前像素颜色值在调色板中的索引。以 RGB1(2 色位图)为例,比如它的调色板中 定义的两种颜色值依次为 0x000000(黑色)和 0xFFFFFF(白色) ,那么图像数据001101010111(每个像素用 1 位表示)表示对应各 像素的颜色为:黑黑白白黑白黑白黑白白白。 RGB565 使用 16 位表示一个像素,这 16 位中的 5 位用于 R,6 位用于 G,5位用于 B。程序中通常使用一个字(WORD,一个字等于两个字节)来操作一个像素。当读出一个像素后,这个字的各个位意义如下:高字节 低字节R R R R R G G G G G G
9、 B B B B B可以组合使用屏蔽字和移位操作来得到 RGB 各分量的值:#define RGB565_MASK_RED 0xF800#define RGB565_MASK_GREEN 0x07E0#define RGB565_MASK_BLUE 0x001FR = (wPixel / 取值范围 0-31G = (wPixel / 取值范围 0-63B = wPixel / 取值范围 0-31 RGB555 是另一种 16 位的 RGB 格式,RGB 分量都用 5 位表示(剩下的 1 位不用) 。使用一个字读出一个像素后,这个字的各个位意义如下:高字节 低字节X R R R R G G G
10、G G B B B B B (X 表示不用,可以忽略) RGB24 使用 24 位来表示一个像素,RGB 分量都用 8 位表示,取值范围为 0-255 RGB32 使用 32 位来表示一个像素,RGB 分量各用去 8 位,剩下的 8 位不用 ARGB32 就是带 Alpha 通道的下面介绍 YUV 格式:平常所讲的 YUV A:B:C 的意思一般是指基于 4 个象素来讲,其中 Y 采样了 A 次,U 采样了 B 次,V 采样了 C 次.YUV 格式可以分为打包格式和平面格式。打包格式将 YUV 分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel) ;而平面格使用
11、三个数组分开存放 YUV 三个分量,就像是一个三维平面一样。主要的采样格式有 YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1 和 YCbCr 4:4:4。其中 YCbCr 4:1:1 比较常用,其含义为:每个点保存一个 8bit 的亮度值(也就是 Y 值) ,每 2x2 个点保存一个 Cr 和 Cb 值, 图像在肉眼中的感觉不会起太大的变化。所以,原来用 RGB(R,G,B 都是 8bit unsigned)模型,4 个点需要 8x3=24 bites。而现在仅需要 8+(8/4)+(8/4)=12bites,平均每个点占 12bites。这样就把图像的数据压缩了一半。
12、 上边仅给出了理论上的示例,在实际数据存储中是有可能是不同的,下面给出几种具体的存储形式: (请参考本文最后的图例以帮助理解)(1) YUV 4:4:4 YUV 三个信道的抽样率相同,因此在生成的图像里,每个象素的三个分量信息完整(每个分量通常 8 比特) ,经过 8 比特量化之后,未经压缩的每个像素占用3 个字节。 下面的四个像素为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3 存放的码流为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3映射出像素点保持原样(2) YUV 4:2:2每个色差信道的抽样率是亮度信道的一半,所以水平方向的色度
13、抽样率只是 4:4:4的一半。对非压缩的 8 比特量化的图像来说,每个由两个水平方向相邻的像素组成的宏像素需要占用 4 字节内存。下面的四个像素为:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3 存放的码流为:Y0 U0 Y1 V1 Y2 U2 Y3 V3映射出像素点为:Y0 U0 V1 Y1 U0 V1 Y2 U2 V3 Y3 U2 V3(3) YUV 4:1:14:1:1 的色度抽样,是在水平方向上对色度进行 4:1 抽样。对于低端用户和消费类产品这仍然是可以接受的。对非压缩的 8 比特量化的视频来说,每个由 4 个水平方向相邻的像素组成的宏像素需要占用 6 字节内
14、存。原来四个像素为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3 存放的码流为: Y0 U0 Y1 Y2 V2 Y3还原出像素点为:Y0 U0 V2 Y1 U0 V2 Y2 U0 V2 Y3 U0 V2用 6 个 YUV 分量描述了原来的 12 个 YUV 分量,因此压缩比为 1/2,平均来讲,就是用了 12bit 表示了一个象素点,原来 YUV(8bit*3)是 24bit。(4)YUV4:2:04:2:0 并不意味着只有 Y,Cb 而没有 Cr 分量。它指得是对每行扫描线来说,只有一种色度分量以 2:1 的抽样率存储。相邻的扫描行存储不同的色度分 量,也就是说,
15、如果一行是 4:2:0 的话,下一行就是 4:0:2,再下一行是 4:2:0.以此类推。对每个色度分量来说,水平方向和竖直方向的抽样率 都是 2:1,所以可以说色度的抽样率是 4:1。对非压缩的 8 比特量化的视频来说,每个由 2x2 个 2行 2 列相邻的像素组成的宏像素需要占用 6 字节内存。下面八个像素为:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3 Y5 U5 V5 Y6 U6 V6 Y7U7 V7 Y8 U8 V8存放的码流为:Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8映射出的像素点为:Y0 U0 V5 Y1 U0 V5 Y2 U2 V7 Y3 U2 V7 Y5 U0 V5 Y6 U0 V5 Y7U2 V7 Y8 U2 V7YUV411、 YUV420 格式多见于 DV 数据中,前者用于 NTSC 制,后者用于PAL 制。YUV411 为每个像素都提取 Y 分量,而 UV 分量在水平方向上每 4 个像素采样 一次。YUV420 并非 V 分量采样为 0,而是跟 YUV411 相比,在水平方向上提高一倍色差采样频率,在垂直方向上以 U/V 间隔的方式减小一半色差采样, 如下示意图:更形象的图示: