Conversión de RGB a escala de grises / intensidad

Al convertir de RGB a escala de grises, se dice que deben aplicarse pesos específicos a los canales R, G y B. Estos pesos son: 0.2989, 0.5870, 0.1140.

Se dice que la razón de esto es diferente percepción / sensibilidad humana hacia estos tres colores. A veces también se dice que estos son los valores utilizados para calcular la señal NTSC.

Sin embargo, no encontré una buena referencia para esto en la web. ¿Cuál es la fuente de estos valores?

Ver también estas preguntas anteriores: aquí y aquí .

Los números específicos en la pregunta son de CCIR 601 (ver el enlace de Wikipedia a continuación).

Si convierte RGB -> escala de grises con números ligeramente diferentes / métodos diferentes, no verá mucha diferencia en una pantalla de computadora normal bajo condiciones normales de iluminación – pruébelo.

Aquí hay algunos enlaces más sobre el color en general:

Wikipedia Luma

El destacado sitio web de Bruce Lindbloom

el capítulo 4 sobre el color en el libro de Colin Ware, “Visualización de la información”, isbn 1-55860-819-2; este largo enlace a Ware en books.google.com puede funcionar o no

cambridgeincolor : tutoriales excelentes y bien escritos sobre cómo adquirir, interpretar y procesar fotografías digitales utilizando un enfoque orientado a la vista que enfatiza el concepto sobre el procedimiento.

Si se topa con RGB “lineal” frente a “RGB no lineal”, aquí hay una parte de una vieja nota para mí sobre esto. Repito, en la práctica no verás mucha diferencia.


RGB -> ^ gamma -> Y -> L *

En la ciencia del color, los valores RGB comunes, como en html rgb (10%, 20%, 30%), se denominan “no lineales” o corregidos con Gamma . Los valores “lineales” se definen como

Rlin = R^gamma, Glin = G^gamma, Blin = B^gamma 

donde gamma es 2.2 para muchas PC. Los RGB usuales a veces se escriben como R ‘G’ B ‘(R’ = Rlin ^ (1 / gamma)) (los puristas hacen clic en la lengua) pero aquí voy a soltar el ‘.

El brillo en una pantalla CRT es proporcional a RGBlin = RGB ^ gamma, por lo que el 50% de gris en un CRT es bastante oscuro: .5 ^ 2.2 = 22% del brillo máximo. (Las pantallas LCD son más complejas y, además, algunas tarjetas gráficas compensan la gamma).

Para obtener la medida de luminosidad llamada L* de RGB, primero divida RGB entre 255 y calcule

 Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma 

Este es Y en el espacio de color XYZ; es una medida de “luminancia” de color. (Las fórmulas reales no son exactamente x ^ gamma, pero se cierran, se adhieren a x ^ gamma para un primer pase).

Finalmente, L * = 116 * Y ^ 1/3 – 16 “… aspira a la uniformidad perceptiva … se corresponde estrechamente con la percepción humana de la ligereza”. – Espacio de color de Lab de Wikipedia

Encontré que esta publicación hace referencia en una respuesta a una pregunta similar anterior. Es de mucha ayuda:

http://cadik.posvete.cz/color_to_gray_evaluation/

¡Muestra “toneladas” de diferentes métodos para generar imágenes en escala de grises con diferentes resultados!

Aquí hay algún código en c para convertir rgb a escala de grises. La ponderación real utilizada para la conversión de rgb a escala de grises es 0.3R + 0.6G + 0.11B. estos pesos no son absolutamente críticos para que puedas jugar con ellos. Los hice 0.25R + 0.5G + 0.25B. Produce una imagen ligeramente más oscura.

NOTA: El siguiente código asume el formato de píxel xRGB de 32 bits

 unsigned int *pntrBWImage=(unsigned int*)..data pointer..; //assumes 4*width*height bytes with 32 bits ie 4 bytes per pixel unsigned int fourBytes; unsigned char r,g,b; for (int index=0;index>16); g=(fourBytes>>8); b=fourBytes; I_Out[index] = (r >>2)+ (g>>1) + (b>>2); //This runs in 0.00065s on my pc and produces slightly darker results //I_Out[index]=((unsigned int)(r+g+b))/3; //This runs in 0.0011s on my pc and produces a pure average } 

Consulte las preguntas frecuentes sobre el color para obtener información sobre esto. Estos valores provienen de la estandarización de los valores RGB que usamos en nuestras pantallas. De hecho, de acuerdo con las Preguntas frecuentes sobre el color, los valores que está utilizando están desactualizados, ya que son los valores utilizados para el estándar NTSC original y no para los monitores modernos.

Aquí hay un documento sobre cómo se derivaron estos números (o similares):

https://web.archive.org/web/20160303201512/http://www.cis.rit.edu/mcsl/research/broadbent/CIE1931_RGB.pdf

Estos valores varían de persona a persona, especialmente para las personas que son daltónicas.

es todo esto realmente necesario, la percepción humana y CRT vs LCD variará, pero la intensidad RGB no, ¿Por qué no L = (R + G + B)/3 y establece el nuevo RGB a L, L, L?