2016-04-18 8 views
0

Guten Tag!OpenCV Recolorization

Ich kann nicht scheinen, die richtigen Bedingungen für das zu finden, was ich in OpenCV getan habe. Hier ist die Situation:

Ich habe ein Graustufenbild und Farbe (BGR).

Ich möchte die Farbe auf das Graustufenbild anwenden, aber die Luma beibehalten und danach speichern.

Mein ursprünglicher Denkprozess war:

  1. Konvertieren BGR Farbe
  2. Luv L Ersetzen von Graustufenbild
  3. Endbild BGR Konvertieren und

Dies retten ist, was ich Bisher getan:

 cv::Mat pixelColor(1, 1, CV_8UC3, cv::Scalar(0)); 
     pixelColor.at<cv::Vec3b>(1, 1) = cv::Vec3b(128, 255, 0); // currently hard-coded but it actually comes from another source 
     cv::cvtColor(pixelColor, pixelColor, CV_BGR2Luv); 
     pixelColor.at<cv::Vec3b>(1, 1)[0] = image.at<unsigned char>(y, x); 
     cv::cvtColor(pixelColor, pixelColor, CV_Luv2BGR); 

I iteriert über alle y und x meines Graustufenbildes. Die tatsächliche Farbe kommt woanders hin, aber es ist garantiert BGR.

Meine Fragen sind: (1) Was ist der richtige Ausdruck für diesen Prozess? (2) Wo gehe ich falsch?

+0

Wie funktioniert das/funktioniert nicht? '(2)' fragt ', wo ich falsch liege ", aber Sie versäumen es, anzugeben, welche Fehler Sie empfangen. –

+0

nicht Fehler, eher nicht das gesamte Farbspektrum ist richtig platziert. Mein spezieller Fall, ich färbt ein Graustufenbild mit 3 Farben Das Kriterium für die Kolorierung ergibt sich aus einem Wahrscheinlichkeitsmaßfeld, das ich bereits berechnet habe: je nach Farbraum sind nur 2 der 3 Farben richtig platziert, manchmal gehen die Details verloren, ich weiß nicht was Ich vermisse das. –

Antwort

0

Ich nehme an, Sie könnten diesen Prozess als Kanalwechsel oder Kanalaustausch bezeichnen? Sie sollten nicht explizit über die Pixel in Ihren Bildern iterieren müssen.

Es wäre wahrscheinlich am einfachsten, Ihr LUV-Bild in einen Vektor von Mats aufzuteilen().

Dies gibt Ihnen 3, Single-Channel-Mats L, U und V in Ihrem Vektor.

Dann ersetzen Sie die 'L' Mat im Vektor mit der Graustufen (Einkanal) Mat mit Standard-Vektor-Operationen. Schließlich füge das Ergebnis wieder in eine 3-Kanal-Matte ein.

Mat newLuma; 
cv::merge(temp,newLuma); 

Dann konvertieren "NewLuma" zurück zu BGR.

+0

Ich werde das versuchen !, das scheint sehr logisch zu sein. Der Grund, warum ich es pro Pixel mache, ist, weil ich das basierend auf einem Wahrscheinlichkeitsfeld wähle (berechnet in einem vorherigen Lauf). –

+0

es funktioniert! Vielen Dank! –