2014-10-06 156 views
0

我策劃這個圖像的灰度版本: a busy cat http://matplotlib.org/_images/griddata_demo.png灰度的蟒蛇 - incorect顏色暗灰色變爲淺灰色到深灰色

來源:http://matplotlib.org/examples/pylab_examples/griddata_demo.html

我用下面的代碼:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
from PIL import Image 

file_name = 'griddata_demo.png' 
def func_grey(fname): 
    image = Image.open(fname).convert("L") 
    arr = np.asarray(image) 
    plt.imshow(arr, cmap = cm.Greys_r) 
    plt.show() 

func_grey(file_name) 

Display image as grayscale using matplotlib

我工作的設置是有蟒蛇2.7和Pandas和我已經安裝了Pillow,安裝簡單。有關圖像的要求和

背景資料:

  1. 的圖像來自於數據發現here。理想情況下,此圖像的灰度 版本應直接從此原始數據生成 data.i.e.不要將它保存爲彩色圖像,然後嘗試將 轉換爲灰度 - 而只是生成灰度版本的圖。
  2. 我不知道對應於z值的顏色 - 這些顏色可以任意設置。
  3. 圖像的顏色圖也可以任意選擇 - 沒有偏好。它是 是值得關注的灰度版本。

我的問題與顏色欄中顯示的配色方案有關。我需要顯示顏色欄中顏色從淺灰(最低強度)到深灰(最高強度)的顏色方案。

運行上述代碼後,會生成灰度圖像。在灰度圖像的顏色條中,強度等級-0.36是深灰色。在0.00時,它是淺灰色的。但是0.48也是深灰色的。

問題: 是否可以更改顏色映射,使-0.36爲淺灰色,0.48爲深灰色?我的意思是,是否有可能從淺色到黑色顯示顏色條?

+0

這是一個衆所周知的原始圖像的色彩問題:也就是說,它沒有單調亮度(在你的情況下,'0'處的綠色比紅色或藍色亮極端..你可以看到它,所以不要責怪你的轉換器)。因此,不需要使用亮度進行轉換,您需要反轉原始顏色圖。或者,如果您可以從頭開始製作彩色圖像,並且不需要執行現有圖像,請選擇其他顏色圖,例如「hot」或cubehelix等。 – tom10 2014-10-07 02:39:19

+0

@ tom10:謝謝。我正在研究你的第一個答覆。我還會根據鏈接閱讀您的第二條評論,並在嘗試完成後回到此處。 – 2014-10-07 11:59:35

+0

主要問題是,你原來的色彩地圖是什麼?由於上述僅僅是一個演示,顏色地圖的細節是至關重要的(因爲有些是微不足道的,有些很難),從一開始就知道這一點很重要。 – tom10 2014-10-07 14:12:44

回答

2

我想這個問題可能是關於如何在matplotlib中使用灰度色彩地圖。如果是這樣,那很簡單。下面是使用不同的顏色表的例子(基於對運算圖像的代碼):

enter image description here

from numpy.random import uniform, seed 
from matplotlib.mlab import griddata 
import matplotlib.pyplot as plt 
import numpy as np 
# make up data. 
#npts = int(raw_input('enter # of random points to plot:')) 

def f(spi, the_colormap): 
    plt.subplot(spi) 
    seed(0) 
    npts = 200 
    x = uniform(-2, 2, npts) 
    y = uniform(-2, 2, npts) 
    z = x*np.exp(-x**2 - y**2) 
    xi = np.linspace(-2.1, 2.1, 100) 
    yi = np.linspace(-2.1, 2.1, 200) 
    zi = griddata(x, y, z, xi, yi, interp='linear') 

    CS = plt.contour(xi, yi, zi, 15, linewidths=0.5, colors='k') 
    CS = plt.contourf(xi, yi, zi, 15, cmap=the_colormap, 
         vmax=abs(zi).max(), vmin=-abs(zi).max()) 
    plt.colorbar() # draw colorbar 
    # plot data points. 
    plt.scatter(x, y, marker='o', c='b', s=5, zorder=10) 
    plt.xlim(-2, 2) 
    plt.ylim(-2, 2) 
    plt.title('griddata test (%d points)' % npts) 

f(131, plt.cm.rainbow) 
f(132, plt.cm.gray) 
f(133, plt.cm.hot) 

plt.show() 

如果一個人確實想轉換爲使用PIL(遠不太有利,但有時必要的任務)爲灰度,最好從具有單調亮度的色彩圖開始,如上面的hot,但不是rainbow。此外,在我建議使用cubehelix的評論中,但這不是matplotlib的標準,而是參見here。請參閱here瞭解可用matplotlib色彩映射的圖像。

+0

是的,這回答了這個問題。我會更新原始問題以反映更適當的措詞。基本上,就像您所說的那樣,不需要生成圖像並保存圖像,然後導入它只是爲了更改色彩圖。這應該都是直接從原始數據完成的。感謝您的耐心和答覆。這是我從網上搜索中發現很多問題的答案。 – 2014-10-08 14:23:54

+0

只是關於你的第三個副劇場的後續 - 你用「熱」作爲色彩地圖。我認爲,默認情況下,它選擇了紅色 - 是否可以將其設置爲其他顏色? – 2014-10-08 14:27:03

+0

我添加了一個鏈接,您可以看到所有包含的色彩地圖。如果它們很簡單(比如熱點),你也可以很容易地從頭開始構建自己的,如果你想這樣做,可以搜索linearsegmentedcolormap,但是其中包含的可能是現在的方法。 (但對於你的具體問題,afaik,你不能改變'熱'使用不同的顏色。) – tom10 2014-10-08 14:30:30