2012-04-04 17 views
2

habe ich versucht, von BGR zu konvertieren YCrCb die Luminanz zu erhöhen und es zu konvertieren BGR zurückKonvertierung zwischen BGR zu YCrCb und zurück nach BGR

cvSplit (Luma, Y, Cr, cb, 0); < < Splitting nicht in der richtigen Reihenfolge?

... tun etwas über Luminanzkomponente

cvMerge (temp_y, cr, cb, 0, Luma); < < Was ist die richtige Reihenfolge der Leuchtdichte, Cr und Cb?

Antwort

4

Um zwischen verschiedenen Farbräumen zu konvertieren, müssen Sie cvtColor verwenden. Um von BGR nach YCC zu gelangen, sollten Sie den Parameter CV_BGR2YCrCb übergeben (und zurückgehen ist CV_YCrCb2BGR). Die korrekte Verwendung ist:

cvtColor(src, dest, CV_BGR2YCrCb) 

Wo src Quellrahmen ist, und dest Ihre bearbeiteten Rahmens sein wird (die Sie gerade setzen könnte src hier für sie die Änderung an seinem Platz zu tun).

cvSplit ist nicht das, was Sie dafür brauchen, da es einfach ein Multi-Channel-Array in mehrere Single-Channel-Arrays (seine Komponenten) aufteilt. Wenn Sie also einen BGR-Videoframe haben, kann cvSplit Ihnen nur die B-, G-, R-Kanäle isoliert zur Verfügung stellen.

Wenn Sie den Y-Kanal in Isolation verarbeiten Sie Farbraum konvertieren konnte, und dann aufgeteilt und dann wieder zusammenführen, wie folgt aus:

cvtColor(frame, frame, CV_BGR2YCrCb) 
cvSplit(frame, Y, Cr, Cb, NULL) 
#Process the Y channel here. 
cvMerge(Y, Cr, Cb, NULL, frame) 
cvtColor(frame, frame, CV_YCrCb2BGR) 

Wenn Sie nur die Helligkeit des Bildes erhöhen wollen, Ein einfacherer Weg (Sie müssen keine Luminanz verwenden) besteht darin, jedem Kanal einen Skalierer hinzuzufügen:

cvAddS(frame, cvScalar(30,30,30), frame) 
+0

Vielen Dank für die Antwort. Muss cvSplit BGR in Ordnung sein? Und ich muss etwas auf der Luminanz tun, also konvertiere ich von BGR2YCrCb dann benutze cvSplit danach muss ich cvMerge verwenden, um die Luminanz (schon etwas auf der Luminanz gemacht), Cr und Cb zurück zu verschmelzen. Nach der Zusammenführung wird mit YCrCb2BGR wieder in BGR konvertiert. Daher habe ich Probleme beim Bestimmen der richtigen Reihenfolge des Zusammenführens der Leuchtdichte, Cr und Cb. Sollte es sein: >> cvMerge (temp_y, cr, cb, 0, Luma) oder >> cvMerge (temp_y, cb, cr, 0, Luma) weil beide unterschiedliche Ausgabebild geben. – Mzk

+0

@ Mizuki Kai - Die Reihenfolge ist wichtig. Ohne deinen Code zu sehen, weiß ich nicht, was du falsch machst. Aber ich habe meine Antwort aktualisiert, um zu veranschaulichen, dass Sie Dinge tun können. Auch die [documentarion] (http://opencv.willowgarage.com/documentation/python/core_operations_on_arrays.html?highlight=split#Split) für opencv ist wirklich gut und eine Beratung wert. – fraxel

+0

Das heißt, da wir wissen, dass openCV BGR2YCrCb verwendet, sollte die Reihenfolge so sein: cvMerge (Y, Cr, Cb, NULL, Frame); folge einfach der Bestellung ist ausreichend.Am ich richtig? – Mzk

Verwandte Themen