2012-04-06 14 views
8

Sagen wir ein Bild hatten wir irgendwie über OpenCV geändert:OpenCV: Wie man Rainbow Gradient Map auf ein Bild anwenden?

enter image description here

Und jetzt würden wir lieben es Gradient Map (like one we can apply via photoshop) anzuwenden:

enter image description here

So frage ich mich, wie man sich bewirbt Gradientenkarte (Regenbogenfarben) über openCV?

+1

Nun anwenden, weiß nichts über OpenCV, aber der Prozess ist in zwei Teile geteilt, RGB zu Graustufen, und dann Graustufen zurück zu RGB mit diesem Gradienten. Siehe [hier] (http://nashruddin.com/opencv-examples-for-operation-on-images.html/5) für den ersten Teil und [hier] (http://stackoverflow.com/questions/6686868/opencv-color-mapping-mit-direct-pixel-access) für die Sekunde. – scientiaesthete

Antwort

12

Hier ist eine Methode zum Erstellen falscher/Pseudo-Farb-Bilder mit Python, sollte die Konvertierung in C++ sehr einfach sein. Übersicht:

  1. Öffnen Sie Ihr Bild als Graustufen und RGB
  2. das RGB-Konvertierung von Abbildern zu HSV (Farbton, Sättigung, Wert/Helligkeit) Farbraum. Dies ist ein zylindrischer Raum, dessen Farbton durch einen einzelnen Wert auf der Polarachse dargestellt wird.
  3. Setzen Sie den Farbton-Kanal auf das Graustufenbild, das wir bereits geöffnet haben, dies ist der entscheidende Schritt.
  4. Den Wert und die Sättigungskanäle auf maximale Werte einstellen.
  5. In den RGB-Raum zurück konvertieren (andernfalls wird die Anzeige falsch angezeigt).

Es gibt ein paar Fänge obwohl ...

  1. Als Farbton in Grad gehalten wird und das Farbspektrum dargestellt wird, von 0 bis 180 (nicht 0-256 und 0-360 nicht (manchmal Fall)), wir müssen das Graustufenbild durch Multiplikation mit 180/256.0
  2. entsprechend skalieren. Im opencv-Fall beginnt die Farbton-Farbskala bei blau (nicht rot, wie in Ihrem Bild). dh. die Abbildung geht so:

aus: enter image description here zu: enter image description here

Wenn dies wichtig ist, dass wir durch Verrechnung der alle Farbton Elemente tun, dies zu ändern und wickeln sie um 180 (sonst wird es sättigen). Der Code tut dies, indem er das Bild an diesem Schnittpunkt maskiert und dann entsprechend abgleicht. Arbeiten mit einem Versatz von 120, erzeugt Ihre Farbkarte:

aus: enter image description here zu: enter image description here

und das Bild verarbeitet diese Art und Weise Ihr sehr gut zu passen scheint (am Ende).

import cv 

image_bw = cv.LoadImage("TfBmw.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE) 
image_rgb = cv.LoadImage("TfBmw.jpg") 

#create the image arrays we require for the processing 
hue=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1) 
sat=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1) 
val=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1) 
mask_1=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1) 
mask_2=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1) 

#convert to cylindrical HSV color space 
cv.CvtColor(image_rgb,image_rgb,cv.CV_RGB2HSV) 
#split image into component channels 
cv.Split(image_rgb,hue,sat,val,None) 
#rescale image_bw to degrees 
cv.ConvertScale(image_bw, image_bw, 180/256.0) 
#set the hue channel to the greyscale image 
cv.Copy(image_bw,hue) 
#set sat and val to maximum 
cv.Set(sat, 255) 
cv.Set(val, 255) 

#adjust the pseudo color scaling offset, 120 matches the image you displayed 
offset=120 
cv.CmpS(hue,180-offset, mask_1, cv.CV_CMP_GE) 
cv.CmpS(hue,180-offset, mask_2, cv.CV_CMP_LT) 
cv.AddS(hue,offset-180,hue,mask_1) 
cv.AddS(hue,offset,hue,mask_2) 

#merge the channels back 
cv.Merge(hue,sat,val,None,image_rgb) 
#convert back to RGB color space, for correct display 
cv.CvtColor(image_rgb,image_rgb,cv.CV_HSV2RGB) 

cv.ShowImage('image', image_rgb) 
# cv.SaveImage('TfBmw_120.jpg',image_rgb) 
cv.WaitKey(0) 

Ihr Bild mit offset = 120 verarbeitet:

enter image description here

+0

@What, wenn wir Gradientenfarbraum von Photoshop auf Bilder wie hier verwenden möchten http://www.fudgegraphics.com/2008/10/create-a-realistic-outer-space-scene-in-photoshop/ mit opencv – AHF

0

existiert nun die OpenCV-Funktion aufgerufen applyColorMap, die dieser Prozess trivial macht.Der folgende Code wird den Trick

image_cm = cv2.applyColorMap(image, cv2.COLORMAP_JET)) 

Und das ist das Ergebnis:

Original plane Abbildung 1: Original Ebene Plane after applying colormap Abbildung 2: Flugzeug nach colormap

Verwandte Themen