Python matplotlib imshow很慢

时间:2011-02-20 18:51:43

标签: 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()

这就是我想要做的。现在,如果保存在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')

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

只是添加:我找到了以下功能

zoomed_inset_axes

因此原则上matplotlib应该能够完成任务。还可以用“缩放”方式绘制图片......

3 个答案:

答案 0 :(得分:5)

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

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

您可以使用fig.set_size_inchesplt.savefig的{​​{1}}参数控制输出图像的像素尺寸:

dpi

enter image description here

答案 1 :(得分:1)

只要只需要显示低分辨率图像,我就找到了解决方案。可以使用

行来完成
im  = matplotlib.pyplot.imshow(img,cmap=matplotlib.cm.gray, origin='centre',extent=(0,1600,0,1200))

其中,extent-parameter告诉matplotlib绘制该范围内的数字。如果使用分辨率较低的图像,则会大大加快处理速度。然而,如果有人知道更多的技巧可以让这个过程更快,以便以更快的速度使用更高的分辨率,那将会很棒。

感谢所有想到我的问题的人,感谢进一步的评论!

答案 2 :(得分:0)

您可以通过在matplotlibrc文件中添加以下行来禁用imshow的默认插值(通常位于〜/ .matplotlib / matplotlibrc):

  

image.interpolation:none

结果是渲染速度更快,图像更清晰。