Что такое цветовое пространство BGR?

Цвет RGB состоит из трех компонентов: красного (0–255), зеленого (0–255) и синего (0–255).

Что такое цветовое пространство BGR? Чем оно отличается от цветового пространства RGB?


person user43076    schedule 15.12.2008    source источник


Ответы (4)


RGB означает красный зеленый синий. Чаще всего цвет RGB сохраняется в виде структуры или целого числа без знака, при этом синий занимает наименее значимую «область» (байт в 32-битном и 24-битном форматах), зеленый - вторым наименьшим, а красный - третьим наименьшим.

BGR такой же, за исключением того, что порядок областей обратный. Красный занимает наименее значимую область, зеленый - вторую (неподвижную), а синий - третью.

На некоторых платформах (например, Gamegear) используется модель BGR. Однако часто может использоваться RGB (хотя BGR поддерживается многими графическими API для совместимости). Я не уверен, почему именно он используется; наверное исторический.

Пример: # FF0000 является чисто красным при чтении как шестнадцатеричный цвет RGB (#rrggbb), потому что третья область (числа читаются справа налево!) - это FF (максимальное значение, полный цвет), а две другие области - 00 (минимальное значение, без цвета). Если бы # FF0000 читалось как шестнадцатеричный цвет BGR, он был бы чисто синим.

person strager    schedule 15.12.2008
comment
Этот ответ неверен: см. docs.opencv.org/doc/tutorials/core/how_to_scan_images/. Соглашение для OpenCV - BGR, а B хранится по младшему байтовому адресу, чем R. Является ли B или R наименее значимым, зависит или порядок байтов машины, а также 24-битные пиксели BGR не выровнены по 32-битным границам. беззнакового целого числа (поэтому нет смысла использовать это для объяснения). - person Bull; 09.09.2014

Дело в порядке байтов.

RGB - это порядок байтов. Но сознательный выбор реализации большинства ванильных графических библиотек заключается в том, что они обрабатывают цвета как 32-битные целые числа без знака внутри, с тремя (или четырьмя, поскольку обычно включается альфа) компонентами, упакованными в целое число.

На машине с прямым порядком байтов (например, x86) целое число 0x01020304 будет фактически сохранено в памяти как 0x04030201. Таким образом, 0x00BBGGRR будет сохранен как 0xRRGGBB00!

Таким образом, термин BGR (и BGRA и т. Д.) - это ненадежная абстракция, в которой графическая библиотека объясняет, как логически упорядочено целое число, чтобы сделать ваш код, который напрямую обращается к цветовым компонентам по отдельности, более читабельным.

Помните, что к растровым изображениям обычно обращается большее количество частей оборудования, чем ваш процессор, и порядок байтов, указываемый, скажем, обычными видеоадаптерами, не обязательно совпадает с порядком байтов вашего процессора. На уровне управления каналами в пикселе для ЦП не проблема извлекать поля в любом их порядке; это чисто программист, разбирающийся в маркировке.

person Will    schedule 15.12.2008
comment
Но в Windows необходимый порядок байтов - 0xBB, 0xGG, 0xRR - как вы это объясните? - person Mark Ransom; 16.12.2008
comment
Я не верю, что это как-то связано с порядком байтов. Gamegear использует цвет BGR, а также цвет Wonderswan, но Gameboy Color и Advance используют цвет RGB. Все это системы с прямым порядком байтов (Z80, 80286, Z80 и ARM, соответственно). - person strager; 16.12.2008
comment
dev.chromium.org/developers/design-documents/graphics-and- skia search for Эпическая битва RGBA и BGRA - person Will; 17.07.2009
comment
Моя теория: они хотели их в порядке увеличения длины волны. - person letmaik; 09.05.2014
comment
Для всех, кто забредает сейчас, согласно этому ответу, первоначальное использование BGR на Платформа ПК восходит к удобному трюку для взаимодействия с RAMDAC, который использовался с исходной реализацией IBM VGA. Windows, использующая BGR, будет чем-то похожим. - person ssokolow; 28.02.2019

Речь идет о способе размещения цветовых компонентов в памяти. Для BGR порядок - BGRBGRBGRBGR ..., а для RGB - RGBRGBRGB ... Для BGR, порядок по умолчанию для OpenCV, выглядит следующим образом:

введите описание изображения здесь(см. документацию OpenCV для Как матрица изображения хранится в памяти?)

Обратите внимание, что в других ответах упоминается, что определенные цвета имеют наименьшее или наибольшее значение, но на самом деле это зависит от порядка байтов вашей машины. И порядок упаковки компонентов в unsigned int, например, фактически зависит от вашего программного обеспечения или библиотеки, которую вы используете. Однако, независимо от вашей библиотеки или порядка байтов вашей машины, для пикселя BGR байтовый адрес компонента цвета B будет на один меньше, чем для G, и на два меньше, чем для R (а для RGB это как раз наоборот. ).

person Bull    schedule 09.09.2014

Это просто 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).

person paxdiablo    schedule 15.12.2008