Colors BGR颜色空间到底是什么?

Colors BGR颜色空间到底是什么?,colors,opencv,color-space,Colors,Opencv,Color Space,RGB颜色由三部分组成:红色(0-255)、绿色(0-255)和蓝色(0-255) BGR颜色空间到底是什么?它与RGB颜色空间有何不同?它只是RGB,以一种更严格的控制顺序,独立于端点。一旦您了解了环境的持久性,就可以在它们之间进行转换 BGR是一种24位表示,其中较低的寻址8位为蓝色,下一个寻址8位为绿色,较高的寻址8位为红色 RGB值倾向于写为RGB(r,g,b),其中r/g/b值介于0和255之间(含0和255),或写为#rrggbb,其中rr/gg/bb为8位十六进制值。我看到的所有B

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


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

它只是RGB,以一种更严格的控制顺序,独立于端点。一旦您了解了环境的持久性,就可以在它们之间进行转换

BGR是一种24位表示,其中较低的寻址8位为蓝色,下一个寻址8位为绿色,较高的寻址8位为红色


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

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

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

在某些平台上(例如),使用BGR模型。然而,通常可能会使用RGB(尽管为了兼容性,许多图形API都支持BGR)。我不知道为什么会使用它;可能是历史

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

它是关于endianness的

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

在小端机(如x86)上,整数0x01020304实际上将作为0x0403001存储在内存中。因此0x00BBGGRR将存储为0xRRGGBB00

因此术语BGR(和BGRA等)是一个有漏洞的抽象概念,图形库解释整数的逻辑顺序,从而使直接访问颜色组件的代码更具可读性


请记住,位图通常由比处理器更多的硬件部分访问,并且由传统显示适配器指定的endian不一定与CPU的endian相同。在操作像素通道的层面上,CPU提取字段(无论其顺序如何)没有问题;这纯粹是程序员对标签的理解。

这是关于颜色组件在内存中的布局方式。对于BGR,顺序为BGRBGRBGRBGR…,对于RGB,顺序为RGBRGBRGB。。。对于OpenCV的默认顺序BGR,如下所示:

(有关详细信息,请参阅OpenCV文档)


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

但是在Windows中,必要的字节顺序是0xBB,0xGG,0xRR-你怎么解释?我不相信这和endianness有任何关系。Gamegear使用BGR颜色和Wonderswan颜色,但Gameboy颜色和Advance使用RGB颜色。它们都是little-endian系统(分别基于Z80、80286、Z80和ARM)。搜索“RGBA和BGRA的史诗之战”我的理论:他们希望它们按波长增加的顺序排列。据我所说,对于现在闲逛的人来说,PC平台上BGR的最初使用可以追溯到一个与原始IBM VGA实现中使用的RAMDAC交互的便利技巧。使用BGR的Windows可能与此类似。此答案不正确:请参阅。OpenCV的约定是BGR,而B存储在比R低的字节地址。B或R的最低有效性取决于机器的字节顺序,而且24位BGR像素没有与无符号整数的32位边界对齐(因此,用它来解释没有多大意义)。