我正在使用matplotlib.image.imsave('file.png',file,cmap=cmap)
来保存{2} Numpy数组的.png
,其中数组的值只能为0,1或10.我希望0为白色,1为绿色10是红色的。我在这个问题上看到了类似的东西:Matplotlib: Custom colormap with three colors。问题是imsave
没有将规范作为参数,但使用pyplot
对我的应用来说太慢了。任何帮助将不胜感激!
答案 0 :(得分:2)
由值[0,1,10]
组成的输入数组实际上不是图像数组。图像数组将从0
变为255
或从0.
变为1.
。
LinearSegmentedColormap
一个想法是将数组im
规范化为1:im = im/im.max()
。然后可以使用值创建颜色映射
0 -> white, 0.1 -> green, 1 -> red
使用matplotlib.colors.LinearSegmentedColormap.from_list
。
import matplotlib.image
import numpy as np
im = np.random.choice([0,1,10], size=(90, 90), p=[0.5,0.3,0.2])
im2 = im/10.
clist = [(0,"white"), (1./10.,"green"), (1, "red")]
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("name", clist)
matplotlib.image.imsave(__file__+'.png', im, cmap=cmap)
相应的plotlot情节
import matplotlib.pyplot as plt
plt.imshow(im, cmap=cmap)
plt.colorbar(ticks=[0,1,10])
plt.show()
看起来像这样
ListedColormap
ListedColormap
可用于生成白色,绿色和红色三种颜色的色彩映射。在此色彩图中,颜色间隔相等,因此需要将图像阵列映射到等间距值。这可以使用np.unique(im,return_inverse=True)[1].reshape(im.shape)
来完成,[0,1,2]
返回仅包含值im = np.random.choice([0,1,10], size=(90, 90), p=[0.5,0.3,0.2])
im2 = np.unique(im,return_inverse=True)[1].reshape(im.shape)
im3 = im2/float(im2.max())
clist = ["white", "green","red"]
cmap = matplotlib.colors.ListedColormap(clist)
matplotlib.image.imsave(__file__+'2.png',im3, cmap=cmap)
的数组。我们再次需要标准化为1.
import matplotlib.pyplot as plt
plt.imshow(im2, cmap=cmap)
cb = plt.colorbar(ticks=[0,1,2])
cb.ax.set_yticklabels([0,1,10])
plt.show()
虽然输出图像看起来与上面完全相同,但相应的matplotlib图将具有不同的颜色条。
name
答案 1 :(得分:1)
只需构建一个(N, M, 3)
数组,并将其视为RGB模式下的图像像素。
然后就足以将3个独特的值映射到这3种颜色。
代码:
import numpy as np
from scipy.misc import imsave
raw = np.random.choice((0,1,10), size=(500, 500))
img = np.empty((raw.shape[0], raw.shape[1], 3))
img[raw == 0] = (255, 255, 255) # RGB -> white
img[raw == 1] = (0,255,0) # green
img[raw == 10] = (255,0,0) # red
imsave('image.png', img)
我在这里使用scipy的imsave
,但matplotlib可能也是这样。