使用Matplotlib.image自定义Colormap

时间:2017-03-14 21:50:54

标签: python matplotlib

我正在使用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对我的应用来说太慢了。任何帮助将不胜感激!

2 个答案:

答案 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)

enter image description here

相应的plotlot情节

import matplotlib.pyplot as plt
plt.imshow(im, cmap=cmap)
plt.colorbar(ticks=[0,1,10])
plt.show()

看起来像这样

enter image description here

湾使用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()

enter image description here

虽然输出图像看起来与上面完全相同,但相应的matplotlib图将具有不同的颜色条。

name

enter image description here

答案 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)

enter image description here

我在这里使用scipy的imsave,但matplotlib可能也是这样。