BGR颜色空间到底是什么?

49

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

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


BGR颜色空间是RGB颜色空间的变体,其中颜色通道的顺序被反转为蓝色、绿色和红色。在计算机视觉中,使用BGR颜色空间比RGB更常见,因为它与OpenCV等许多计算机视觉库兼容。
4个回答

52

这篇内容涉及字节序。

RGB是一个字节顺序。但大多数基本图形库的实现选择是将颜色在内部作为无符号32位整数处理,并将三个(或四个,因为通常包括alpha)组件打包到整数中。

在小端机器上(如x86),整数0x01020304实际上会被存储在内存中为0x04030201。因此,0x00BBGGRR将被存储为0xRRGGBB00!

因此,BGR(以及BGRA等)是一个有泄漏的抽象概念,其中图形库解释了整数的逻辑顺序,以使直接访问颜色组件的代码更易读。

请记住,位图通常由比您的处理器更多的硬件部分访问,并且由常规显示适配器指定的字节序不一定与您的CPU的字节序相同。在操作像素通道的级别上,CPU提取字段无论其顺序如何都不会出问题;这只是程序员理解标记的事情。


2
但在Windows中,必要的字节顺序是0xBB、0xGG、0xRR——你如何解释这个? - Mark Ransom
5
我不认为这与字节序有关。Gamegear和Wonderswan Color都使用BGR颜色,而Gameboy Color和Advance则使用RGB颜色。它们都是小端系统(分别基于Z80、80286、Z80和ARM)。 - strager
4
请在http://dev.chromium.org/developers/design-documents/graphics-and-skia中搜索“RGBA和BGRA的史诗般的战斗”。 - Will
7
我的理论是:他们希望按照波长逐渐增加的顺序排列它们。 - letmaik
对于现在进来的任何人,根据这个答案,PC平台上BGR的最初用途可以追溯到一种方便的技巧,用于与原始IBM VGA实现使用的RAMDAC进行交互。Windows使用BGR也是类似的。 - ssokolow

33

RGB代表红绿蓝。通常情况下,RGB颜色以结构体或无符号整数的形式存储,其中蓝色占据最低的“区域”(在32位和24位格式中是一个字节),绿色第二低,红色第三低。

BGR也是一样的,只不过区域的顺序被颠倒了。红色占据最低位,绿色仍然是第二位,而蓝色是第三位。

在某些平台上(例如Gamegear),会使用BGR模型。但是通常情况下,RGB可能会被使用(尽管为了兼容性,许多图形API支持BGR)。我不确定为什么会使用它,可能是由于历史原因。

示例:#FF0000在读作RGB十六进制颜色(#rrggbb)时是纯红色,因为第三个区域(数字从右向左读取!)是FF(最大值,全彩色),其他两个区域都是00(最小值,无颜色)。如果将#FF0000读作BGR十六进制颜色,那么这将是纯蓝色。


14
这个答案是错误的:请查看http://docs.opencv.org/doc/tutorials/core/how_to_scan_images/how_to_scan_images.html#how-the-image-matrix-is-stored-in-the-memory。OpenCV的约定是BGR,B存储在比R更低的字节地址上。无论是B还是R最不重要取决于机器的字节顺序,而且24位BGR像素不与无符号整数的32位边界对齐(因此使用它来解释并没有太多意义)。 - Bull

5
这里涉及到颜色分量在内存中的排列方式。对于BGR,顺序是BGRBGRBGRBGR...,而对于RGB,顺序是RGBRGBRGB... 对于OpenCV默认的BGR顺序,如下所示: enter image description here (请参阅OpenCV文档图像矩阵在内存中的存储方式)
请注意,其他答案提到某些颜色最不重要或最重要,但实际上这取决于您计算机的字节序。而在无符号整数中,组件的打包顺序实际上取决于您使用的软件或库。但是,无论您使用的库还是机器的字节序如何,对于BGR像素,B颜色分量的字节地址将比G小1,比R小2(对于RGB则恰好相反)。

2

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

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

RGB值通常被写成RGB(r,g,b),其中r/g/b值在0到255之间(包括0和255),或者写成#rrggbb,其中rr/gg/bb是8位十六进制值。我见过的所有BGR值都是简单的整数,介于0167772150xffffff)之间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接