灰度的蟒蛇 - incorect颜色暗灰色变为浅灰色到深灰色

问题描述:

我策划这个图像的灰度版本: 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

我想这个问题可能是关于如何在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