2009-11-24 22 views
5

Vorrei estrarre i colori più utilizzati all'interno di un'immagine, o almeno i toni primari Mi può consigliare come posso iniziare con questa attività? o indicarmi un codice simile? L'ho cercato ma non ho avuto successo.estrazione di colori da un'immagine

+1

Con quale linguaggio o struttura stai lavorando? – jheddings

+0

La risposta dipenderà molto dal tuo ambiente. –

+0

Beh, stavo pensando di elaborare solo per una dimostrazione di concetto e poi tradurlo in python per il batching – biquillo

risposta

4

È possibile ottenere risultati molto buoni utilizzando un Octree Color Quantization algorithm. Altri algoritmi di quantizzazione possono essere trovati su Wikipedia.

+0

Questo è esattamente quello che stavo cercando! Grazie mille! – biquillo

+0

potresti inviare codice di esempio nell'obiettivo c – dineshprasanna

+0

@dineshprasanna, no non posso. Se Google non può aiutarti, potrebbe essere necessario scriverne uno utilizzando le informazioni fornite al link. –

3

Concordo con i commenti: una soluzione di programmazione avrebbe sicuramente bisogno di più informazioni. Ma fino ad allora, supponendo che otterrai i valori RGB di ogni pixel dell'immagine, dovresti considerare lo HSV colorspace dove si può dire che la tonalità rappresenti il ​​"tono" di ciascun pixel. È quindi possibile utilizzare un histogram per identificare i toni più utilizzati nell'immagine.

+0

NB per "HSV colorspace" è più probabile che tu dica "HSV-mode RGB model" - HSV (e la sua gemella fraterna HSL) sono distorsioni di un RGB color _model_; praticamente chiunque si riferisca a un modello RGB (o, erroneamente, uno "spazio cromatico RGB") si occupi di rappresentazioni di valori nello spazio _CIE-XYZ'39 color_. Non provi a filtrare specificatamente la tua risposta, ma lì vai. – fish2000

1

Bene, presumo che sia possibile accedere a ciascun colore RGB di ogni pixel. Ci sono due modi in cui puoi farlo a seconda di come lo vuoi.

Per prima cosa è sufficiente creare alcuni di tutti i pixel R, G e B. In questo modo.

Uno pseudo codice.


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

Quindi vedere quale è di più.

Questo ti dà solo l'immagine è più rossa, verde o blu.

Un altro modo consente di ottenere anche il colore combinato statico (come l'arancione) semplicemente creando l'istogramma di ciascuna combinazione RGB.

Uno pseudo codice.


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

Quindi vedere quale ha più conteggio. Puoi anche ridurre la risoluzione del colore come una normale colorazione RGB ti darà fino a 6,7 ​​milioni di colori.

Questo può essere fatto facilmente dato l'RGB a intervalli di colore. Ad esempio, diciamo, RGB è 8 passi non 256.

Uno pseudo codice.



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); 
}

Quindi è possibile vedere quale intervallo ha il maggior numero.

Spero che questa tecnica abbia senso per voi.

+0

Bello! grazie mille, davvero utile! – biquillo