OpenCV: comment appliquer rainbow gradient map sur une image?

supposons que nous ayons une image que nous avons quelque peu modifiée via openCV:

enter image description here

Et maintenant nous aimerions appliquer courbe de transfert de Dégradé (comme nous pouvons l'appliquer via photoshop):

enter image description here

alors je me demande comment appliquer la carte gradient (couleurs arc-en-ciel) via openCV?

8
demandé sur myWallJSON 2012-04-07 03:26:21

2 réponses

Voici une méthode pour créer des images fausses/pseudo-couleurs en utilisant Python, la conversion en c++ devrait être très simple. Aperçu:

  1. ouvrez votre image comme échelle de gris, et RGB
  2. Convertissez l'image RVB en espace de couleur HSV (Teinte, Saturation, valeur/luminosité). C'est un espace cylindrique, avec la teinte représenté par une valeur unique sur l'axe polaire.
  3. Réglez le canal de teinte à l'image en échelle de gris que nous avons déjà ouverte, c'est l'essentiel étape.
  4. valeur de consigne et canaux de saturation vers les valeurs maximales.
  5. convertir de nouveau en espace RVB (sinon l'affichage sera incorrect).

il y a quelques captures cependant...

  1. comme la teinte est tenue en degrés et que le spectre de couleur est représenté de 0 à 180 (pas de 0 à 256 et pas de 0 à 360 (parfois le cas)), nous devons modifier l'échelle de gris de façon appropriée en multipliant par 180 / 256.0
  2. dans le cas opencv la teinte colorscale commence à bleu (pas rouge, comme dans l'image). IE. la cartographie qui va comme ceci:

:enter image description here à: enter image description here

si cela est important de changer, nous pouvons le faire en compensant tous les éléments de teinte et en les enveloppant autour de 180 (sinon il saturera). Le code le fait en masquant l'image à ce point de coupure et en compensant de manière appropriée. En utilisant un offset de 120, génère votre colorscale:

à partir de: enter image description here à: enter image description here

et l'image traitée de cette façon semble correspondre à la vôtre très bien (à la fin).

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)

Votre image traitée avec offset = 120:

enter image description here

12
répondu fraxel 2012-04-09 07:28:11

existe maintenant la fonction openCV appelée applyColorMap ce qui rend ce processus trivial. Le code suivant va faire l'affaire

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

Et voici le résultat:

Original plane Figure 1: plan D'origine Plane after applying colormap Figure2: plan après l'application de colormap

0
répondu richar8086 2017-12-14 09:53:52