Вопрос по c, c++ – OpenCV: как нанести карту градиента радуги на изображение?

8

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

А теперь мы бы с удовольствием обратились к нему Градиентная карта (наподобие той, которую мы можем применить через фотошоп):

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

Ну, ничего не знаю об OpenCV, но процесс разделен на две части, от RGB до Grayscale, а затем Grayscale обратно в RGB с использованием этого градиента. ВидетьВо для первой части иВо для второго. scientiaesthete

Ваш Ответ

2   ответа
12

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

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

Есть пара уловов ...

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

от: to:

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

от: to:

и изображение, обработанное таким образом, кажется, очень хорошо совпадает с вашим (в конце).

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:

@ Что, если мы хотим использовать градиентное цветовое пространство фотошопа на изображениях, как здесь Fudgegraphics.com / 2008/10 / ... используя opencv AHF
1

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

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

И это результат:

Фигура 1: Оригинальная плоскость Figure2: Плоскость после применения карты цветов

Похожие вопросы