OpenCV:如何将彩虹渐变映射应用于图像?

8

1
好的,我不知道OpenCV的任何内容,但是这个过程分为两个部分,RGB到灰度,然后使用该梯度将灰度转换回RGB。请参见此处获取第一部分的信息,以及此处获取第二部分的信息。 - scientiaesthete
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的情况下,hue的颜色范围从蓝色开始(而不是红色,如您的图像)。即,映射如下:

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

如果需要更改这一点,我们可以通过偏移所有色调元素并将它们包裹在180周围(否则会饱和)来实现。代码通过在此截断点处遮罩图像,然后适当地进行偏移来实现此目的。使用120的偏移量生成您的颜色刻度:

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

用这种方式处理的图像似乎非常接近于您的图像(在最后)。
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处理过的图片:

enter image description here


如果我们想在像这个链接( http://www.fudgegraphics.com/2008/10/create-a-realistic-outer-space-scene-in-photoshop/)中的图片上使用 Photoshop 的渐变色彩空间,并使用 OpenCV 实现,该怎么办呢? - AHF

5
现在已经存在一个名为 applyColorMap 的 openCV 函数,可以轻松完成这个过程。以下代码可以帮助您解决问题。
image_cm = cv2.applyColorMap(image, cv2.COLORMAP_JET))

以下是结果:

原始平面图 图1:原始平面图 应用色彩地图后的平面图 图2:应用色彩地图后的平面图


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接