Цвет RGB состоит из трех компонентов: красного (0–255), зеленого (0–255) и синего (0–255).
Что такое цветовое пространство BGR? Чем оно отличается от цветового пространства RGB?
Цвет RGB состоит из трех компонентов: красного (0–255), зеленого (0–255) и синего (0–255).
Что такое цветовое пространство BGR? Чем оно отличается от цветового пространства RGB?
RGB означает красный зеленый синий. Чаще всего цвет RGB сохраняется в виде структуры или целого числа без знака, при этом синий занимает наименее значимую «область» (байт в 32-битном и 24-битном форматах), зеленый - вторым наименьшим, а красный - третьим наименьшим.
BGR такой же, за исключением того, что порядок областей обратный. Красный занимает наименее значимую область, зеленый - вторую (неподвижную), а синий - третью.
На некоторых платформах (например, Gamegear) используется модель BGR. Однако часто может использоваться RGB (хотя BGR поддерживается многими графическими API для совместимости). Я не уверен, почему именно он используется; наверное исторический.
Пример: # FF0000 является чисто красным при чтении как шестнадцатеричный цвет RGB (#rrggbb), потому что третья область (числа читаются справа налево!) - это FF (максимальное значение, полный цвет), а две другие области - 00 (минимальное значение, без цвета). Если бы # FF0000 читалось как шестнадцатеричный цвет BGR, он был бы чисто синим.
Дело в порядке байтов.
RGB - это порядок байтов. Но сознательный выбор реализации большинства ванильных графических библиотек заключается в том, что они обрабатывают цвета как 32-битные целые числа без знака внутри, с тремя (или четырьмя, поскольку обычно включается альфа) компонентами, упакованными в целое число.
На машине с прямым порядком байтов (например, x86) целое число 0x01020304 будет фактически сохранено в памяти как 0x04030201. Таким образом, 0x00BBGGRR будет сохранен как 0xRRGGBB00!
Таким образом, термин BGR (и BGRA и т. Д.) - это ненадежная абстракция, в которой графическая библиотека объясняет, как логически упорядочено целое число, чтобы сделать ваш код, который напрямую обращается к цветовым компонентам по отдельности, более читабельным.
Помните, что к растровым изображениям обычно обращается большее количество частей оборудования, чем ваш процессор, и порядок байтов, указываемый, скажем, обычными видеоадаптерами, не обязательно совпадает с порядком байтов вашего процессора. На уровне управления каналами в пикселе для ЦП не проблема извлекать поля в любом их порядке; это чисто программист, разбирающийся в маркировке.
Речь идет о способе размещения цветовых компонентов в памяти. Для BGR порядок - BGRBGRBGRBGR ..., а для RGB - RGBRGBRGB ... Для BGR, порядок по умолчанию для OpenCV, выглядит следующим образом:
(см. документацию OpenCV для Как матрица изображения хранится в памяти?)
Обратите внимание, что в других ответах упоминается, что определенные цвета имеют наименьшее или наибольшее значение, но на самом деле это зависит от порядка байтов вашей машины. И порядок упаковки компонентов в unsigned int, например, фактически зависит от вашего программного обеспечения или библиотеки, которую вы используете. Однако, независимо от вашей библиотеки или порядка байтов вашей машины, для пикселя BGR байтовый адрес компонента цвета B будет на один меньше, чем для G, и на два меньше, чем для R (а для RGB это как раз наоборот. ).
Это просто 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
).