在前文《RTC 应用中最常使用的色彩空间之 RGB 和 YUV》中,我们已经知道,图像由像素组成,而像素通过记录色彩空间各分量呈现各种各样的色彩。对于 RGB 色彩空间,其三个分量 R(红)、G(绿)、B(蓝),它们之间具有相关性,对于色彩的表示来说缺一不可。
所以,RGB 的每个像素都会完整采样三个分量,采样比例为 1:1:1(指每个分量的采样数,而非每个分量的数值)。也正是因为这种采样要求,RGB 颜色空间在采集上不好进行数据压缩,不太适用于视频图像的编码、传输。
RGB 三个分量采样后,在内存中是依次排列存储的。但是,它们的存储顺序不一定是字面描述的 R、G、B。不同的应用场景,因处理逻辑差异可能会使用不同的规则。比如,MATLAB 使用的存储顺序为 R、G、B,而 OpenCV 则使用 B、G、R,如下图所示:
我们把 RGB 字面描述的分量顺序,称为字面序,将其实际存储的分量顺序,称为字节序。确定好色彩空间存储的字节序,是正确处理图像的前提,如果随意对各分量进行读取,可能会导致处理后的颜色出现异常。下图,即为使用 RGB 顺序读取字节序为 BGR 的图片的效果,此时,由于将 B、R 分量混淆了,得到了错误的图片颜色。
另外,大家还也会接触到 BGRA 这样的存储格式(比如在 iOS、MAC 上处理摄像头数据),其中的 A ,表示在 RGB 三个通道基础上,增加了一个透明度通道 Alpha,用于调整色彩的透明度,实现更丰富的色彩效果。对于增加了透明度的RGB,同样需要留意其实际的存储顺序,常见的有 BGRA、RGBA、ABGR 和 ARGB 等等。
总之,RGB 的采样格式、存储格式相对比较简单,我们也不做过多的展开。正如上篇文章所述,在视频处理领域,YUV 色彩空间才是主角,它的采样格式、存储格式相对于 RGB 也更加复杂 。
原创文章,作者:ZEGO即构科技,如若转载,请注明出处:https://market-blogs.zego.im/reports-technique/575/