2011-05-16 150 views
17

我有一些顏色情節,我需要保存在灰度。有沒有簡單的方法來做到這一點,而不改變繪圖格式?保存matplotlib陰謀灰度

+4

圍繞這個問題進行了一些討論,請參閱[將顏色轉換爲BW /灰度](http://old.nabble.com /convert-figure-from-color-to-BW-grayscale-td29756144.html)。不知道在最新版本的matplotlib中'set_gray'屬性是否可用。 – chl 2011-05-16 18:29:43

+0

之後你可以使用imagemagick:'convert -type Grayscale old.png new.png'我認爲已經有一些關於SO cf的東西[link](http://stackoverflow.com/questions/3823752/display-image-as-灰度使用matplotlib) – 2011-05-17 20:53:27

回答

4

其實這是之前詢問過的。這是一個相當不錯的答案,這對谷歌自帶2日(今天的):
Display image as grayscale using matplotlib

而且該解決方案非常相似,蘇基的...

哦,我無聊,所以我張貼在這裏也是一個完全成熟的代碼:

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格式。

+1

這個答案不是很好,因爲它需要柵格化繪圖和任何字體。光柵化轉換爲.png時發生。最好將pdf寫入文件系統,然後將其轉換爲灰度,也許使用ghostscript。 「導入圖像」 – 2015-04-25 05:10:56

+0

不再有效。而是使用「從PIL導入圖像」 – warunapww 2017-09-08 21:28:27

6

目前很難直接從matplotlib做到,但是在「將來」他們打算支持set_gray(True)對該圖的調用(請參閱郵件列表線程here)。

你最好的選擇將是其保存在顏色,並將其轉換,無論是在與PIL蟒蛇:

import Image 
Image.open('color.png').convert('L').save('bw.png') 

或者在命令行中使用ImageMagick的:

convert -type Grayscale color.png bw.png 
+0

像其他答案一樣,這個答案不是很令人滿意,因爲它柵格化的情節。 – 2015-04-25 05:11:58

0

,並增加Mu 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() 
+0

像其他答案一樣,這個答案不太令人滿意,因爲它柵格化了情節。 – 2015-04-25 05:12:20

1

我也在爲這個問題苦苦掙扎。據我所知,matplotlib不支持直接轉換爲灰度,但您可以保存一個顏色pdf,然後用ghostscript將其轉換爲灰度:

gs -sOutputFile = gray.pdf -sDEVICE = pdfwrite -sColorConversionStrategy = Gray -dProcessColorModel =/DeviceGray -dNOPAUSE -dBATCH -dAutoRotatePages =/None color.pdf

+0

爲什麼不只是使用灰度樣式表? http://matplotlib.org/examples/style_sheets/plot_grayscale.html – 2015-04-25 05:16:01

+0

這實際上並沒有將彩色圖轉換爲灰度。它只是使一些元素灰色默認。我繪製了我想要導出爲網頁的兩種顏色並轉換爲灰色進行打印的情況。 – 2015-04-25 05:48:20

+0

您可以使用上下文管理器中的樣式表。用這些函數將你的調用封裝到非數據處理繪圖功能中。 – 2015-04-25 05:58:08