OpenCV: как применить карту градиента радуги к изображению?

скажем, у нас было изображение, которое мы как-то изменили через openCV:

enter image description here

и теперь мы хотели бы обратиться к нему градиентная карта (например, мы можем применить через photoshop):

enter image description here

поэтому мне интересно, как применить градиентную карту (цвета радуги) через openCV?

2 ответов


вот метод создания ложных / псевдоцветных изображений с использованием Python, преобразование в c++ должно быть очень простым. Обзор:

  1. откройте изображение в оттенках серого и RGB
  2. преобразование изображения RGB в цветовое пространство HSV (оттенок, насыщенность, значение/яркость). Это цилиндрическое пространство с оттенком, представленным одним значением на полярной оси.
  3. установите канал оттенка на изображение в оттенках серого, которое мы уже открыли, это имеет решающее значение шаг.
  4. установить значение и каналы насыщения для максимальных значений.
  5. преобразовать обратно в пространство RGB (в противном случае дисплей будет неправильным).

есть несколько уловов, хотя...

  1. поскольку оттенок держится в градусах, а цветовой спектр представлен от 0 до 180 (а не 0-256 и не 0-360 (иногда бывает)), нам нужно соответствующим образом масштабировать изображение в оттенках серого, умножая на 180 / 256.0
  2. в случае opencv цветовая шкала оттенка начинается с синего (не красного, как на вашем изображении). то есть. отображение выглядит следующим образом:

from:enter image description here в: enter image description here

Если это важно изменить, мы можем сделать это путем смещения всех элементов оттенка и обертывания их вокруг 180 (в противном случае он будет насыщать). Код делает это, маскируя изображение в этой точке отсечения,а затем соответствующим образом компенсируя. Используя смещение 120, генерирует вашу цветовую шкалу:

from:enter image description here в: 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


теперь существует функция openCV под названием applyColorMap что делает этот процесс тривиальный. Следующий код сделает трюк

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

и вот результат:

Original plane Рисунок 1: исходная плоскость Plane after applying colormap Figure2: плоскость после применения colormap