Matplotlib:imshow中cmap的作用是什么?
我正在尝试用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')这行代码是干什么的?我在谷歌上搜索过,了解到'gray'这个参数是个颜色映射。但是我在网站上看到的图片(链接里有)并没有以灰度显示。我试着去掉第二个参数,代码变成了plt.imshow(img1)。这样执行后,图片和之前一样。那第二个参数'gray'到底有什么作用呢?能不能给我解释一下?非常感谢任何帮助。
PS. 我对Matplotlib完全是个新手
1 个回答
33
当 img1
的形状是 (M,N,3)
或 (M,N,4)
时,img1
中的值被理解为 RGB 或 RGBA 值。在这种情况下,cmap(颜色映射)就会被忽略。根据 help(plt.imshow) 的说明:
cmap :
~matplotlib.colors.Colormap
,可选,默认值:None如果是 None,默认使用 rc
image.cmap
的值。当X
有 RGB(A) 信息时,cmap
会被忽略
但是,如果 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,)