2013-10-04 15 views
10

Quando si converte un'immagine in OpenCV da colore in scala di grigi, quale algoritmo di conversione viene utilizzato? Ho provato a cercare nel codice sorgente su GitHub, ma non ho avuto alcun successo.Quale algoritmo di conversione in scala di grigi utilizza OpenCV cvtColor()?

Le medie metodo leggerezza i colori più importanti e meno importanti:

(max(R, G, B) + min(R, G, B))/2. 

il metodo della media semplicemente medie i valori:

(R + G + B)/3. 

Il metodo luminosità è una versione più sofisticata del metodo della media . Media anche i valori, ma forma una media ponderata per tenere conto della percezione umana. Siamo più sensibili al verde rispetto ad altri colori, quindi il verde è più pesantemente ponderato.

The formula for luminosity is 0.21 R + 0.72 G + 0.07 B. 

Ecco un esempio di alcuni algoritmi di conversione: http://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale/

+1

Perché la formula luminosità differiscono dal tuo riferimento tra il fattore G (0,71 vs 0,72) - questo è un errore di battitura o intenzionale? – Wolf

risposta

14

Il colore in scala di grigi algoritmo sia previsto nel cvtColor() documentation. (cerca RGB2GRAY). La formula utilizzata è la stessa per CCIR 601:

Y = 0,299 R + 0,587 G + 0,114 B

La formula luminosità fornita non è per raccomandazione ITU-R BT. 709. Se si desidera, è possibile specificare CV_RGB2XYZ (ad es.) Nel terzo parametro su cvtColor() quindi estrarre il canale Y.

È possibile ottenere OpenCV per eseguire il metodo di "leggerezza" descritto facendo una conversione CV_RGB2HLS quindi estrarre il canale L. Non penso che OpenCV abbia una conversione per il metodo "medio", ma se esplori la documentazione vedrai che ci sono alcune altre possibilità.

0

Volevo solo far notare che:

img = cv2.imread(rgbImageFileName) 
b1 = img[:,:,0] # Gives **Blue** 
b2 = img[:,:,1] # Gives Green 
b3 = img[:,:,2] # Gives **Red** 

D'altra parte, di caricarla come un array numerico funziona bene:

imgArray= gdalnumeric.LoadFile(rgbImageFileName) 
Red = imgArray[0, :, :].astype('float32') 
Green = imgArray[1, :, :].astype('float32') 
Blue = imgArray[2, :, :].astype('float32') 

Così Basta guardare fuori per queste stranezze.

Tuttavia, durante la conversione in scala di grigi cv2.cvtColor utilizza correttamente le bande. Ho confrontato i valori dei pixel usando il rgb2gray di Matlab.

Acclamazioni

Problemi correlati