Cálculo del promedio de dos valores RGB

Tener 2 valores RGB:

  • 255, 23, 22
  • 201, 18, 122

Quiero promediarlos, este enlace dice que realmente necesito elevarlos al cuadrado primero, promediarlos y luego encontrar la raíz cuadrada. He visto algunos otros puntos que dicen lo mismo, o más cerca del poder de 2.2 (y un video de por qué el color de la computadora es incorrecto).

¿Es esta realmente la forma correcta de hacerlo y cuál es el término para el método de elevar al cuadrado? Sé que la mejor manera REAL es el espacio LAB, pero no puedo lidiar con eso.

puede leer acerca de los espacios de color lineales y gamma.
No estoy seguro de que Lab sea el mejor (y sí, es Lab con a y b pequeños) porque en realidad no está destinado a la interpolación, por lo que se desgastaría de muchas maneras. Probablemente mejor en XYZ

Respuestas (3)

R (255+201)/2 = 228

G (23+18)/2 = 20,5

B (22+122)/2 = 72

Esto dependerá de su concepto de "promedio".

Si es el promedio entre blanco y negro, esperaría que el resultado sea 128 y la corrección gamma realizada por la tarjeta gráfica .

Pero la razón perceptiva detrás de ese vínculo es interesante.

El punto es que no solo hay una forma de promediar, debe recordar que el espacio de color es un modelo 3D, no lineal.

Echa un vistazo a estas otras publicaciones relacionadas:

En esta publicación muestro 4 rutas diferentes para una transición de color entre rojo y verde... y eso es solo en una rueda de color normal.

Generando una serie de colores entre dos colores

Pero el color no es solo una superficie 2D sino un sólido, que viene en muchas formas y modelos.

¿Cómo encuentras un color inverso?

Por lo tanto, no existe una sola forma universal de promediar los colores. Esto depende de muchas cosas.

Entonces, ¿tengo razón (¡probablemente no!) Que decir que tomar los rgb y cuadrar (o preferiblemente el poder de 2.2) es el mismo proceso en realidad pero tiene en cuenta la gamma (¿más en línea con la forma en que REALMENTE vemos el color?)
Probablemente necesite agregar "más perceptualmente correcto" a su pregunta. :)
Entonces, con el caso de "más perceptualmente correcto" para trabajar con el poder de 2.2, ¿hay alguna evidencia de ello? ¿Como en cualquier lugar en línea que diga que es más preciso que solo promediar?

Probablemente te sirvan mejor los gráficos por computadora que el diseño gráfico, ya que es pan y mantequilla allí y demasiadas matemáticas aquí. Pero dado que ya estás aquí. En realidad, ambos razonamientos son aproximaciones cercanas.

Es cierto que la imagen no es lineal. Por lo tanto, no puede asumir que la suma de valores da como resultado su suma, por lo tanto, tampoco promediar. Si quiere estar en lo correcto, necesita hacer una conversión de perfil a perfil*. Técnicamente, probablemente asumiría que el perfil es sRGB, que de hecho está cerca de una corrección gamma de 2.2. donde la gamma se define como:

V fuera = V dentro Ɣ

Excepto que no es exactamente una gamma de 2,2 porque, de hecho, es lineal por debajo de los valores de 0,04045 (o por debajo de los valores enteros de 10 en canales de color de 8 bits). Luego, debido a que los planos de color son independientes, puede convertirlo primero en lineal y calcular y volver a convertirlo en no lineal.

* Sin embargo, depende de su definición de correcto, si es correcto y funciona en la vida real, entonces no, esto realmente no funciona. Dado que los valores de color utilizados por las computadoras no pueden capturar la luz natural. Necesitaría datos espectrales para hacer esto correctamente. Pero este es un agujero de rabino infinito. El color no es realmente tan fácil como la mayoría de nosotros pensamos, es más difícil de lo que pueden imaginar.

TL;DR Suficientemente bueno

El video de Minute Physics Computer Color is Broken es bueno para explicar el problema, pero tiene algunos (pequeños) problemas.

Señala que RGB opera en una versión comprimida de raíz cuadrada de la intensidad real:

+--------------+                      +-----+
| Linear Light |----> √r, √g, √b ---->| RGB |
+--------------+                      +-----+

Entonces, antes de intentar mezclar RGB, debe volver a convertirlo en "luz lineal" aplicando el inverso:

+--------------+                      +-----+
| Linear Light |<---- r², g², b² <----| RGB |
+--------------+                      +-----+

Pero Internet, y casi todos los dispositivos electrónicos y de consumo, han aceptado un estándar (llamado sRGB), donde aplican algo que no es exactamente una raíz cuadrada.

  • Lo que sabes como raíz cuadrada se puede expresar como: r 1/2
  • Lo que pide sRGB es cercano, pero sutilmente diferente: r 1/2.4

Entonces es algo que no es un cuadrado (y raíz cuadrada para deshacerlo).

La compansión sRGB también es no lineal

La fórmula utilizada por sRGB para convertir luz lineal en luz codificada sRGB no es lineal:

  • para R lineal > 0,0031308
    • R srgb = 1,055×R lineal 1/2,4 - 0,055
  • de lo contrario
    • R srgb = 12,92 × R lineal

En otras palabras, está muy cerca de simplemente hacer raíces cuadradas:

ingrese la descripción de la imagen aquí

Con el único problema de la sección lineal cuando llegas muy cerca de cero.

Matemáticas

Por lo general, necesita una función que aplique esta función de compresión-compresión sRGB de raíz casi cuadrada :

r = SrgbCompanding(Rlinear);
g = SrgbCompanding(Glinear);
b = SrgbCompanding(Blinear);

Antes de comenzar a promediar o mezclar colores en RGB, debe aplicar la inversa:

Rlinear = SrgbInverseCompanding(r);
Glinear = SrgbInverseCompanding(g);
Blinear = SrgbInverseCompanding(b);

Una vez que su R, G y B estén en luz lineal, puede promediarlos:

R3 = (SrgbInverseCompanding(r1) + SrgbInverseCompanding(r2)) / 2;
G3 = (SrgbInverseCompanding(g1) + SrgbInverseCompanding(g2)) / 2;
B3 = (SrgbInverseCompanding(b1) + SrgbInverseCompanding(b2)) / 2;

Y luego tienes que volver a aplicar el compansing sRGB:

R3 = SrgbCompanding(R3);
G3 = SrgbCompanding(G3);
B3 = SrgbCompanding(B3);