2009-11-24 17 views
5

Me gustaría extraer los colores más utilizados dentro de una imagen, o al menos los tonos primarios ¿Me podrían recomendar cómo puedo comenzar con esta tarea? o apuntarme a un código similar? Lo busqué pero no tuve éxito.extrayendo colores de una imagen

+1

¿Con qué idioma o marco está trabajando? – jheddings

+0

La respuesta dependerá en gran medida de su entorno. –

+0

Bueno, estaba pensando en procesar solo una prueba de concepto y luego traducirlo a python para lotes – biquillo

Respuesta

4

Puede obtener muy buenos resultados usando Octree Color Quantization algorithm. Otros algoritmos de cuantificación se pueden encontrar en Wikipedia.

+0

¡Esto es exactamente lo que estaba buscando! ¡Muchas gracias! – biquillo

+0

podría enviar código de muestra en el objetivo c – dineshprasanna

+0

@dineshprasanna, no, no puedo. Si Google no puede ayudarlo, puede que tenga que escribir el suyo usando la información provista en el enlace. –

3

Estoy de acuerdo con los comentarios: una solución de programación definitivamente necesitaría más información. Pero hasta entonces, suponiendo que obtendrá los valores RGB de cada píxel en su imagen, debe considerar el HSV colorspace donde se puede decir que el tono representa el "tono" de cada píxel. Luego puede usar un histogram para identificar los tonos más utilizados en su imagen.

+0

NB por "espacio de color HSV" lo más probable es que signifique decir "modelo RGB de modo HSV" - HSV (y su hermana gemela HSL) son distorsiones de un RGB color _model_; casi cualquier persona que se refiera a un modelo RGB (o, erróneamente, un "espacio de color RGB") está tratando con representaciones de valores en el _ espacio_ color CIE-XYZ'39. No tratando de identificar específicamente su respuesta, pero hay usted va. – fish2000

1

Bueno, supongo que puede acceder a cada píxel de color RGB. Hay dos formas en que puede hacerlo, dependiendo de cómo lo desee.

Primero puede simplemente crear algunos de los píxeles R, G y B. Me gusta esto.

Un pseudo código.


int Red = 0; 
int Green = 0; 
int Blue = 0; 
foreach (Pixels as aPixel) { 
    Red += aPixel.getRed(); 
    Green += aPixel.getGreen(); 
    Blue += aPixel.getBlue(); 
}

A continuación, vea cuál es más.

Esto le da solo la imagen es más roja, verde o azul.

Otra forma también le dará estática de color combinado (como el naranja) simplemente creando un histograma de cada combinación RGB.

Un pseudo código.


Map ColorCounts = new(); 
foreach (Pixels as aPixel) { 
    const aRGB = aPixel.getRGB(); 
    var aCount = ColorCounts.get(aRGB); 
    aCount++; 
    ColorCounts.put(aRGB, aCount); 
}

A continuación, ver cuál tiene más recuento. También puede reducir la resolución del color, ya que una coloración RGB regular le proporcionará hasta 6.7 millones de colores.

Esto se puede hacer fácilmente dado el RGB a rangos de color. Por ejemplo, supongamos que RGB es 8 pasos, no 256.

Un pseudo código.



function Reduce(Color) { 
    return (Color/32)*32; // 32 is 256/8 as for 8 ranges. 
} 
function ReduceRGB(RGB) { 
    return new RGB(Reduce(RGB.getRed()),Reduce(RGB.getGreen() Reduce(RGB.getBlue())); 
} 

Map ColorCounts = new(); 
foreach (Pixels as aPixel) { 
    const aRGB = ReduceRGB(aPixel.getRGB()); 
    var aCount = ColorCounts.get(aRGB); 
    aCount++; 
    ColorCounts.put(aRGB, aCount); 
}

A continuación, puede ver qué rango es el que más cuenta.

Espero que esta técnica tenga sentido para usted.

+0

¡Agradable! ¡Muchas gracias, realmente útil! – biquillo

Cuestiones relacionadas