OpenCV:如何在图像上应用彩虹渐变图?

时间:2012-04-06 23:26:22

标签: c++ c opencv gradient

假设我们有一个我们以某种方式通过openCV修改的图像:

enter image description here

现在我们很乐意申请Gradient Map (like one we can apply via photoshop)

enter image description here

所以我想知道如何通过openCV应用渐变映射(彩虹色)?

2 个答案:

答案 0 :(得分:13)

这是一种使用Python创建假/伪彩色图像的方法,转换为c ++应该非常简单。概述:

  1. 以灰度和RGB
  2. 打开图像
  3. 将RGB图像转换为HSV(色相,饱和度,值/亮度)色彩空间。这是一个圆柱形空间,其色调由极轴上的单个值表示。
  4. 将色调通道设置为我们已打开的灰度图像,这是至关重要的一步。
  5. 将值和饱和度通道设置为最大值。
  6. 转换回RGB空间(否则显示不正确)。
  7. 虽然有几次捕获......

    1. 由于Hue以度为单位且色谱表示为0到180(不是0-256而不是0-360(有时是这种情况)),我们需要通过乘以{{1}来适当地重新缩放灰度图像。 }}
    2. 在opencv情况下,色调色阶从蓝色开始(不是红色,如图像中所示)。即。映射如下:
    3. 从:enter image description here到:enter image description here

      如果这对改变很重要,我们可以通过偏移所有色调元素并将它们包裹在180左右(否则它会饱和)来实现。代码通过在此截止点处屏蔽图像然后适当地偏移来实现此目的。使用120的偏移量生成您的色阶:

      从:enter image description here到:enter image description here

      并且以这种方式处理的图像似乎与你的相匹配(最后)。

      180 / 256.0

      使用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) 处理您的图片:

      enter image description here

答案 1 :(得分:1)

现在存在名为applyColorMap的openCV函数,这使得这个过程变得微不足道。以下代码将起到作用

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

这就是结果:

Original plane 图1:原始平面 Plane after applying colormap 图2:应用色彩图后的平面