0%

视音频技术-RGB视频像素数据

1、RGB视频像素数据

RGB色彩模式,是通过对红绿蓝三个颜色通道的变化,以及相互之间的叠加得到各种颜色。
每种颜色值范围为0-255,所以每个颜色值使用1个字节byte也就是8个比特bit表示。

1.1、色深

色深即色彩深度,色彩深度是计算机图形学领域表示在位图或者视频帧缓冲区中储存1像素的颜色所用的位数,它也称为位/像素(bpp)。色彩深度越高,可用的颜色就越多。

1.2、RGB格式

1.2.1、索引形式

索引形式表示每个像素使用1、4、8个比特bit表示,存储的是对应像素在调色板的索引,而非像素的RGB分量值,调色板是通过编号映射到颜色的一张二维表。

索引形式 颜色
RGB1 黑白两种颜色
RGB4 16种颜色
RGB8 256种颜色

1.2.2、像素形式

像素形式表示每个像素的RGB值使用N个比特bit表示。

像素形式 颜色
RGB565 R、G、B分别使用5、6、5个比特bit表示,共16个比特/位bit,2个字节byte,1个字Word
RGB55 RGB分别使用5个比特表示,剩余一位高字节不用,共16个比特
RGB24/RGB888 RGB分别使用8个比特表示,共24个比特
RGB32 RGB分别使用8个比特表示,剩余8位低字节不用,共32个比特

假设计算机中存储某一个像素点的变量为color,数据类型为short。
RGB565:
RGB565

1
2
3
R = color & 0xF800, (获取高字节的 5 个 bit)
G = color & 0x07E0, (获取中间 6 个 bit)
B = color & 0x001F, (获取低字节 5 个 bit)

RGB55:
RGB55

1
2
3
R = color & 0x7C00, (获取高字节的 5 个 bit)
G = color & 0x03E0, (获取中间 5 个 bit)
B = color & 0x001F, (获取低字节 5 个 bit)

RGB24:
RGB24

1
2
3
R = color & 0x000000FF, 
G = color & 0x0000FF00,
B = color & 0x00FF0000,

RGB32:
RGB32

1
2
3
R = color & 0x0000FF00
G = color & 0x00FF0000,
B = color & 0xFF000000,

1.2.3、RGB格式转换

RGB格式转换,由于精度不同,需要量化补偿和量化压缩。

1.2.3.1、量化补偿:

  1. 将原数据填充至高位
  2. 对于低位,用原始数据的低位进行补偿
  3. 如果仍然有未填充的位,继续使用原始数据的低位进行循环补偿
1
2
3
4
例子: 16 bit RGB565 -> 24 bit RGB888 的转换
16 bit RGB656: R4 R3 R2 R1 R0 G5 G4 G3 G2 G1 G0 B4 B3 B2 B1 B0
24 bit RGB888: R4 R3 R2 R1 R0 0 0 0 G5 G4 G3 G2 G1 G0 0 0 B4 B3 B2 B1 B0 0 0 0
24 bit RGB888: R4 R3 R2 R1 R0 R2 R1 R0 G5 G4 G3 G2 G1 G0 G1 G0 B4 B3 B2 B1 B0 B2 B1 B0
1
2
3
4
5
6
7
8
9
10
11
12
13
void rgb565_to_rgb888(unsigned char *image, unsigned char *image888) 
{
unsigned char R, G, B;

R = *(image + 1) & 0xF8; // 补齐成:RRRRR000
G = (*(image + 1) << 5) | (*image & 0xe0 >> 3); // 补齐成:GGGGGG00
B = *image << 3 ; // 补齐成: BBBBB000

// 补偿
*(image888) = B | ((B & 0x38) >> 3);
*(image888 + 1) = G | ((G & 0x0c) >> 2);
*(image888 + 2) = R | ((R & 0x38) >> 3);
}

1.2.3.2、量化压缩:

三个字取高位

1
2
3
例子: 24 bit RGB888 -> 16 bit RGB565 的转换
24 bit RGB888:R7 R6 R5 R4 R3 R2 R1 R0 G7 G6 G5 G4 G3 G2 G1 G0 B7 B6 B5 B4 B3 B2 B1 B0
16 bit RGB656: R7 R6 R5 R4 R3 G7 G6 G5 G4 G3 G2 B7 B6 B5 B4 B3
1
2
3
4
unsigned short rgb_24_to_565(unsigned short r, unsigned short g, unsigned short b)
{
return ((r << 8) & 0xF800) | ((g << 3) & 0x07E0) | ((b >> 3) & 0x001f);
}