[英]Custom Colormap using Matplotlib.image
我正在使用matplotlib.image.imsave('file.png',file,cmap=cmap)
保存2d Numpy数组的.png
,其中该数组只能具有0、1或10的值。我希望0到是白色,1是绿色,10是红色。 我在这个问题上看到了类似的东西: Matplotlib:具有三种颜色的自定义颜色图 。 问题是imsave
不会将norm作为参数,但是对我的应用程序而言,使用pyplot
太慢了。 任何援助将不胜感激!
由值[0,1,10]
组成的输入数组实际上不是图像数组。 图像数组将从0
到255
或从0.
到1.
。
LinearSegmentedColormap
一个想法是将数组im
标准化为1 .: im = im/im.max()
。 然后可以使用matplotlib.colors.LinearSegmentedColormap.from_list
创建值为0 -> white, 0.1 -> green, 1 -> red
。
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)
对应的pyplot图
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]
的数组。 我们再次需要归一化为1。
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)
虽然输出图像看起来与上面的图像完全相同,但是相应的matplotlib图将具有不同的颜色条。
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()
只需构建一个(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可能工作相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.