2011-06-19 14 views
6

Tengo un conjunto de imágenes del cielo, algunas con nubes y otras sin ellas.¿Cómo puedo saber si un color RGB es básicamente AZUL? en C#

Algunos son cielos azules, algunos parcialmente nublados, otros con nubes blancas y grises.

¿Cómo puedo determinar que un determinado valor RGB es, más o menos, azul?

Cualquier tono de azul es 'azul' - azul claro, azul oscuro, azul marino, azul cielo - estos son todos azules.

Quiero reducir los colores en la imagen a 16. Entonces quiero hacer un histograma de Blanco, Plata, Gris, Azul y 'todo lo demás'.

¿Cómo sé por el valor RGB qué es un azul o un plateado, un blanco o un gris, o algo más?

+4

Comparar los colores en C# es fácil. Determinar "lo que es básicamente azul" es la parte difícil. – Jim

Respuesta

0

Quizás construya una tabla con los valores RGB para cada uno de los 16 colores que desee, luego compare cada valor RGB de píxeles con cada uno de los valores en su tabla. Para comparar, realice una resta como R1-R2 G1-G2 B1-B2, luego resuma las diferencias y conviértalas al color que sea menos diferente.

pregunta relacionada: Compare RGB colors in c#

+0

Aparentemente hay algún tipo de forma estándar de comparar colores, se llama Delta E mira esta pregunta http://stackoverflow.com/questions/3968179/compare-rgb-colors-in-c – zad

+0

Gracias, echaré un vistazo al Delta E y mira lo que encuentro - aplausos – Chris

2

Si los valores de rojo y verde están cerca de la misma, y ​​si el valor de azul es mayor que los valores de rojo y verde, el color va a estar en el rango azul. Si los tres valores son aproximadamente iguales, tiene alguna versión de gris, y si están todos cerca de su máximo, el color se verá blanco. Es imposible ser mucho más preciso que eso; tendrás que mirar un selector de color y descubrir qué región te parece "azul".

+0

Gracias - He estado mirando las imágenes y ahora puedo ver la tendencia de la que hablas. Agradezco el tiempo que demoró en responderme. vivas – Chris

+0

"Imposible"? Use un espacio de color diferente, es decir, use el Tono del color en lugar de RGB. Lejos de imposible –

+0

@Ed S.: Ver el tono ciertamente facilita las cosas, y es una buena sugerencia para el OP (+1 para eso), pero ¿qué rango para hue representa "básicamente azul" para el OP? Dije que era "imposible ser más preciso" simplemente porque la pregunta no es más precisa. Noto que la respuesta que me diste realmente no se acerca más a resolver la pregunta que yo. Específicamente, el OP busca discernir "azul" de "blanco", "plateado" y "gris", por lo que la saturación y el valor entran en juego. Ya sea que elija RGB o HSV, todavía está mirando los tres componentes. – Caleb

13

RGB no es el mejor espacio de color para trabajar en este tipo de cosas. Un espacio de color como HSV (also known as HSB) proporciona un modelo más intuitivo y descriptivo para un color determinado.

Así que, para obtener lo que buscas, puedes usar el tono de un color dado. Si se trata de una estructura System.Drawing.Color, puede usar el método GetHue() que devuelve un valor de matiz en grados. Dada una rueda de tonos como la siguiente, puede definir un umbral superior e inferior (en grados) para los valores azules que aceptará.

Hue Wheel

procesamiento de imágenes y la teoría del color, en general, están lejos de materias triviales. Sugeriría que encuentre el método más simple que cumpla con sus requisitos. Esto puede ser suficiente para ti, o tal vez no. Si no, entonces quizás puedas reducir la pregunta un poco para mí.

También tenga en cuenta que aún necesitará un umbral para los componentes de Brillo y Saturación para asegurarse de que no se trata realmente de negro, blanco o gris.

+0

Tengo una copia de Photoshop y obtengo diferentes valores del cuadro de diálogo de selección de color de photoshop HSB en comparación con C# Color.GetBrightness() y Color.GetSaturation. Creo que necesito encontrar una rutina de conversión de Photoshop a C# HSB – Chris

Cuestiones relacionadas