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"?
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.
si tomas un trozo del ala del loro y lo sacas de contexto, se ve como marrones y grises.
Si vuelve a colocar exactamente el mismo recorte sobre el loro, se verá rojo nuevamente en contexto con el azul/verde.
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.
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.
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.
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
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.
Luciano
Janus Bahs Jacquet
joojaa
lobo
chris h
joojaa