原文鏈接:http://www.juzicode.com/opencv-note-color-map-applycolormap
在OpenCV中通常使用cvtColor()進行色彩空間的轉換,它可以實現彩色圖像在各種色彩空間里的轉換,也可以用於彩色圖像和灰度圖像之間相互轉換,但是在彩色圖像轉換到灰度圖像后,再用該灰度圖轉換回彩色圖像只是名義上多通道的彩色圖像,人眼看到的卻不是“彩色”了。下面這個例子展示了這個彩轉灰、灰轉彩的過程:
#vx:桔子code / juzicode.com
import cv2
img_src = cv2.imread("nezha.jpg")
img_gray = cv2.cvtColor(img_src,cv2.COLOR_BGR2GRAY) #彩色轉灰度
print(img_gray.shape) #單通道
img_color = cv2.cvtColor(img_gray,cv2.COLOR_GRAY2BGR) #灰度轉彩色
print(img_color.shape) #3通道
cv2.imshow('img_color',img_color)
cv2.imshow('img_src',img_src)
cv2.waitKey()
cv2.destroyAllWindows()
上圖中右邊是用cvtColor轉換為灰度圖后再轉回的彩色圖,在這個彩色圖里面我們一點“彩色”的影子都看不到了。
有沒有方法可以讓轉換成后的彩色圖看起來更“彩色”呢?這里介紹一個功能更強大的接口函數:applyColorMap(),它可以將灰度圖像轉換成彩色圖像,轉換的模式達22種之多,它的接口形式是這樣的:
cv2.applyColorMap(src, colormap[, dst]) ->dst
其中src為輸入圖像,可以是單通道或3通道的8bit圖像。
colormap為顏色圖模式,可以傳入整數0~21對應各種不同的顏色圖,或者用cv2.COLORMAP_AUTUMN(等價於0)、cv2.COLORMAP_BONE(等價於1)等方式傳入,OpenCV源碼頭文件中定義的22種模式如下:
//! GNU Octave/MATLAB equivalent colormaps
enum ColormapTypes
{
COLORMAP_AUTUMN = 0, //!< 
COLORMAP_BONE = 1, //!< 
COLORMAP_JET = 2, //!< 
COLORMAP_WINTER = 3, //!< 
COLORMAP_RAINBOW = 4, //!< 
COLORMAP_OCEAN = 5, //!< 
COLORMAP_SUMMER = 6, //!< 
COLORMAP_SPRING = 7, //!< 
COLORMAP_COOL = 8, //!< 
COLORMAP_HSV = 9, //!< 
COLORMAP_PINK = 10, //!< 
COLORMAP_HOT = 11, //!< 
COLORMAP_PARULA = 12, //!< 
COLORMAP_MAGMA = 13, //!< 
COLORMAP_INFERNO = 14, //!< 
COLORMAP_PLASMA = 15, //!< 
COLORMAP_VIRIDIS = 16, //!< 
COLORMAP_CIVIDIS = 17, //!< 
COLORMAP_TWILIGHT = 18, //!< 
COLORMAP_TWILIGHT_SHIFTED = 19, //!< 
COLORMAP_TURBO = 20, //!< 
COLORMAP_DEEPGREEN = 21 //!< 
};
各種ColormapTypes對應的色彩是下圖這樣的,有各種春夏秋冬四季風格、冷熱風格等等:
下面這個例子將本地文件按照灰度圖方式讀入,然后將該灰度圖用22種模式依次轉換后顯示、存儲:
#vx:桔子code / juzicode.com
import cv2
img_gray = cv2.imread("nezha.jpg",cv2.IMREAD_GRAYSCALE)
for i in range(22):
dst = cv2.applyColorMap(img_gray,i)
cv2.imshow('map',dst)
cv2.waitKey(500)
cv2.imwrite("map-"+str(i)+".jpg",dst)
轉換后的效果是這樣的:
這個例子里面我們用來轉換的源圖像是一個灰度圖,實際上我們也可以用彩色圖像作為源圖像,經過桔子菌的測試,用彩色圖和灰度圖轉換出來的效果是一樣的。