我有一些彩色图,我需要保存在灰度。有没有一种简单的方法来做到这一点,而不改变绘图格式?
ckx4rj1h1#
有一个简单的解决方案:
plt.imsave(filename, image, cmap='gray')
字符串
x7rlezfr2#
目前直接从matplotlib中实现还不太方便,但在“未来”,他们计划在图中支持set_gray(True)调用(请参阅邮件列表线程here)。您最好的选择是将其保存为颜色并转换它,或者在python中使用PIL:
set_gray(True)
import Image Image.open('color.png').convert('L').save('bw.png')
字符串或从命令行使用imagemagick:
convert -type Grayscale color.png bw.png
型
u4vypkhs3#
事实上,这是以前问过的。这里有一个很好的答案,在谷歌上排名第二(截至今天):使用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。
bgibtngc4#
我也在这个问题上挣扎。据我所知,matplotlib不支持直接转换为灰度,但你可以保存一个彩色pdf,然后用ghostscript将其转换为灰度:
gs -sOutputFile=gray.pdf -sDEVICE=pdfwrite -sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray -dNOPAUSE -dBATCH -dAutoRotatePages=/None color.pdf
anhgbhbe5#
并加入穆明德的解决方案如果出于某种原因,你不想把它写到文件中,你可以像文件一样使用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()
up9lanfz6#
根据Ian Goodfellow的答案开发的,这里是一个python脚本,它生成并运行一个ghostscript命令,将PDF转换为灰度。它比栅格化为PNG的答案更可取,因为它保留了图的矢量表示。
import subprocess import sys def pdf_to_grayscale(input_pdf, output_pdf): try: # Ghostscript command to convert PDF to grayscale ghostscript_cmd = [ "gs", "-sDEVICE=pdfwrite", "-sColorConversionStrategy=Gray", "-sProcessColorModel=DeviceGray", "-dCompatibilityLevel=1.4", "-dNOPAUSE", "-dQUIET", "-dBATCH", f"-sOutputFile={output_pdf}", input_pdf ] # Execute Ghostscript command using subprocess subprocess.run(ghostscript_cmd, check=True) print("PDF converted to grayscale successfully.") except subprocess.CalledProcessError: print("Error occurred during PDF conversion to grayscale.") if __name__ == "__main__": assert len(sys.argv) == 3, "Two args: input pdf and output pdf" pdf_to_grayscale(sys.argv[1], sys.argv[2])
字符串将其保存为_gray.py,并像这样运行它:
python to_gray.py test.pdf gray.pdf
6条答案
按热度按时间ckx4rj1h1#
有一个简单的解决方案:
字符串
x7rlezfr2#
目前直接从matplotlib中实现还不太方便,但在“未来”,他们计划在图中支持
set_gray(True)
调用(请参阅邮件列表线程here)。您最好的选择是将其保存为颜色并转换它,或者在python中使用PIL:
字符串
或从命令行使用imagemagick:
型
u4vypkhs3#
事实上,这是以前问过的。这里有一个很好的答案,在谷歌上排名第二(截至今天):
使用matplotlib将图像显示为灰度
这个问题的答案和苏琪的答案很相似……
好吧,我很无聊,所以我在这里也发布了一个完整的代码:
字符串
这将产生一个彩色图形,然后读取它,将其转换为灰度,并将保存一个PNG和PDF。
bgibtngc4#
我也在这个问题上挣扎。据我所知,matplotlib不支持直接转换为灰度,但你可以保存一个彩色pdf,然后用ghostscript将其转换为灰度:
字符串
anhgbhbe5#
并加入穆明德的解决方案
如果出于某种原因,你不想把它写到文件中,你可以像文件一样使用StringIO:
字符串
up9lanfz6#
根据Ian Goodfellow的答案开发的,这里是一个python脚本,它生成并运行一个ghostscript命令,将PDF转换为灰度。它比栅格化为PNG的答案更可取,因为它保留了图的矢量表示。
字符串
将其保存为_gray.py,并像这样运行它:
型