2012-04-06 6 views
8

dire che abbiamo avuto un'immagine in qualche modo modificato tramite OpenCV:OpenCV: come applicare la mappa sfumatura arcobaleno su un'immagine?

enter image description here

E ora ci piacerebbe applicare ad esso Gradient Map (like one we can apply via photoshop):

enter image description here

quindi mi chiedo come applicare mappa gradiente (colori dell'arcobaleno) tramite openCV?

+1

Beh, non so nulla su OpenCV, ma il processo è diviso in due parti, da RGB a scala di grigi, e quindi Grayscale torna a RGB usando quel gradiente. Vedi [qui] (http://nashruddin.com/opencv-examples-for-operation-on-images.html/5) per la prima parte e [qui] (http://stackoverflow.com/questions/6686868/opencv-color-mapping-with-direct-pixel-access) per il secondo. – scientiaesthete

risposta

12

Ecco un metodo per creare immagini false/pseudo-colore usando Python, la conversione in C++ dovrebbe essere molto semplice. Panoramica:

  1. aprire l'immagine in scala di grigi, RGB e
  2. convertire l'immagine RGB per HSV (tonalità, saturazione, valore/luminosità) spazio colore. Questo è uno spazio cilindrico, con la tonalità rappresentata da un singolo valore sull'asse polare.
  3. Imposta il canale di tonalità sull'immagine in scala di grigi che abbiamo già aperto, questo è il passaggio cruciale.
  4. Imposta il valore e i canali di saturazione entrambi ai valori massimi.
  5. Converti nello spazio RGB (altrimenti la visualizzazione sarà errata).

Ci sono un paio di catture però ...

  1. Come Hue si tiene in gradi e lo spettro colore è rappresentato da 0 a 180 (non 0-256 e non 0-360 (talvolta caso)), è necessario ridimensionare l'immagine in scala di grigio in modo appropriato moltiplicando per 180/256.0
  2. Nel caso in cui la tonalità colorscale inizia in blu (non rosso, come nella tua immagine). vale a dire. la mappatura va in questo modo:

da: enter image description here a: enter image description here

Se questo è importante per cambiare che possiamo fare in modo mediante compensazione di tutti gli elementi di tonalità e confezionamento di loro circa 180 (in caso contrario verranno saturati). Il codice esegue questa operazione mascherando l'immagine in questo punto di interruzione e quindi compensando opportunamente. Usando un offset di 120, genera il vostro ColorScale:

da: enter image description here a: enter image description here

e l'immagine elaborata in questo modo sembra corrispondere vostro molto bene (alla fine).

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) 

L'immagine elaborata con offset = 120:

enter image description here

+0

@Che se vogliamo utilizzare lo spazio colore sfumato di Photoshop su immagini come qui http://www.fudgegraphics.com/2008/10/create-a-realistic-outer-space-scene-in-photoshop/ utilizzando opencv – AHF

0

Ora esiste la funzione OpenCV chiamato applyColorMap che rende questo processo banale.Il seguente codice farà il trucco

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

E questo è il risultato:

Original plane Figura 1: piano originale Plane after applying colormap Figura 2: L'aereo dopo l'applicazione colormap

Problemi correlati