RGB 色彩模型
任何图像都可以用rgb组成。也就是三原色,红绿蓝。
红绿蓝再计算机中使用 0~255 表示(1 byte)。每个像素都包含r,g,b三个分量,也就包含 3b。
如果一张图分辨率为 1920 x 1080 那么其大小就是 1920 x1080 x3 /1024 /1024 = 5.92Mb
上一章提到人眼感受到的视频最少是每秒25张图片,那么如果一部电影2个小时,其大小就为 1920 x1080 x3 x25 x2 x60 x60 /1024 /1024 /1024 = 1040.6Gb 大的夸张,所以我们不能直接使用rgb的数据,而是需要对其进行压缩。
RGB格式
RGB实际上就是三原色的组合,不同的格式本质便是对于每一种单色的不同存储和表示方法。
-
RGB565:
用16个bit(2字节)表示一个像素,5个bit表示R(红色),6个bit表示G(绿色),5个bit表示B(蓝色),从高位到低位排列如下:获取具体像素值方法:
根据RGB565的存储方式,即可得到获取R,G,B分量的值。现假设计算机中存储某一个像素点的变量为color, 数据类型为short. 那么则有:- R = color & 0xF800, (获取高字节的5个bit)
- G = color & 0x07E0, (获取中间6个bit)
- B = color & 0x001F, (获取低字节5个bit)
-
RGB555:
用16个bit(2字节)表示一个像素,其中最高位不用,R(红色), G(绿色), B(蓝色)都用5个bit来表示,从高位到低位排列如下:获取具体像素值方法:
根据RGB555的存储方式,即可得到获取R,G,B分量的值。现假设计算机中存储某一个像素点的变量为color, 数据类型为short. 那么则有:- R = color & 0x7C00, (获取高字节的5个bit)
- G = color & 0x03E0, (获取中间5个bit)
- B = color & 0x001F, (获取低字节5个bit)
-
RGB24:
用24个bit(3字节)表示一个像素,R(红色), G(绿色), B(蓝色)都用8个bit来表示,从高位到低位排列如下:获取具体像素值方法:
根据RGB24的存储方式,即可得到获取R,G,B分量的值。现假设计算机中存储某一个像素点的变量为color, 数据类型为short. 那么则有:- R = color & 0x000000FF,
- G = color & 0x0000FF00,
- B = color & 0x00FF0000,
-
RGB32(RGBA):
用32个bit(4字节)表示一个像素,R(红色), G(绿色), B(蓝色)都用8个bit来表示,然后用8个bit来表示alpha(透明度),从高位到低位排列如下:获取具体像素值方法:
根据RGB32的存储方式,即可得到获取R,G,B分量的值。现假设计算机中存储某一个像素点的变量为color, 数据类型为short. 那么则有:- R = color & 0x0000FF00
- G = color & 0x00FF0000,
- B = color & 0xFF000000,
YUV色彩模型
YUV模型(也叫YCbCr)是根据一个亮度(Y分量)和两个色度(UV分量)来定义颜色空间。
- Y:亮度,就是灰度值。除了表示亮度信号外,还含有较多的绿色通道量;
- U:蓝色通道与亮度的差值;
- V:红色通道与亮度的差值。
色度信号被存储成Cb和Cr(C代表颜色,b代表蓝色,r代表红色)
下图很好的展示了YUV3个分量的效果差值:
那么为什么要用YUV?
- 人眼对亮度敏感,对色度不敏感,因此减少部分UV的数据量,人眼却无法感知出来,这样可以通过压缩UV的分辨率,在不影响观感的前提下,减小视频的体积。
- 视频编码解码过程中,常见的是YUV格式,因为同样的图片yuv格式的图片大小远小于RGB图片大小。下图是同一张图片不同格式大小对比:
YUV格式
YUV格式,本质便是在每一个2x2的像素块中,选取几个Y分量,几个U分量,几个V分量来表示该像素块。
- YUV444:
- 每一个像素用Y, U, V共同表示
- YUV 4:4:4采样,每一个Y分量对应一组UV分量,一个YUV占8+8+8 = 24bits 3个字节。
- 如果一个图片宽为width,高为heigth,在内存中占的空间为 width x height x 3,其中包含width x height的Y,U,V分量。
-
YUV422:
- Y分量每个像素采样,U,V分量每两个像素采一次样,第一个像素的U,V分量的值用在第0个像素处采样的U0,VO的值;第三个像素的U,V分量的值用在第2个元素处采样的U1,V1的值。
- YUV 4:2:2采样,每两个Y共用一组UV分量,一个YUV占8+4+4 = 16bits 2个字节。
- 如果一个图片宽为width,高为heigth,在内存中占的空间为 width x height x 2,其中包含width x height的Y分量,width x height / 2的U,V分量。
-
YUV420:
- 对于每个2x2像素块,对于每个像素Y分量采样,整个2x2块中分别对U和V分量只做一次采样.
- YUV 4:2:0采样,每四个Y共用一组UV分量,一个YUV占8+2+2 = 12bits 1.5个字节。
- 如果一个图片宽为width,高为heigth,在内存中占的空间为 width x height x 3 / 2,其中包含width x height的Y分量,width x height /4的U,V分量。
对于YUV420来说还分为两种:YUV420P和YUV420SP
-
YUV420P
-
YUV420SP
可以看出来,两者的区别在于YUV420P中是先存储U分量,存完之后存储V分量。YUV420SP是UV分量连续存储。
参考博文:
blog.51cto.com/7335580/205…
blog.csdn.net/byhook/arti…