44

RGB 颜色由三个分量组成:红色 (0-255)、绿色 (0-255) 和蓝色 (0-255)。

BGR色彩空间到底是什么?它与 RGB 颜色空间有何不同?

4

4 回答 4

47

它关于字节序

RGB 是一个字节顺序。但是大多数普通图形库的一个故意实现选择是它们在内部将颜色视为无符号的 32 位整数,将三个(或四个,通常包括 alpha)分量打包到整数中。

在 little-endian 机器(例如 x86)上,整数 0x01020304 实际上将作为 0x04030201 存储在内存中。因此 0x00BBGGRR 将被存储为 0xRRGGBB00!

因此,术语 BGR(和 BGRA 等)是一个泄漏抽象,其中图形库解释整数如何在逻辑上排序,以便使您的代码直接访问单独的颜色组件更具可读性。

请记住,位图通常由比处理器更多的硬件部分访问,并且由传统显示适配器指定的字节序不一定与 CPU 的字节序相同。在操作像素中的通道的级别上,CPU 可以提取任意顺序的字段。它纯粹是一个了解标签事物的程序员。

于 2008-12-15T22:43:52.103 回答
28

RGB 代表红绿蓝。大多数情况下,RGB 颜色存储在结构或无符号整数中,蓝色占据最低有效“区域”(32 位和 24 位格式的字节),绿色第二少,红色第三少。

BGR 是相同的,只是区域的顺序相反。红色占据最不重要的区域,绿色第二(仍然),蓝色第三。

在某些平台(例如Gamegear)上,使用了 BGR 模型。但是,通常可能会使用 RGB(尽管许多图形 API 都支持 BGR 以实现兼容性)。我不确定为什么要使用它。大概是历史的。

示例:#FF0000 在读取为 RGB 十六进制颜色 (#rrggbb) 时为纯红色,因为第三个区域(数字从右到左读取!)为 FF(最大值,全色),其他两个区域为 00(最小值价值,没有颜色)。如果 #FF0000 被读取为 BGR 十六进制颜色,它将是纯蓝色。

于 2008-12-15T04:44:09.367 回答
6

这是关于颜色分量在内存中的布局方式。对于 BGR,顺序是 BGRBGRBGRBGR...,对于 RGB,顺序是 RGBRGBRGB... 对于 BGR,OpenCV 的默认顺序是这样的:

在此处输入图像描述 (请参阅 OpenCV 文档了解图像矩阵是如何存储在内存中的?

请注意,其他答案提到某些颜色最不重要或最重要,但这实际上取决于您机器的字节序。例如,无符号整数中组件的打包顺序实际上取决于您的软件或您正在使用的库。但是,无论您的库或机器的字节序如何,对于 BGR 像素,B 颜色分量的字节地址将比 G 少一个,比 R 少两个(而对于 RGB,情况正好相反)。

于 2014-09-09T01:14:03.233 回答
1

它只是以更严格控制的顺序排列的 RGB,与字节序无关。一旦您知道环境的字节序,它们之间的转换就很简单了。

BGR 是 24 位表示,其中低地址 8 位为蓝色,下一个地址 8 为绿色,高地址 8 为红色。

RGB 值倾向于写为 RGB(r,g,b),其中 r/g/b 值介于 0 和 255 之间,或者写为 #rrggbb,其中 rr/gg/bb 是 8 位十六进制值。我见过的所有 BGR 值往往是016777215( 0xffffff) 之间的简单整数。

于 2008-12-15T04:14:35.883 回答