2011-03-15 13 views
20

Mi pregunta original¿Por qué la escala de grises funciona de la manera que lo hace?

leí que para convertir un pixel RGB a RGB en escala de grises, se debe utilizar

r_new = g_new = b_new = r_old * 0.3 + g_old * 0.59 + b_old * 0.11 

También leo y entiendo, que g tiene una ponderación más alta debido a que el ojo humano es más sensible al verde Al implementar eso, vi que los resultados eran los mismos que obtendría al configurar una imagen en 'escala de grises' en un editor de imágenes como el Gimp.

Antes de leer esto, imaginé que para convertir un píxel a escala de grises, uno lo convertiría en HSL o HSV, luego establecería la saturación en cero (por lo tanto, eliminaría todo el color). Sin embargo, cuando hice esto, obtuve una salida de imagen bastante diferente, aunque también carecía de color.

¿Cómo se diferencia exactamente s = 0 de la forma "correcta" que leo, y por qué es "incorrecto"?

hallazgos en curso sobre la base de respuestas y otras investigaciones

Parece que el que luminancia coeficientes a utilizar es el tema de debate. Varias combinaciones y algoritmos de escala de grises tienen resultados diferentes. Los siguientes son algunos presets usados ​​en áreas como los estándares de televisión:

  • los coeficientes definidos por el UIT-R BT.601 (? NTSC) se 0.299r + 0.587g + 0.114b
  • los coeficientes definidos por el UIT-R BT.709 (más reciente) son 0.2126r + 0.7152g + 0.0722b
  • los coeficientes de tres partes iguales, (1/3)(rgb), es equivalente a s = 0

Este scientific article detalles en escala de grises diferentes técnicas y sus resultados para varias imágenes, además de una vigilancia subjetiva ey de 119 personas.

Sin embargo, al convertir una imagen a escala de grises, para lograr el "mejor" efecto artístico, casi seguro no se usarán estos coeficientes predefinidos, sino que se ajustará la contribución de cada canal para producir la mejor salida para la imagen particular.

+3

+1 pregunta interesante – alex

+0

Esto no es realmente una pregunta de programación, pero no estoy seguro de a qué sitio pertenece ... Realmente es una pregunta artística o científica. – derobert

+3

Eso puede ser cierto, pero estoy haciendo esta pregunta en el contexto de escribir una función que realiza la conversión de escala de grises. –

Respuesta

10

Aunque estos coeficientes de transformación existen, nada lo obliga a usarlos. Siempre que la intensidad total de cada píxel no cambie, las contribuciones de cada canal pueden ser cualquier cosa, desde 0 a 100%.

Fotógrafos que convierten imágenes a escala de grises utilizan mezcladores de canales para ajustar los niveles de cada canal (RGB o CMYK). En su imagen, hay muchos rojos y verdes, por lo que podría ser conveniente (según su intención) tener esos canales más representados en la intensidad del nivel de gris que en el azul.

Esto es lo que distingue la transformación "científica" de la imagen de una combinación "artística" de las bandas.

Una consideración adicional es el rango dinámico de valores en cada banda, y el intento de conservarlos en la imagen en escala de grises. Aumentar las sombras y/o los reflejos puede requerir aumentar la contribución de la banda azul, por ejemplo.

3

Parece que estos coeficientes provienen de la tecnología CRT de edad y no se adaptan bien a los monitores de hoy en día, desde el Color FAQ:

Los coeficientes de 0,299, 0,587 y 0,114 luminancia adecuadamente calculada para monitores tener fósforos que eran contemporánea en la introducción de la televisión NTSC en 1953. son siendo apropiado para el cálculo de vídeo luma que trataremos más adelante en la sección 11. sin embargo, estos coeficientes no calculan con precisión luminancia para contem monitores de porary.

No se pudo encontrar el coeficiente de conversión correcto, sin embargo.

Ver también RGB to monochrome conversion

4

Un interesante artículo sobre el tema aquí ...."porque los ojos humanos no detectan el brillo linealmente con el color".

http://www.scantips.com/lumin.html

+0

OK, para responder específicamente a la pregunta que se hizo, está mal porque: la luminancia entre grises en la versión s = 0 no coincide con la luminancia entre los colores en la imagen original. Esto se manifiesta visiblemente a través de los tallos (el estambre, si recuerdo el 3er grado) en el centro de la flor no se distinguen en la versión s = 0. – JNadal

+0

Aquí está la derivación original de sus coeficientes dados: http://www.cis.rit.edu/mcsl/research/broadbent/CIE1931_RGB.pdf – JNadal

+0

Otro gran artículo que explota el método s = 0, tratando de hacer una imagen que se lava completamente cuando se convierte a escala de grises: http://www.realtimerendering.com/blog/constant-luma-palette/ – JNadal

3

Usando s = 0 en HSL/HSV y convirtiendo a los resultados de RGB en R = G = B, por lo que es lo mismo que hacer r_old * 1/3 + g_old * 1/3 + b_old * 1/3.

Para comprender por qué, eche un vistazo a Wikipedia page que describe la conversión HSV-> RGB. La saturación s será 0, por lo que C y X también lo estarán. Usted terminará con R_1,G_1,B_1 siendo (0,0,0) y luego agregue m a los valores RGB finales que resultan en (m,m,m) = . Lo mismo para HSL, el resultado será (m,m,m) = (L,L,L).

EDITAR: OK, acaba de descifrar lo anterior no es la respuesta completa, aunque es un buen punto de partida. Los valores RGB serán los mismos, ya sea L o V, pero aún depende de cómo se calcularon originalmente L y V, de nuevo, consulte Wikipedia. Parece que el programa/las fórmulas que ha usado para la conversión usaron la solución 1/3 * R + 1/3 * G + 1/3 * B o una de las otras dos (hexcone/bi-hexcone).

Así que, después de todo, usar HSL/HSV solo significa que tendrá que decidir qué fórmula utilizar antes y la conversión a valores de escala de grises RGB más tarde es solo aislar el último componente.

Cuestiones relacionadas