OpenCV: как применить карту градиента радуги к изображению?
скажем, у нас было изображение, которое мы как-то изменили через openCV:
и теперь мы хотели бы обратиться к нему градиентная карта (например, мы можем применить через photoshop):
поэтому мне интересно, как применить градиентную карту (цвета радуги) через openCV?
2 ответов
вот метод создания ложных / псевдоцветных изображений с использованием Python, преобразование в c++ должно быть очень простым. Обзор:
- откройте изображение в оттенках серого и RGB
- преобразование изображения RGB в цветовое пространство HSV (оттенок, насыщенность, значение/яркость). Это цилиндрическое пространство с оттенком, представленным одним значением на полярной оси.
- установите канал оттенка на изображение в оттенках серого, которое мы уже открыли, это имеет решающее значение шаг.
- установить значение и каналы насыщения для максимальных значений.
- преобразовать обратно в пространство RGB (в противном случае дисплей будет неправильным).
есть несколько уловов, хотя...
- поскольку оттенок держится в градусах, а цветовой спектр представлен от 0 до 180 (а не 0-256 и не 0-360 (иногда бывает)), нам нужно соответствующим образом масштабировать изображение в оттенках серого, умножая на
180 / 256.0
- в случае opencv цветовая шкала оттенка начинается с синего (не красного, как на вашем изображении). то есть. отображение выглядит следующим образом:
from: в:
Если это важно изменить, мы можем сделать это путем смещения всех элементов оттенка и обертывания их вокруг 180 (в противном случае он будет насыщать). Код делает это, маскируя изображение в этой точке отсечения,а затем соответствующим образом компенсируя. Используя смещение 120, генерирует вашу цветовую шкалу:
from: в:
и изображение, обработанное таким образом, кажется, очень хорошо соответствует вашему (в конце).
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
:
теперь существует функция openCV под названием applyColorMap что делает этот процесс тривиальный. Следующий код сделает трюк
image_cm = cv2.applyColorMap(image, cv2.COLORMAP_JET))
и вот результат:
Рисунок 1: исходная плоскость Figure2: плоскость после применения colormap