[英]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.