¿Cómo puedo detectar si un color es gris?

Estoy tratando de detectar programáticamente si un color es "gris" o no.

La mejor medida de "grises" que pude encontrar fue la saturación. El problema con el que me encuentro es que los diferentes tonos se ven más o menos grises dependiendo de su tono y luminosidad. En la imagen de abajo, uno se ve claramente gris y el otro rojo/marrón, aunque ambos tienen la misma saturación y luminosidad.

¿Existe un espacio de color que represente con mayor precisión el "gris" de un color?

¿Existe un término oficial para el concepto de "grisidad"?

dos tonos grises

No puede, porque 'gris' no es una medida cuantificable. Lo que considero gris puede no ser lo que tú consideras gris, y lo que considero gris de forma aislada puede no ser lo que considero gris en contexto. Teniendo en cuenta los dos cuadros que incluye, diría que el de la derecha es gris y el de la izquierda no. Tómelos individualmente y probablemente diría que el izquierdo es un marrón beigish y el derecho un verde azulado pardusco, ninguno es gris. Ponga cualquiera en una imagen moteada brillante y probablemente los llamaría grises a ambos. ¿Cómo determinarías programáticamente eso?
La respuesta a esta pregunta depende en gran medida de cómo defina el color y qué tan exactamente defina el gris. Tal vez podría analizar los datos sin procesar de la encuesta de color xkcd.
Observe cómo los dos colores parecen menos grises si agrega un gris neutro entre ellos .
También me pregunto sobre un efecto lingüístico/cultural: "blue-grey" es un término común en inglés (que podría aplicarse a la muestra de la derecha). La descripción común más cercana para la muestra de la izquierda sería " plato rojo gris". "Rojizo" modifica "gris", mientras que "azul-gris" es un adjetivo de un solo color. La lingüística cultural de la percepción del color es uno de los muchos factores interesantes. H=120° manteniendo los demás igual me parece gris verdoso o incluso verde grisáceo; "verde-gris" tampoco es común (aunque "gris-verde" es más común, por lo que quizás tengamos que agradecer a Kipling)
@ChrisH Esto lo han sabido los vendedores de papel a lo largo de los siglos. Las culturas en latitudes más altas piensan que los colores azulados son más neutrales. Mientras que los países más cercanos al ecuador están predispuestos entre el amarillo y el rojo. Esto se debe en parte a que el cielo y el suelo afectan nuestro balance de blancos y en parte a factores culturales.

Respuestas (5)

Con todo el crédito a @Wolff por estas imágenes. Como se discutió, el gris es 100% relativo a la iluminación, los colores circundantes, la percepción y el método que está midiendo. Tome estas imágenes por ejemplo. La imagen principal en realidad no tiene "rojo" en absoluto. Si toma un cuentagotas y mide cualquier área que se vea roja, en realidad todas son tonos de gris.

No rojo, imágenes rojas

si tomas un trozo del ala del loro y lo sacas de contexto, se ve como marrones y grises.

Recorte de ala de loro

Si vuelve a colocar exactamente el mismo recorte sobre el loro, se verá rojo nuevamente en contexto con el azul/verde.

Conjunto

Pero dicho esto, LCH o LAB serían su mejor opción para medir el gris neutro.

Recomendación de @Luciano de este artículo: Teoría del color: ¿Existe una medida del "colorismo"? Tiene buena información para lo que estás tratando de hacer.

Sí, es fascinante cómo el cerebro humano procesa el color. Aquí hay otro ejemplo: ambos ojos son del mismo tono de gris 7f7f7f
El infame vestido también es un ejemplo bastante sorprendente en el que diferentes personas ven exactamente los mismos píxeles como colores que no tienen nada que ver, porque interpretan las señales de iluminación ambiguas de manera diferente.
"Aquí no hay rojo". ¿¡Por qué, oh, por qué no te creo!?
El juego móvil I Love Hue (y presumiblemente su secuela, aunque todavía estoy trabajando en la primera edición) hace un gran uso de este fenómeno. La premisa es simple: organice un conjunto de mosaicos de colores en un degradado suave, con cada mosaico adyacente a sus vecinos más cercanos. Pero hasta ahora he pasado... 72 horas, dice mi teléfono, haciendo exactamente eso, en parte debido a lo maravillosamente frustrante que puede ser cuando un mosaico despejado en todos los ámbitos, que POSIBLEMENTE no puede ser el adecuado, parece cambiar mágicamente de color cuando lo mueves.
Te prometo que no hay. Ábralo en Photoshop y seleccione cualquier píxel, no hay tonos "rojos" en la imagen.
@Alith7, tuve que cambiar las imágenes por problemas de licencia. Fui descuidado con el primero. Lo siento. 😀
Ups... no es un problema en absoluto! eran tus imágenes en primer lugar. ;)
@Alith7, son solo imágenes de la red. Ahora todos son de dominio público.

