8

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

在此处输入图像描述

现在我们很乐意将渐变映射应用于它(就像我们可以通过 Photoshop 应用的那样)

在此处输入图像描述

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

4

2 回答 2

14

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

  1. 以灰度和 RGB 格式打开图像
  2. 将 RGB 图像转换为 HSV(色相、饱和度、值/亮度)颜色空间。这是一个圆柱形空间,色调由极轴上的单个值表示。
  3. 将色调通道设置为我们已经打开的灰度图像,这是关键的一步。
  4. 将值和饱和度通道都设置为最大值。
  5. 转换回 RGB 空间(否则显示将不正确)。

虽然有几个问题......

  1. 由于色调以度为单位,色谱表示为 0 到 180(不是 0-256 也不是 0-360(有时是这种情况)),我们需要通过乘以适当地重新缩放灰度图像180 / 256.0
  2. 在 opencv 情况下,色调色阶从蓝色开始(不是红色,如您的图像中所示)。IE。映射是这样的:

从:在此处输入图像描述到:在此处输入图像描述

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

从:在此处输入图像描述到:在此处输入图像描述

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

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)

您的图像处理过offset = 120

在此处输入图像描述

于 2012-04-09T07:28:11.033 回答
4

现在存在名为applyColorMap的 openCV 函数,它使这个过程变得微不足道。以下代码可以解决问题

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

这是结果:

原飞机 图 1:原始平面 图 应用颜色图后的平面 2:应用颜色图后的平面

于 2017-12-14T09:53:52.420 回答