灰度的蟒蛇 - 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,安装简单。有关图像的要求和
背景资料:
- 的图像来自于数据发现here。理想情况下,此图像的灰度 版本应直接从此原始数据生成 data.i.e.不要将它保存为彩色图像,然后尝试将 转换为灰度 - 而只是生成灰度版本的图。
- 我不知道对应于z值的颜色 - 这些颜色可以任意设置。
- 图像的颜色图也可以任意选择 - 没有偏好。它是 是值得关注的灰度版本。
我的问题与颜色栏中显示的配色方案有关。我需要显示颜色栏中颜色从浅灰(最低强度)到深灰(最高强度)的颜色方案。
运行上述代码后,会生成灰度图像。在灰度图像的颜色条中,强度等级-0.36是深灰色。在0.00时,它是浅灰色的。但是0.48也是深灰色的。
问题: 是否可以更改颜色映射,使-0.36为浅灰色,0.48为深灰色?我的意思是,是否有可能从浅色到黑色显示颜色条?
我想这个问题可能是关于如何在matplotlib中使用灰度色彩地图。如果是这样,那很简单。下面是使用不同的颜色表的例子(基于对运算图像的代码):
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色彩映射的图像。
是的,这回答了这个问题。我会更新原始问题以反映更适当的措词。基本上,就像您所说的那样,不需要生成图像并保存图像,然后导入它只是为了更改色彩图。这应该都是直接从原始数据完成的。感谢您的耐心和答复。这是我从网上搜索中发现很多问题的答案。 – 2014-10-08 14:23:54
只是关于你的第三个副剧场的后续 - 你用“热”作为色彩地图。我认为,默认情况下,它选择了红色 - 是否可以将其设置为其他颜色? – 2014-10-08 14:27:03
我添加了一个链接,您可以看到所有包含的色彩地图。如果它们很简单(比如热点),你也可以很容易地从头开始构建自己的,如果你想这样做,可以搜索linearsegmentedcolormap,但是其中包含的可能是现在的方法。 (但对于你的具体问题,afaik,你不能改变'热'使用不同的颜色。) – tom10 2014-10-08 14:30:30
这是一个众所周知的原始图像的色彩问题:也就是说,它没有单调亮度(在你的情况下,'0'处的绿色比红色或蓝色亮极端..你可以看到它,所以不要责怪你的转换器)。因此,不需要使用亮度进行转换,您需要反转原始颜色图。或者,如果您可以从头开始制作彩色图像,并且不需要执行现有图像,请选择其他颜色图,例如“hot”或cubehelix等。 – tom10 2014-10-07 02:39:19
@ tom10:谢谢。我正在研究你的第一个答复。我还会根据链接阅读您的第二条评论,并在尝试完成后回到此处。 – 2014-10-07 11:59:35
主要问题是,你原来的色彩地图是什么?由于上述仅仅是一个演示,颜色地图的细节是至关重要的(因为有些是微不足道的,有些很难),从一开始就知道这一点很重要。 – tom10 2014-10-07 14:12:44