Fórmula para determinar el brillo percibido del color RGB

Resuelto robmerica asked hace 15 años • 22 respuestas

Estoy buscando algún tipo de fórmula o algoritmo para determinar el brillo de un color dados los valores RGB. Sé que no puede ser tan simple como sumar los valores RGB y hacer que las sumas más altas sean más brillantes, pero no sé por dónde empezar.

robmerica avatar Feb 28 '09 02:02 robmerica
Aceptado

El método puede variar según sus necesidades. Aquí hay 3 formas de calcular la luminancia:

  • Luminancia (estándar para ciertos espacios de color): (0.2126*R + 0.7152*G + 0.0722*B) fuente imagen

  • Luminancia (opción percibida 1): (0.299*R + 0.587*G + 0.114*B) fuente imagen

  • Luminancia (opción percibida 2, más lenta de calcular): sqrt( 0.241*R^2 + 0.691*G^2 + 0.068*B^2 )sqrt( 0.299*R^2 + 0.587*G^2 + 0.114*B^2 )(gracias a @MatthewHerbst ) fuente imagen

[Editar: se agregaron ejemplos usando colores CSS con nombre ordenados con cada método.]

Anonymous avatar Feb 27 '2009 19:02 Anonymous

Creo que lo que estás buscando es la fórmula de conversión RGB -> Luma .

Fotométrico/digital UIT BT.709 :

Y = 0.2126 R + 0.7152 G + 0.0722 B

Digital ITU BT.601 (da más peso a los componentes R y B):

Y = 0.299 R + 0.587 G + 0.114 B

Si está dispuesto a cambiar precisión por rendimiento, existen dos fórmulas de aproximación para esta:

Y = 0.33 R + 0.5 G + 0.16 B

Y = 0.375 R + 0.5 G + 0.125 B

Estos se pueden calcular rápidamente como

Y = (R+R+B+G+G+G)/6

Y = (R+R+R+B+G+G+G+G)>>3
Franci Penov avatar Feb 27 '2009 19:02 Franci Penov

La respuesta "aceptada" es incorrecta e incompleta

Las únicas respuestas que son precisas son las respuestas de @jive-dadson y @EddingtonsMonkey , y en apoyo @nils-pipenbrinck . Las otras respuestas (incluidas las aceptadas) vinculan o citan fuentes incorrectas, irrelevantes, obsoletas o rotas.

Brevemente:

  • sRGB debe ser LINEARIZADO antes de aplicar los coeficientes.
  • La luminancia (L o Y) es lineal al igual que la luz.
  • La luminosidad percibida (L*) no es lineal al igual que la percepción humana.
  • HSV y HSL no son ni remotamente precisos en términos de percepción.
  • El estándar IEC para sRGB especifica un umbral de 0,04045, NO es 0,03928 (que proviene de un borrador inicial obsoleto).
  • Para ser útiles (es decir, en relación con la percepción) , las distancias euclidianas requieren un espacio vectorial cartesiano perceptualmente uniforme como CIELAB. sRGB no es uno.

Lo que sigue es una respuesta correcta y completa:

Debido a que este hilo aparece mucho en los motores de búsqueda, agrego esta respuesta para aclarar los diversos conceptos erróneos sobre el tema.

La luminancia es una medida lineal de luz, ponderada espectralmente para la visión normal pero no ajustada para la percepción no lineal de la luminosidad. Puede ser una medida relativa, Y como en CIEXYZ, o como L , una medida absoluta en cd/m 2 (no confundir con L*) .

Algunos modelos de visión como CIELAB utilizan la luminosidad percibidaL* , aquí (Lstar) es un valor de luminosidad perceptiva y no es lineal para aproximarse a la curva de respuesta no lineal de la visión humana. (Es decir, lineal a la percepción pero, por tanto, no lineal a la luz).

El brillo es un atributo perceptivo, no tiene una medida "física". Sin embargo, algunos modelos de apariencia de color tienen un valor , normalmente denominado "Q", para el brillo percibido, que es diferente a la luminosidad percibida.

Luma ( prime) es una señal ponderada codificada con gamma utilizada en algunas codificaciones de vídeo (Y´I´Q´). No debe confundirse con la luminancia lineal.

Gamma o curva de transferencia (TRC) es una curva que a menudo es similar a la curva de percepción y se aplica comúnmente a datos de imágenes para almacenamiento o transmisión para reducir el ruido percibido y/o mejorar la utilización de los datos (y razones relacionadas).

Para determinar la luminosidad percibida , primero convierta los valores de imagen R´G´B´ codificados con gamma a luminancia lineal ( Lo Y) y luego a luminosidad percibida no lineal ( L*)


PARA ENCONTRAR LA LUMINANCIA:

...Porque aparentemente se perdió en alguna parte...

Paso uno:

Convierta todos los valores enteros sRGB de 8 bits a decimal 0,0-1,0

  vR = sR / 255;
  vG = sG / 255;
  vB = sB / 255;

Segundo paso:

Convierta un RGB codificado con gamma en un valor lineal. sRGB (estándar de computadora), por ejemplo, requiere una curva de potencia de aproximadamente V^2.2, aunque la transformación "precisa" es:

sRGB a lineal

Donde V´ es el canal R, G o B codificado con gamma de sRGB.
Pseudocódigo:

