首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python matplotlib imshow很慢

Python matplotlib imshow很慢
EN

Stack Overflow用户
提问于 2011-02-20 18:51:43
回答 3查看 17.1K关注 0票数 5

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

  • 第一个问题:对于这样的图像,2秒是一个很好的表现,还是我可以加速。
  • 第二个问题:如果这是一个好的性能,我如何通过降低分辨率使这个过程更快。重要一点:我仍然希望图像在1600x1200像素上散落到底。

我的代码:

代码语言:javascript
复制
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

我还使用了以下代码:

代码语言:javascript
复制
img = matplotlib.pyplot.imread(pngfile)
img *= 255
img2 = img.astype(numpy.uint8)
im  = self.plotwindow.imshow(img2,cmap=matplotlib.cm.gray, origin='centre')

不过,显示图像需要大约2秒.还有其他想法吗?

只是想补充一下:我找到了以下特性

轴轴

因此,在原则上matplotlib应该能够完成任务。在那里人们也可以用“放大”的方式来绘制一幅画.

EN

回答 3

Stack Overflow用户

发布于 2011-02-20 19:05:24

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

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

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

代码语言:javascript
复制
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)

票数 5
EN

Stack Overflow用户

发布于 2016-11-22 10:24:35

可以通过将以下行添加到matplotlibrc文件(通常在~/..matplotlib/matplotlibrc)中禁用imshow的默认内插:

image.interpolation :无

其结果是更快的渲染和清晰的图像。

票数 2
EN

Stack Overflow用户

发布于 2011-02-22 01:28:13

我找到了一个解决方案,只要一个人只需要显示低分辨率的图像。我们可以使用行来实现这一点。

代码语言:javascript
复制
im  = matplotlib.pyplot.imshow(img,cmap=matplotlib.cm.gray, origin='centre',extent=(0,1600,0,1200))

其中,区段参数告诉matplotlib在此范围内绘制图形。如果使用分辨率较低的图像,这将大大加快处理速度。尽管如此,如果有人知道更多的技巧,使这个过程更快,以便以同样的速度使用更高的分辨率,那就太好了。

感谢每一个思考我的问题的人,更多的评论是非常感谢的!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5059175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档