2013-10-04 9 views
10

Wenn ein Bild in OpenCV von Farbe in Graustufen umgewandelt wird, welcher Konvertierungsalgorithmus wird verwendet? Ich habe versucht, dies im Quellcode auf GitHub nachzuschlagen, aber ich hatte keinen Erfolg.Welchen Graustufen-Konvertierungsalgorithmus verwendet OpenCV cvtColor()?

Die Leichtigkeit Methode mittelt die prominentesten und am wenigsten prominente Farben:

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

Die durchschnittliche Methode einfach den Durchschnitt der Werte:

(R + G + B)/3. 

Die Leuchtkraft Methode eine anspruchsvollere Version der durchschnittlichen Methode ist . Sie mittelt auch die Werte, aber sie bildet einen gewichteten Durchschnitt, um die menschliche Wahrnehmung zu berücksichtigen. Wir sind empfindlicher für Grün als andere Farben, so dass Grün am stärksten belastet wird. Hier

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

ist ein Beispiel für einige Konvertierungsalgorithmen: http://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale/

+1

Warum Ihre Leuchtkraft Formel im Faktor für G (0,71 vs. 0,72) von Ihrer Referenz unterscheiden - dies ist ein Tippfehler oder Absicht? – Wolf

Antwort

14

Der Farb Algorithmus in Graustufen in der cvtColor() documentation angegeben. (Suche nach RGB2GRAY). Die verwendete Formel ist die gleiche wie für CCIR 601:

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

Die Leuchtkraft Formel Sie ergab für ITU-R Empfehlung BT. 709. Wenn Sie möchten, dass Sie CV_RGB2XYZ (z. B.) im dritten Parameter cvtColor() angeben können, extrahieren Sie den Y-Kanal.

Sie können OpenCV dazu bringen, die beschriebene "Helligkeits" -Methode durchzuführen, indem Sie eine CV_RGB2HLS Konvertierung durchführen und dann den L-Kanal extrahieren. Ich denke nicht, dass OpenCV eine Konvertierung für die "durchschnittliche" Methode hat, , aber wenn Sie die Dokumentation erkunden, werden Sie sehen, dass es ein paar andere Möglichkeiten gibt.

0

Ich wollte nur darauf hinweisen, dass:

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

Auf der anderen Seite, es als numerisches Array Laden funktioniert:

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

Also nur für diese Seltsamkeiten aufpassen.

Aber bei der Konvertierung in Graustufen cv2.cvtColor verwendet die Bänder korrekt. Ich habe Pixelwerte mit Matlab rgb2gray verglichen.

Prost