Conversión de RGB a escala de grises/intensidad


Al convertir de RGB a escala de grises, se dice que se deben aplicar 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 estos cuestiones previas: aquí y aquí.

Author: Community, 2009-03-26

7 answers

Los números específicos en la pregunta son del CCIR 601 (ver el enlace de Wikipedia más abajo).

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

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

Wikipedia Luma

Bruce Lindbloom ' s sitio web excepcional

Capítulo 4 sobre el Color en el libro de Colin Ware," Information Visualization", isbn 1-55860-819-2; este largo enlace a Ware en books.google.com puede o no puede funcionar

Cambridgeincolor : excelente, bien escrito "tutoriales sobre cómo adquirir, interpretar y procesar fotografías digitales usando un enfoque orientado visualmente que enfatiza el concepto sobre el procedimiento "

Si se encuentra con RGB" lineal "vs" no lineal", aquí hay 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 llaman "no lineales" o Corrección gamma . Los valores "lineales" se definen como

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

Donde gamma es 2.2 para muchos PC. Los R G B habituales a veces se escriben como R ' G ' B '(R' = Rlin ^ (1 / gamma)) (puristas lengua-clic) pero aquí voy a soltar el'.

El brillo en una pantalla CRT es proporcional a RGBlin = RGB ^ gamma, así 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; además, algunas tarjetas gráficas compensan la gamma.)

Para obtener la medida de luminosidad llamada L* desde RGB, primero divida R G B por 255, y calcule

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

Esto 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 cerca; sigue con x^gamma para una primera pasada.)

Finalmente, L * = 116 * Y ^ 1/3 - 16 "... aspira a la uniformidad perceptual ... coincide estrechamente con la percepción humana de la ligereza." -- Wikipedia Lab color space

 69
Author: denis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-14 10:49:40

Encontré que esta publicación hacía referencia en una respuesta a una pregunta anterior similar. Es muy útil:

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!

 10
Author: ypnos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-13 06:41:59

Aquí hay un 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.3 R + 0.6 G + 0.11 B. estos pesos no son absolutamente críticos para que pueda jugar con ellos. Los he hecho 0.25 R + 0.5 G + 0.25 B. 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 i.e. 4 bytes per pixel
unsigned int fourBytes;
        unsigned char r,g,b;
        for (int index=0;index<width*height;index++)
        {
            fourBytes=pntrBWImage[index];//caches 4 bytes at a time
            r=(fourBytes>>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
        }
 9
Author: twerdster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-30 00:18:18

Echa un vistazo a la Color FAQ para obtener información sobre esto. Estos valores provienen de la estandarización de los valores RGB que utilizamos en nuestras pantallas. En realidad, de acuerdo con las preguntas frecuentes de 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.

 6
Author: Brian Campbell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-26 19:51:20

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

 6
Author: rmmh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-10 23:38:26

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

 -1
Author: Bob Pickle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-18 01:04:03

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

 -2
Author: user1668969,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-13 13:45:05