我有一些颜色图需要以灰度保存。有没有改变绘图格式的简单方法呢?
答案 0 :(得分:6)
目前直接从matplotlib做起来很尴尬,但在“未来”他们计划在图上支持set_gray(True)
调用(参见邮件列表线程here)。
您最好的选择是将其保存为彩色并将其转换为python with PIL:
import Image
Image.open('color.png').convert('L').save('bw.png')
或使用imagemagick命令行:
convert -type Grayscale color.png bw.png
答案 1 :(得分:5)
实际上,之前有人问过。这是一个非常好的答案,谷歌排名第二(截至今天):
Display image as grayscale using matplotlib
解决方案非常类似于Suki的......
哦,好吧,我很无聊,所以我在这里发布了一个完整的代码:
import numpy as np
import pylab as p
xv=np.ones(4)*.5
yv=np.arange(0,4,1)
xv1=np.ones(4)*-.5
yv1=np.arange(0,4,1)
#red vertical line on the right
yv2=np.arange(0,1.5,0.1)
xv2=np.ones_like(yv2)*.7
#red vertical line on the left
yv3=np.arange(0,2,0.01)
xv3=np.ones_like(yv3)*-0.7
###
xc=np.arange(-1.4,2,0.05)
yc=np.ones_like(xc)*1
fig = p.figure()
ax1 = fig.add_subplot(111)
#adjustprops = dict(left=0.12, bottom=0.2, right=0.965, top=0.96, wspace=0.13, hspace=0.37)
#fig.subplots_adjust(**adjustprops)
ax1.plot(xv,yv, color='blue', lw=1, linestyle='dashed')
ax1.plot(xv1,yv1, 'green', linestyle='dashed')
ax1.plot(np.r_[-1:1:0.2],np.r_[-1:1:0.2],'red')
ax1.plot(xc,yc, 'k.', markersize=3)
p.savefig('colored_image.png')
import matplotlib.image as mpimg
import matplotlib.cm as cm
import Image
figprops = dict(figsize=(10,10), dpi=100)
fig1 = p.figure(**figprops)
#fig1 = p.figure()
#ax1 = fig.add_subplot(111)
adjustprops = dict()
image=Image.open('colored_image.png').convert("L")
arr=np.asarray(image)
p.figimage(arr,cmap=cm.Greys_r)
p.savefig('grayed.png')
p.savefig('grayed.pdf',papertype='a4',orientation='portrait')
这将生成一个彩色图形,而不是读取它,将其转换为灰度,并将保存png和pdf。
答案 2 :(得分:2)
我也在努力解决这个问题。据我所知,matplotlib不支持直接转换为灰度,但您可以保存颜色pdf,然后使用ghostscript将其转换为灰度:
gs -sOutputFile=gray.pdf -sDEVICE=pdfwrite -sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray -dNOPAUSE -dBATCH -dAutoRotatePages=/None color.pdf
答案 3 :(得分:1)
有一个简单的解决方案:
plt.imsave(filename, image, cmap='gray')
答案 4 :(得分:0)
并添加到My Mind的解决方案
如果由于某种原因你想避免将其写入文件,你可以像文件一样使用StringIO:
import Image
import pylab
from StringIO import StringIO
pylab.plot(range(10),[x**2 for x in range(10)])
IO = StringIO()
pylab.savefig(IO,format='png')
IO.seek(0)
#this, I stole from Mu Mind solution
Image.open(IO).convert('L').show()