Python Matplotlib imshow速度很慢

r6d*_*6d9 4 python matplotlib

我想使用imshow显示图像文件。这是一个1600x1200的灰度图像,我发现matplotlib使用float32来解码这些值。加载图像大约需要2秒钟,我想知道是否有任何方法可以使其更快。关键是我真的不需要高分辨率的图像,我只想标记某些点并将图像绘制为背景。所以,

  • 第一个问题:2秒钟对于这样的图像是否有良好的表现,还是我可以加快速度?
  • 第二个问题:如果性能良好,如何通过降低分辨率来加快过程。要点:我仍然希望图像最终拉伸到1600x1200像素以上。

我的代码:

import matplotlib
import numpy

plotfig     = matplotlib.pyplot.figure()
plotwindow  = plotfig.add_subplot(111)
plotwindow.axis([0,1600,0,1200])
plotwindow.invert_yaxis() 
img = matplotlib.pyplot.imread("lowres.png")
im  = matplotlib.pyplot.imshow(img,cmap=matplotlib.cm.gray,origin='centre')
plotfig.set_figwidth(200.0)
plotfig.canvas.draw()
matplotlib.pyplot.show()
Run Code Online (Sandbox Code Playgroud)

这就是我要做的。现在,如果保存在lowres.png中的图片的分辨率较低,为1600x1200(即400x300),则该图片应显示在右上角。如何将其缩放到1600x1200像素的整体?如果我运行此程序,最慢的部分来自下面的canvas.draw()命令。有没有办法加快此命令?

先感谢您!

根据您的建议,我已更新到最新版本的matplotlib

版本1.1.0svn,结帐8988

而且我还使用以下代码:

img = matplotlib.pyplot.imread(pngfile)
img *= 255
img2 = img.astype(numpy.uint8)
im  = self.plotwindow.imshow(img2,cmap=matplotlib.cm.gray, origin='centre')
Run Code Online (Sandbox Code Playgroud)

仍然需要大约2秒钟才能显示图像...还有其他想法吗?

补充一下:我发现了以下功能

zoomed_inset_axes

因此,原则上matplotlib应该能够完成任务。那里也可以以“缩放”方式绘制图片。

unu*_*tbu 5

数据的大小与最终图像的像素大小无关。

由于您说的是不需要高分辨率的图像,因此可以通过对数据进行下采样来更快地生成图像。如果您的数据为numpy数组形式,则一种快速而肮脏的方法是使用来获取每一nth列和每一行data[::n,::n]

您可以控制输出图像的像素尺寸与fig.set_size_inchesplt.savefigdpi参数:

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np

data=np.arange(300).reshape((10,30))
plt.imshow(data[::2,::2],cmap=cm.Greys)

fig=plt.gcf()
# Unfortunately, had to find these numbers through trial and error
fig.set_size_inches(5.163,3.75)  
ax=plt.gca()
extent=ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())

plt.savefig('/tmp/test.png', dpi=400,
            bbox_inches=extent)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明