RGB o, en realidad, la saturación en sus equivalentes de coordenadas polares es altamente no lineal cuando uno intenta usarlo como una medida de "qué tan cerca del gris parece ser este color RGB cuando se ve en la pantalla". visión de color, es puramente para controlar la electrónica de la pantalla. Te has golpeado la cabeza ante ese hecho.

En su lugar, debe convertir sus valores RGB al sistema LCH y extraer C (= croma) o al sistema CIELAB (= Lab en Photoshop) y calcular sqrt (a ^ 2 + b ^ 2). Esos sistemas están desarrollados para ser más lineales en la predicción de lo que se ve. Para gris C=0 y a=b=0. Por supuesto, esto es una mentira si la pantalla no está calibrada en color.

AGREGAR comentarios debidos: es muy probable que el interrogador crea que su programa no se deja engañar por nada más de lo que ha visto, puede concentrarse en una sola combinación RGB a la vez. Supongo que la persona que pregunta espera algo que pueda ayudar a su programa a tomar la misma decisión que tomaría un colorímetro perfecto cuando lee el mismo RGB emitido por una pantalla sRGB impecable sin luces adicionales molestas.

También existen otros problemas asociados con la visión humana, como el balance de blancos del ojo humano. Tengo un carrete de impresora 3d de color "gris" reciclado. Pero juro que es verde en mi taller ya que mis neutrales son tan prominentemente neutrales. Pero si lo llevo al taller de madera que es mucho más cálido, realmente se ve gris. Demonios, incluso a veces en mi taller es gris. Entonces, de hecho, qué es gfray es una especie de pregunta limitada.
@Wolff y algunos de nosotros tuvimos una gran conversación sobre cómo producir una imagen roja que en realidad NO tiene rojo en el chat la semana pasada.

Estoy de acuerdo con la percepción del color ya mencionada. Hay grises cálidos y grises fríos, pero el más gris de todos sería un gris neutro.

Mirando los valores RGB, si los 3 números son iguales, eso es gris neutro, como R109 G109 B109 o R228 G228 B228. Si un número es ligeramente diferente, el tono del gris será frío o cálido.

Mirando los valores de HSB, me parece que no importa cuál sea el HUE, siempre que la saturación sea 0, será 100% gris. Si aumenta la SATURACIÓN en cualquier porcentaje, obtendrá un tono de cualquiera que sea el TONO.

Entonces, como diseñador gráfico, diría que cualquier valor de SATURACIÓN inferior al 4% se consideraría gris, pero podría ser un gris frío o un gris cálido según el valor HUE (incluso si es 0).

El programador aún tiene que tomar la decisión final sobre lo que se considera gris, a menos que solo desee que detecte el 100% de gris, entonces es fácil.

Este fue mi pensamiento inicial también. ¿Pero no es la "similitud de los valores RGB" solo otra palabra para "saturación"? El OP muestra un ejemplo de dos colores con la misma saturación que creen que no se ven grises de manera similar. Eso aumenta la complejidad de la pregunta.
La saturación es la intensidad de un color (no el brillo, no el matiz). El OP muestra dos colores con la misma saturación del 12%, pero tonalidades diferentes, por eso se ven diferentes. A medida que disminuye la saturación, más similares se verán esas dos cajas entre sí.
Creo que tiene toda la razón: una saturación del 12% es demasiado, pero al 4% podría estar mucho más seguro.
"El programador todavía tiene que tomar la decisión final sobre lo que se considera gris", ¿no es eso solo una parte del problema? Ese límite no solo será diferente para cada programador sino también para diferentes monitores , y en el caso de las pantallas con control de color, ¡también depende del software!

HSL es el mejor espacio de color para representar el gris.

El gris se puede ver como una distancia S (saturación), que es 0,0 si es gris puro y 1,0 si es lo más alejado del gris.

Medida y percepción

En las dos muestras proporcionadas, medí (con el cuentagotas de Photoshop): 0 10 % 49 % y 216 12 % 51 %, lo que difiere un poco de lo que afirmaste, tal vez debido a que se eliminó un perfil de color en el proceso de publicación.

Con un Eizo CG303w calibrado (120cd/m2 5000k 2.2), tengo la sensación de que el de la izquierda tiende al rojo y el de la derecha al azul. Bajé la saturación hasta que tuve la sensación de que ambos estaban grises, llegué al 4% y al 5% de saturación en el espacio HSL.

Mis 5000k para el punto blanco son un poco cálidos, y veo el parche marrón más coloreado que el azul. Probablemente sería mejor un punto blanco en 5500k-6500k y también deberíamos asegurarnos de que la luz ambiental (idealmente una luz calibrada como Just) y el color de la pared (¿blanco, blanco sucio?) estén en el rango de gris aceptable.

Discusión

En RGB, un color es gris cuando R=G=B, pero el operador necesita evaluar varios números para responder a "es gris". Es más difícil darnos una distancia de R=G=B simplemente mirando los números.

