簡體   English   中英

使用Matplotlib.image的自定義顏色圖

[英]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]組成的輸入數組實際上不是圖像數組。 圖像數組將從0255或從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM