Solución:
Se trata de endianidad.
RGB es un orden de bytes. Pero una elección de implementación deliberada de la mayoría de las bibliotecas de gráficos vanilla es que tratan los colores como enteros de 32 bits sin firmar internamente, con los tres (o cuatro, como se suele incluir alfa) componentes empaquetados en el entero.
En una máquina little-endian (como x86), el entero 0x01020304 se almacenará en la memoria como 0x04030201. ¡Y así 0x00BBGGRR se almacenará como 0xRRGGBB00!
Entonces, el término BGR (y BGRA, etc.) es una abstracción con fugas en la que la biblioteca de gráficos explica cómo se ordena lógicamente el número entero, para que su código que accede directamente a los componentes de color individualmente sea más legible.
Recuerde que a los mapas de bits generalmente acceden más partes del hardware que su procesador, y el endian especificado por, digamos, adaptadores de pantalla convencionales, no es necesariamente el mismo que el endian de su CPU. En el nivel de manipulación de los canales en el píxel, no es un problema para una CPU extraer los campos en cualquier orden; es puramente un programador que entiende el tema del etiquetado.
RGB son las siglas de Red Green Blue. La mayoría de las veces, un color RGB se almacena en una estructura o un entero sin signo con el azul ocupando el “área” menos significativa (un byte en los formatos de 32 y 24 bits), el verde el segundo menos y el rojo el tercero menos.
BGR es el mismo, excepto que se invierte el orden de las áreas. El rojo ocupa el área menos significativa, el verde la segunda (inmóvil) y el azul la tercera.
En algunas plataformas (por ejemplo, Gamegear), se utiliza un modelo BGR. Sin embargo, a menudo, se puede usar RGB (aunque BGR es compatible con muchas API de gráficos por compatibilidad). No estoy seguro por qué exactamente se usa; probablemente histórico.
Ejemplo: # FF0000 es rojo puro cuando se lee como un color RGB hexadecimal (#rrggbb), porque la tercera área (¡los números se leen de derecha a izquierda!) Es FF (valor máximo, a todo color) y las otras dos áreas son 00 (mínimo valor, sin color). Si # FF0000 se leyera como un color hexadecimal BGR, sería azul puro.
Se trata de la forma en que los componentes de color se distribuyen en la memoria. Para BGR el orden es BGRBGRBGRBGR …, y para RGB el orden es RGBRGBRGB … Para BGR, el orden predeterminado para OpenCV, es así:
(Consulte la documentación de OpenCV para saber cómo se almacena la matriz de imágenes en la memoria).
Tenga en cuenta que las otras respuestas se han referido a que ciertos colores tienen menos o más importancia, pero eso en realidad depende de la endianidad de su máquina. Y el orden de empaquetado de los componentes en un int sin firmar, por ejemplo, en realidad depende de su software o de la biblioteca que esté utilizando. Sin embargo, independientemente de su biblioteca, o los endiannes de su máquina, para el píxel BGR, la dirección de byte del componente de color B será uno menos que para G y dos menos que para R (y para RGB es al revés) ).