Matplotlib:imshow中cmap的作用是啥?

Posted

技术标签:

【中文标题】Matplotlib:imshow中cmap的作用是啥?【英文标题】:Matplotlib : What is the function of cmap in imshow?Matplotlib:imshow中cmap的作用是什么? 【发布时间】:2014-10-26 20:52:43 【问题描述】:

我正在尝试使用 python 学习 opencv 并遇到以下代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt

BLUE = [255,0,0]

img1 = cv2.imread('opencv_logo.png')
replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)

plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')

plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')

plt.show()

来源:http://docs.opencv.org/master/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html#exercises

plt.imshow(img1, 'gray') 是做什么的?我尝试搜索谷歌,我能理解的是“灰色”参数是一个彩色地图。但是我的图像(图片在网站上。见链接)没有以灰度显示。我尝试删除第二个参数。所以代码就像 plt.imshow(img1)。它执行。图像与以前相同。那么第二个参数“灰色”有什么作用呢?有人可以向我解释这一切吗?任何帮助表示赞赏。谢谢。

PS。我对 Matplotlib 完全陌生

【问题讨论】:

【参考方案1】:

img1 的形状为(M,N,3)(M,N,4) 时,img1 中的值被解释为 RGB 或 RGBA 值。在这种情况下,cmap 将被忽略。每the help(plt.imshow) docstring:

cmap : ~matplotlib.colors.Colormap,可选,默认:无

如果没有,默认为 rc image.cmap 值。 cmap 在以下情况下被忽略 X 有 RGB(A) 信息

但是,如果 img 是一个形状为 (M,N) 的数组,则 cmap 控制用于显示值的颜色图。


import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.axes_grid1 as axes_grid1
np.random.seed(1)

data = np.random.randn(10, 10)

fig = plt.figure()
grid = axes_grid1.AxesGrid(
    fig, 111, nrows_ncols=(1, 2), axes_pad = 0.5, cbar_location = "right",
    cbar_mode="each", cbar_size="15%", cbar_pad="5%",)

im0 = grid[0].imshow(data, cmap='gray', interpolation='nearest')
grid.cbar_axes[0].colorbar(im0)

im1 = grid[1].imshow(data, cmap='jet', interpolation='nearest')
grid.cbar_axes[1].colorbar(im1)
plt.savefig('/tmp/test.png', bbox_inches='tight', pad_inches=0.0, dpi=200,)

【讨论】:

谢谢。你能解释一下cmap的用途吗?我们为什么要使用彩色地图? 颜色图是将数字映射到颜色的字典。 Matplotlib 提供了很多built-in colormaps。当您有一个二维数组时,例如上面的data,每个网格点的值都是介于 0 和 1 之间的浮点数。gray 颜色映射将 0 映射为黑色,将 1 映射为白色。 jet 颜色图将 0 映射到蓝色,将 1 映射到红色。请参阅链接以直观地显示两者之间的颜色。 更正:上面使用的data 数组具有正态分布的值;默认情况下,颜色图会根据数据范围调整颜色。 @ubuntu:我理解你的第一个评论,然后在最后一个评论之后感到困惑,这究竟是什么意思?以前的彩色图像,以浮点数(2d,1 个通道)表示,现在,我们想将其恢复为 rgb 吗? @Hossein:由于data = np.random.randn(10, 10)data 的最小值和最大值可能不同于 0 和 1。imshow 函数对 data 进行规范化,以便将 min(data) 映射到0 和 max(data) 映射到 1。然后应用颜色图。 second comment 的目的仅仅是为了强调标准化步骤的存在。

以上是关于Matplotlib:imshow中cmap的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib imshow

matplotlib中的imshow()

matplotlib 笔记 imshow

OpenCV 函数学习04-用 matplotlib 显示图像(plt.imshow)

Python / Matplotlib:带有contourf的颜色条不尊重自定义cmap的刻度标签

python matplotlib常用