8

Say we had an image we somehow modified via openCV:

enter image description here

And now we would love to apply to it Gradient Map (like one we can apply via photoshop):

enter image description here

So I wonder how to apply gradient map (rainbow colors) via openCV?

myWallJSON
  • 9,110
  • 22
  • 78
  • 149
  • 1
    Well, don't know anything about OpenCV, but the process is split into two parts, RGB to Grayscale, and then Grayscale back to RGB using that gradient. See [here](http://nashruddin.com/opencv-examples-for-operation-on-images.html/5) for the first part, and [here](http://stackoverflow.com/questions/6686868/opencv-color-mapping-with-direct-pixel-access) for the second. – scientiaesthete Apr 06 '12 at 23:36

2 Answers2

14

Here is a method to create false/pseudo-color images using Python, conversion to c++ should be very straightforward. Overview:

  1. Open your image as grayscale, and RGB
  2. Convert the RGB image to HSV (Hue, Saturation, Value/Brightness) color space. This is a cylindrical space, with hue represented by a single value on the polar axis.
  3. Set the hue channel to the grayscale image we already opened, this is the crucial step.
  4. Set value, and saturation channels both to maximal values.
  5. Convert back to RGB space (otherwise display will be incorrect).

There are a couple of catches though...

  1. As Hue is held in degrees and the color spectrum is represented from 0 to 180 (not 0-256 and not 0-360 (sometimes the case)), we need to rescale the grayscale image appropriately by multiplying by 180 / 256.0
  2. In the opencv case the hue colorscale starts at blue (not red, as in your image). ie. the mapping goes like this:

from: enter image description here to: enter image description here

If this is important to change we can do so by offsetting all the hue elements and wrapping them around 180 (otherwise it will saturate). The code does this by masking the image at this cut off point and then offsetting appropriately. Using an offset of 120, generates your colorscale:

from: enter image description here to: enter image description here

and the image processed this way seems to match yours very well (at end).

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)

Your image processed with offset = 120:

enter image description here

fraxel
  • 34,470
  • 11
  • 98
  • 102
  • @What if we want to use gradient color space of photoshop on images like here http://www.fudgegraphics.com/2008/10/create-a-realistic-outer-space-scene-in-photoshop/ by using opencv – AHF Apr 28 '14 at 16:10
5

Now exists the openCV function called applyColorMap which makes this process trivial. The following code will do the trick

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

And this is the result:

Original plane Figure 1: Original plane Plane after applying colormap Figure2: Plane after applying colormap

richar8086
  • 177
  • 4
  • 13