2012-04-06 129 views
8

說我們有我們通過OpenCV的某種方式修改圖像:OpenCV:如何在圖像上應用彩虹漸變圖?

enter image description here

現在,我們很樂意對其適用Gradient Map (like one we can apply via photoshop)

enter image description here

所以我不知道如何應用漸變映射(彩虹色)通過openCV?

+1

好後飛機,什麼都不知道關於OpenCV,但是該過程分爲兩部分,RGB轉換爲灰度,然後使用該漸變將灰度轉換回RGB。參見[這裏](http://nashruddin.com/opencv-examples-for-operation-on-images.html/5)第一部分,和[這裏](http://stackoverflow.com/questions/6686868/opencv-color-mapping-with-direct-pixel-access)。 – scientiaesthete 2012-04-06 23:36:42

回答

12

以下是使用Python創建假/僞彩色圖像的方法,轉換爲C++應該非常簡單。概述:

  1. 打開圖像爲灰度和RGB
  2. 轉換RGB圖像到HSV(色調,飽和度,值/亮度)色彩空間。這是一個圓柱形空間,色度由極軸上的單個值表示。
  3. 將色調通道設置爲我們已經打開的灰度圖像,這是至關重要的一步。
  4. 將值和飽和度通道設置爲最大值。
  5. 轉換回RGB空間(否則顯示將不正確)。

有幾個漁獲雖然的...

  1. 作爲色相以度保持和顏色頻譜從表示0到180(未0-256和0-360不(有時),我們需要通過乘以​​
  2. 來適當地重新調整灰度圖像。即。映射是這樣的:

來源:enter image description here到:enter image description here

如果這個改變,我們可以通過補償色調的元素和包裝他們周圍180(否則會飽和),這樣做是很重要的。該代碼通過在該截斷點掩蓋圖像然後適當地抵消來實現這一點。使用120偏移,產生你的colorscale:

來源: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

+0

@如果我們想通過使用opencv在像這裏一樣的圖像上使用Photoshop的漸變色彩空間http://www.fudgegraphics.com/2008/10/create-a-realistic-outer-space-scene-in-photoshop/ – AHF 2014-04-28 16:10:14

0

現在存在一個稱爲applyColorMap OpenCV的功能,這使得這個過程瑣碎。下面的代碼將這樣的伎倆

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

這是結果:

Original plane 圖1:原始平面 Plane after applying colormap Figure2:應用顏色表