OpenCV-Python教程:颜色图(applyColorMap)[只需几行代码生成22种风格各异的彩色图]

返回OpenCV-Python教程

原文链接: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, //!< ![autumn](pics/colormaps/colorscale_autumn.jpg)
    COLORMAP_BONE = 1, //!< ![bone](pics/colormaps/colorscale_bone.jpg)
    COLORMAP_JET = 2, //!< ![jet](pics/colormaps/colorscale_jet.jpg)
    COLORMAP_WINTER = 3, //!< ![winter](pics/colormaps/colorscale_winter.jpg)
    COLORMAP_RAINBOW = 4, //!< ![rainbow](pics/colormaps/colorscale_rainbow.jpg)
    COLORMAP_OCEAN = 5, //!< ![ocean](pics/colormaps/colorscale_ocean.jpg)
    COLORMAP_SUMMER = 6, //!< ![summer](pics/colormaps/colorscale_summer.jpg)
    COLORMAP_SPRING = 7, //!< ![spring](pics/colormaps/colorscale_spring.jpg)
    COLORMAP_COOL = 8, //!< ![cool](pics/colormaps/colorscale_cool.jpg)
    COLORMAP_HSV = 9, //!< ![HSV](pics/colormaps/colorscale_hsv.jpg)
    COLORMAP_PINK = 10, //!< ![pink](pics/colormaps/colorscale_pink.jpg)
    COLORMAP_HOT = 11, //!< ![hot](pics/colormaps/colorscale_hot.jpg)
    COLORMAP_PARULA = 12, //!< ![parula](pics/colormaps/colorscale_parula.jpg)
    COLORMAP_MAGMA = 13, //!< ![magma](pics/colormaps/colorscale_magma.jpg)
    COLORMAP_INFERNO = 14, //!< ![inferno](pics/colormaps/colorscale_inferno.jpg)
    COLORMAP_PLASMA = 15, //!< ![plasma](pics/colormaps/colorscale_plasma.jpg)
    COLORMAP_VIRIDIS = 16, //!< ![viridis](pics/colormaps/colorscale_viridis.jpg)
    COLORMAP_CIVIDIS = 17, //!< ![cividis](pics/colormaps/colorscale_cividis.jpg)
    COLORMAP_TWILIGHT = 18, //!< ![twilight](pics/colormaps/colorscale_twilight.jpg)
    COLORMAP_TWILIGHT_SHIFTED = 19, //!< ![twilight shifted](pics/colormaps/colorscale_twilight_shifted.jpg)
    COLORMAP_TURBO = 20, //!< ![turbo](pics/colormaps/colorscale_turbo.jpg)
    COLORMAP_DEEPGREEN = 21  //!< ![deepgreen](pics/colormaps/colorscale_deepgreen.jpg)
};

各种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)

转换后的效果是这样的:

这个例子里面我们用来转换的源图像是一个灰度图,实际上我们也可以用彩色图像作为源图像,经过桔子菌的测试,用彩色图和灰度图转换出来的效果是一样的。

扩展阅读:

  1. OpenCV-Python教程:色彩空间变换
  2. OpenCV-Python教程

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注