我理解RGB ---值(0-255)红色,(0-255)绿色,(0-255)蓝色形成颜色。
BGR色彩空间究竟是什么?
它与RGB色彩空间有何不同?
答案 0 :(得分:37)
关于 endianness 。
RGB是一个字节顺序。但是大多数香草图形库的有意实现选择是它们在内部将颜色视为无符号32位整数,其中三个(或四个,通常包括alpha)组件被打包到整数中。
在小端机器(例如x86)上,整数0x01020304实际上将作为0x04030201存储在内存中。因此0x00BBGGRR将存储为0xRRGGBB00!
因此术语BGR(和BGRA等)是一个漏洞抽象,其中图形库解释整数是如何按逻辑排序的,以便使直接访问颜色组件的代码更具可读性。
请记住,位图通常由硬件的更多部分访问,而不是处理器,并且由传统显示适配器指定的字节序不一定与CPU的字节序相同。在操纵像素中的通道的级别上,CPU无论其顺序如何都可以提取字段;它纯粹是程序员理解标签的东西。
答案 1 :(得分:21)
RGB代表红绿蓝。大多数情况下,RGB颜色存储在结构或无符号整数中,蓝色占据最不重要的“区域”(32位和24位格式的字节),绿色第二少,红色第三少。
BGR是相同的,除了区域顺序颠倒。红色占据最不重要的区域,绿色占第二个(静止),蓝色占第三个。
在某些平台上(例如Gamegear),使用BGR模型。但是,对于大多数人来说,就像你的计算机一样,使用了RGB [需要引用](尽管许多图形API都支持BGR以实现兼容性)。我不确定为什么确切地使用它;可能是历史性的。
示例:当读取为RGB十六进制颜色(#rrggbb)时,#FF0000为纯红色,因为第三个区域(数字从右向左读取!)是FF(最大值,全彩色),另外两个区域是00(最小值,没有颜色)。如果#FF0000被读作BGR十六进制颜色,则它是纯蓝色。
答案 2 :(得分:5)
关于颜色组件在内存中的布局方式。对于BGR,顺序是BGRBGRBGRBGR ...,对于RGB,顺序是RGBRGBRGB ...对于BGR,OpenCV的默认顺序,它是这样的:
(参见How the image matrix is stored in the memory?的OpenCV文档)
请注意,其他答案提到某些颜色最不重要或最重要,但这实际上取决于您的机器的字节顺序。而unsigned int中组件的打包顺序,例如,实际上取决于您的软件或您正在使用的库。但是,无论您的库或机器的endiannes,对于BGR像素,B颜色分量的字节地址将比G少一个,并且比R少两个(对于RGB,它只是相反的方式) )。
答案 3 :(得分:2)
只是RGB处于更严格控制的顺序中,与字节顺序无关。一旦您知道环境的字节顺序,就可以轻松转换它们。
BGR是一个24位表示,其中较低寻址的8位为蓝色,下一个寻址的8位为绿色,较高位的8位为红色。
RGB值倾向于写为RGB(r,g,b),其中r / g / b值介于0和255之间,或者为#rrggbb,其中rr / gg / bb是8位十六进制值。我看到的所有BGR值往往是0
和16777215
(0xffffff
)之间的简单整数。