function sRGBtoLin(colorChannel) {
        // Send this function a decimal sRGB gamma encoded color value
        // between 0.0 and 1.0, and it returns a linearized value.

    if ( colorChannel <= 0.04045 ) {
            return colorChannel / 12.92;
        } else {
            return pow((( colorChannel + 0.055)/1.055),2.4);
        }
    }

Paso tres:

Para encontrar Luminancia (Y), aplique los coeficientes estándar para sRGB:

Aplicar coeficientes Y = R * 0,2126 + G * 0,7152 + B * 0,0722

Pseudocódigo usando las funciones anteriores:

Y = (0.2126 * sRGBtoLin(vR) + 0.7152 * sRGBtoLin(vG) + 0.0722 * sRGBtoLin(vB))

PARA ENCONTRAR LA LIGEREZA PERCIBIDA:

Paso cuatro:

Tome la luminancia Y desde arriba y transfórmela a L*

L* de la ecuación Y

Pseudocódigo:

function YtoLstar(Y) {
        // Send this function a luminance value between 0.0 and 1.0,
        // and it returns L* which is "perceptual lightness"

    if ( Y <= (216/24389)) {       // The CIE standard states 0.008856 but 216/24389 is the intent for 0.008856451679036
            return Y * (24389/27);  // The CIE standard states 903.3, but 24389/27 is the intent, making 903.296296296296296
        } else {
            return pow(Y,(1/3)) * 116 - 16;
        }
    }

L* es un valor de 0 (negro) a 100 (blanco), donde 50 es el "gris medio" perceptivo. L* = 50 es el equivalente a Y = 18,4, es decir, una tarjeta gris del 18%, que representa la mitad de una exposición fotográfica (zona V de Ansel Adams).


Edición 2023:

Agrega Myndex en un esfuerzo por completar:

Algunas de las otras respuestas en esta página muestran las matemáticas para Luma ( en otras palabras, Y prime ) y luma nunca debe confundirse con la luminancia relativa ( Y ). Y ni la luminosidad ni el brillo son perceptivamente uniformes.

  • Luma , si bien está comprimido con gamma y puede ser útil para codificar datos de imágenes para su posterior decodificación, no es perceptualmente uniforme, especialmente para colores más saturados. Como tal, Luma generalmente no es una buena métrica para la ligereza percibida.
  • La luminancia es lineal por luz, pero no lineal por percepción; en otras palabras, no es perceptualmente uniforme y, por lo tanto, no es útil para predecir la percepción de luminosidad.
  • LstarL* en mi respuesta anterior se usa a menudo para predecir la ligereza percibida. Se basa en Munsell Value, que se deriva de experimentos en un entorno específicamente definido utilizando grandes muestras de color difuso.
    • L*no es particularmente sensible al contexto, es decir, no es sensible a cosas como el contraste simultáneo, HK u otras sensaciones contextuales.
    • Por lo tanto, L*sólo puede llevarnos a una parte del camino hacia un modelo preciso de ligereza percibida.
    • L*junto con CIELAB es bueno para determinar "pequeñas diferencias" entre dos elementos, es decir, cercanas a la "Diferencia apenas notable" (umbral JND).
      • L*se vuelve menos preciso en niveles superiores al umbral más grandes y en grandes diferencias, donde otros factores contextuales comienzan a tener un efecto más sustancial.
      • Las formas de la curva supraumbral son diferentes a las de la curva de umbral JND.
    • L*sitúa el gris medio perceptual en un 18%.
      • El gris medio percibido real depende del contexto.
      • El contraste medio para estímulos de alta frecuencia espacial (como el texto) suele ser mucho mayor que el 18%.
      • La percepción del contraste es más complicada que la diferencia entre dos valores de luminosidad, y las diferencias o proporciones simples tienen una utilidad limitada y no son uniformes en todo el rango visual.

Referencias:

IEC 61966-2-1:1999 Standard
Wikipedia sRGB
Wikipedia CIELAB
Wikipedia CIEXYZ
Preguntas frecuentes sobre la gamma de Charles Poynton

Myndex avatar Jun 20 '2019 03:06 Myndex

He hecho una comparación de los tres algoritmos en la respuesta aceptada. Generé colores en ciclo donde solo se usó aproximadamente cada 400 colores. Cada color está representado por 2x2 píxeles, los colores están ordenados del más oscuro al más claro (de izquierda a derecha, de arriba a abajo).

1.ª imagen: Luminancia (relativa)

0.2126 * R + 0.7152 * G + 0.0722 * B

Segunda imagen: http://www.w3.org/TR/AERT#color-contrast

0.299 * R + 0.587 * G + 0.114 * B

3.ª imagen: modelo de color HSP

sqrt(0.299 * R^2 + 0.587 * G^2 + 0.114 * B^2)

4th picture - WCAG 2.0 SC 1.4.3 relative luminance and contrast ratio formula (see @Synchro's answer here)

Pattern can be sometimes spotted on 1st and 2nd picture depending on the number of colors in one row. I never spotted any pattern on picture from 3rd or 4th algorithm.

If i had to choose i would go with algorithm number 3 since its much easier to implement and its about 33% faster than the 4th.

Comparación del algoritmo de brillo percibido

Petr Hurtak avatar Jun 13 '2014 20:06 Petr Hurtak