El espacio de color HSL es más directo ya que S (saturación, en el rango [0,1]) da inmediatamente la respuesta: 0 es gris o se elige un valor por debajo de un umbral para que sea gris.

R' = R/max // normalization from [0-max] to [0.0-1.0]
G' = G/max // where max is 255 if the colors are 8 bits per channel
B' = B/max
Cmax = max(R', G', B') // find the maximum among R,G,B
Cmin = min(R', G', B') // find the minimum among R,G,B
Δ = Cmax - Cmin // gives the maximum difference

Y sin embargo, L y S vienen dados por:

L = (Cmax + Cmin) / 2
S = Δ/(1-|2L-1|)

Por lo tanto, puede crear un filtro indicador que se mostrará, por ejemplo, en verde puro cuando los píxeles sean grises puros o lo suficientemente grises; o que mostrará en falsos colores todos los píxeles bastante grises, y desestaturará el resto. La implementación dependerá de su software y lenguaje; puede crear un filtro de Matlab para Photoshop, por ejemplo, que lo haga, o incluso un complemento autónomo.

Referencias

  1. RapidTables RGB a HSL
  2. PhotoshopMatlab
¡Hola y bienvenidos a GDSE!. ¡Buena respuesta! Probablemente lo más cerca que estemos. Lo interesante de la pregunta es que el OP ya comparó dos colores por su saturación y descubrió que incluso si tienen la misma saturación (= "gris"), uno de ellos todavía se ve más gris que el otro en sus ojos.
Bueno, en realidad no existe el gris, por lo que no se puede medir de manera eficiente. A menos que hagas una definición poco natural de gris.
@joojaa Definí el gris de manera objetiva en la segunda oración.
@Soleil-MathieuPrévot no, no lo hiciste. Definiste algo que el OP definió como que no funciona. Quiero decir, ingenuamente, tienes razón, excepto que la definición de HCL en otra parte es mejor porque al menos está científicamente más motivada. Pero el gran problema con eso es que no tiene en cuenta todos los efectos. ok, probablemente no puedas. De todos modos, incluso si prescindimos de las coordenadas del dispositivo frente a las coordenadas absolutas, la definición de luminosidad y gris tiene un problema al decir cuándo un chip deja de ser gris ...

Como nota en las respuestas, obtiene resultados muy diferentes según sus definiciones, algunas de las cuales se contradicen entre sí. Ninguna de las respuestas es incorrecta por ver. Simplemente dependen de diferentes definiciones de color y gris.

Ahora, dado que no sabemos nada sobre su problema subyacente, es difícil decirlo. Desde la perspectiva de la ciencia del color, realmente no hay una respuesta satisfactoria a la pregunta de cuánto gris hay en una imagen.

Ciertamente, la ciencia del color dice que todo ese procesamiento debe realizarse en un espacio de color absoluto, preferiblemente algún derivado de CIE Lab, posiblemente polar como Lch. Aunque esto deja mucho que desear, ya que no hay garantía de que un Lhc polar sea ni remotamente uniforme en la forma necesaria. En general, la ciencia del color evita hacer este tipo de ponderación al evitar la interpolación del color.

De todos modos, probablemente sería más preciso calcular ΔE entre un color neutro con el mismo valor de luminosidad. Esto probablemente tendría el mejor mérito científico en cuanto a cómo funcionan los sentidos humanos, ya que está tratando de resolver un problema lo suficientemente similar para que el número tenga un significado más comprensible.

Pero también puede estar haciendo algún tipo de medición de color a partir de una imagen, entonces el Lch sería bueno nuevamente al igual que HSL, depende un poco de cómo suponga que es el sensor de la cámara. Entonces, si desea emular un colorímetro, esto ciertamente tiene algún valor.

Pero realmente, si desea un mejor alcance de cuándo algo es gris o si necesita investigar qué consideran los humanos como gris, puede intentar ajustar los datos a la descripción humana, el XKCD colorvsurvey tiene algunos buenos puntos de datos para investigar más a fondo. Lo bueno de esta base de datos es que no tiene corrección de color. Lo que significa que si su aplicación es web, puede obtener el error del monitor promedio no calibrado del agregado estadístico. Pero malo para la ciencia del color.

Y así sucesivamente... Puedes cavar tan profundo como quieras.

la pregunta es lo suficientemente vaga como para que realmente no podamos responderla sin definir las cosas para usted.

Sí, realmente no sabía qué tan profundo era este agujero de conejo antes de hacer la pregunta. Mi caso de uso es un poco específico, estoy tratando de extraer "esquemas de color" de los sitios web para aprender más sobre la efectividad de los sistemas de diseño. La forma en que lo resolví ahora es mirar el contexto de cada otro color usado en la página, ver si es una página "cálida o fría", ver si se usan múltiples tonos de grises y extraerlo de allí.