2013-06-03 16 views
5

Ho un'immagine che è multicolore.Ottenere il colore dominante opencv

enter image description here

voglio calcolare il colore dominante dell'immagine. il colore dominante è il rosso, voglio filtrare il rosso. Sto facendo il seguente codice in opencv ma non sta funzionando.

inRange(input_image, Scalar(0, 0, 0), Scalar(0, 0, 255), output); 

Come posso ottenere il colore dominante in caso contrario? Il mio progetto finale dovrebbe determinare il colore massimo dell'oggetto da solo. Qual è il metodo migliore per questo?

risposta

7

Il metodo migliore è analizzando gli istogrammi.

Il tuo problema è un classico "trova il picco e l'area sotto il picco". Avendo un file immagine (diciamo prendiamo solo il terzo canale per semplicità):

histogram

si dovrà trovare la vetta più alta che istogramma. Il metodo più semplice è quello di interrogare semplicemente la X per la quale Y è massimizzata. I metodi più avanzati funzionano con Windows: calcolano in media i valori Y di 10 punti dati consecutivi, ecc.

Inoltre, funziona nello spazio colore HSV o YCrCb. HSV è buono perché il canale "Hue" si traduce molto da vicino con cosa intendi per "Colore". RGB non è davvero adatto per l'analisi delle immagini.

+0

un istogramma separato per i canali R, G e B non aiuta a trovare il colore dominante. È necessario un singolo istogramma in cui un singolo raccoglitore è una tripla RGB. Naturalmente la dimensione aumenterà in modo esponenziale con il numero di canali ma 3 canali rimane gestibile più, è possibile utilizzare un contenitore come 'std :: unordered_multiset' come soluzione ragionevole –

+1

Ovviamente, questo diventerebbe un problema tridimensionale, che ha molto più alta complessità da configurare. –

9

È necessario quantize (riduci numero di colori) l'immagine prima di cercare il colore più frequente.

Perché? Immagina un'immagine che abbia 100 pixel di (0,0,255) (colore blu int RGB), 100 pixel di (0,0,254) (quasi blu - non troverai nemmeno la differenza) e 150 pixel di (0,255,0) (verde). Qual è il colore più frequente qui? Ovviamente, è verde. Ma dopo la quantizzazione avrai 200 pixel di blu e 150 pixel di verde.

Leggi questa discussione: How to reduce the number of colors in an image with OpenCV?. Ecco semplice esempio:

int coef = 200; 
Mat quantized = img/coef; 
quantized = quantized*coef; 

E questo è quello che ho dopo l'applicazione:

enter image description here

Inoltre è possibile utilizzare k-means o media-shift per farlo (questo è molto maniera efficiente).

Problemi correlati