Une couleur RVB est composée de trois composants: rouge (0-255), vert (0-255) et bleu (0-255).
Qu'est-ce que l'espace colorimétrique BGR exactement? En quoi est-il différent de l'espace colorimétrique RVB?
RVB signifie rouge vert bleu. Le plus souvent, une couleur RVB est stockée dans une structure ou un entier non signé, le bleu occupant la "zone" la moins significative (un octet aux formats 32 bits et 24 bits), le vert le deuxième et le rouge le moins.
BGR est le même, sauf que l'ordre des zones est inversé. Le rouge occupe la zone la moins importante, le vert le deuxième (encore) et le bleu le troisième.
Sur certaines plateformes (par exemple Gamegear ), un modèle BGR est utilisé. Cependant, souvent, RVB peut être utilisé (bien que BGR soit pris en charge par de nombreuses API graphiques pour la compatibilité). Je ne sais pas pourquoi exactement il est utilisé; probablement historique.
Exemple: # FF0000 est du rouge pur lors de la lecture en tant que couleur hexadécimale RVB (#rrggbb), car la troisième zone (les chiffres sont lus de droite à gauche!) Est FF (valeur maximale, pleine couleur) et les deux autres zones sont 00 (minimum valeur, pas de couleur). Si # FF0000 était lu comme une couleur hexadécimale BGR, ce serait du bleu pur.
Il s'agit de endianness.
RVB est un ordre d'octets. Mais un choix d'implémentation délibéré de la plupart des bibliothèques Vanilla Graphics est qu'elles traitent les couleurs comme des entiers 32 bits non signés en interne, avec les trois (ou quatre, comme alpha est généralement inclus) composants regroupés dans l'entier.
Sur une machine peu endienne (telle que x86), l'entier 0x01020304 sera réellement stocké en mémoire sous le nom 0x04030201. Et donc 0x00BBGGRR sera stocké en tant que 0xRRGGBB00!
Ainsi, le terme BGR (et BGRA, etc.) est une abstraction qui fuit où la bibliothèque graphique explique comment l'ordre entier est logiquement ordonné, afin de rendre votre code qui accède directement aux composants de couleur individuellement plus lisible.
N'oubliez pas que les images bitmap sont généralement accessibles par plus de parties du matériel que votre processeur, et que l'endian spécifié, par exemple, par les adaptateurs d'affichage conventionnels, n'est pas nécessairement le même que l'endian de votre CPU. Au niveau de la manipulation des canaux dans le pixel ce n'est pas un problème pour un CPU d'extraire les champs quel que soit leur ordre; son purement un programmeur comprendre la chose d'étiquetage.
Il s'agit de la façon dont les composants de couleur sont disposés en mémoire. Pour BGR, l'ordre est BGRBGRBGRBGR ... et pour RVB, l'ordre est RGBRGBRGB ... Pour BGR, l'ordre par défaut pour OpenCV, c'est comme ceci:
(Voir la documentation OpenCV pour Comment la matrice d'image est-elle stockée dans la mémoire? )
Notez que les autres réponses ont fait référence à certaines couleurs ayant la moindre ou la plus grande importance, mais cela dépend en fait de l'endianité de votre machine. Et l'ordre d'emballage des composants dans un entier non signé, par exemple, dépend en fait de votre logiciel ou de la bibliothèque que vous utilisez. Cependant, quelle que soit votre bibliothèque ou les endiannes de votre machine, pour le pixel BGR, l'adresse d'octet du composant de couleur B sera une de moins que pour G et deux de moins que pour R (et pour RVB, c'est juste l'inverse). ).
C'est juste RVB dans un ordre plus étroitement contrôlé, indépendant de l'endianité. La conversion entre eux est simple une fois que vous connaissez l'endianisme de votre environnement.
Le BGR est une représentation de 24 bits où les 8 bits à adresse inférieure sont bleus, les 8 à adresse suivante sont verts et 8 à adresse supérieure sont rouges.
Les valeurs RVB ont tendance à être écrites comme RVB (r, g, b) où les valeurs r/g/b sont comprises entre 0 et 255 inclus ou comme #rrggbb, où rr/gg/bb sont des valeurs hexadécimales 8 bits. Toutes les valeurs BGR que j'ai vues ont tendance à être de simples entiers entre 0
et 16777215
(0xffffff
).