Tener 2 valores RGB:
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.
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.
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.
Entonces es algo que no es un cuadrado (y raíz cuadrada para deshacerlo).
La fórmula utilizada por sRGB para convertir luz lineal en luz codificada sRGB no es lineal:
En otras palabras, está muy cerca de simplemente hacer raíces cuadradas:
Con el único problema de la sección lineal cuando llegas muy cerca de cero.
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);
filipino
joojaa