plt.imshow具有更快的刷新率

时间:2018-11-15 16:40:10

标签: python numpy matplotlib imshow

我想在进行numpy计算时显示一些图像:

import numpy as np
import matplotlib.pyplot as plt
plt.ion()  # Turn the interactive mode on.
for i in range(100):
    A = np.random.randn(10,10)
    plt.imshow(A)
    plt.pause(0.001)
    # do some other numpy computations here (they take < 1 ms)

速度不是很快显示图像,而是很慢

我并不是要求每秒100帧,但我认为可以达到30 fps,但事实并非如此:经过几次迭代,我在标准i5笔记本电脑(Windows 7 x64)上接近2 fps。

如何提高imshow的刷新速度?

注意:

  • 我已经尝试过Fast Live Plotting in Matplotlib / PyPlot的主要答案,但是对于这种简单的任务,这里似乎是一个复杂的方法(使用blit参数),而且不能达到28 fps,但只能达到15 fps

  • 我只想将矩阵显示为图像:没有边框,没有轴,没有子图等,我想这可以比解决方案Fast Live Plotting in Matplotlib / PyPlot更快,也许不是使用matplotlib而是使用另一个库?

enter image description here

2 个答案:

答案 0 :(得分:2)

这是因为您在每次迭代中都会创建一个新图像,最终在您的图形中生成100张图像。

创建动画的推荐方法是使用FuncAnimation并仅更改图像的数据,而不是一直绘制新图像。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

im = plt.imshow(np.random.randn(10,10))

def update(i):
    A = np.random.randn(10,10)
    im.set_array(A)
    return im, text

ani = FuncAnimation(plt.gcf(), update, frames=range(100), interval=5, blit=False)

plt.show()

即使interval设置为5毫秒,以上代码在我的计算机上也以50 fps的速度运行。它不会以最快的速度运行。您现在可以使用blitting,即blit=True,在这种情况下,我看到的是100 fps。这是matplotlib可以达到的极限,但是当然会因计算机的性能而异。

但是请注意,人脑无法分辨100 fps。有人说25是通常的帧速率,因此大多数电影也使用这种帧速率。因此,这里甚至不需要使用blitting,因为50 fps比您能看到的更大。

如果出于任何原因想要提高动画速度,则需要使用matplotlib以外的其他库。

例如参见


在已编辑的问题中,一个句子表示不应有边界。这是通过使图形尺寸服从图像的外观(正方形图像->正方形图形)并将所有边距设置为零来实现的

plt.figure(figsize=(5,5))
plt.subplots_adjust(0,0,1,1)

答案下方的评论坚持使用for循环。看起来像

im = plt.imshow(np.random.randn(10,10))

plt.ion()
for i in range(100):

    A = np.random.randn(10,10)
    im.set_array(A)
    plt.pause(0.005)

plt.ioff()
plt.show()

它会比使用FuncAnimation慢一点,因为动画发生在GUI事件循环之外。另请注意,如在Fast Live Plotting in Matplotlib / PyPlot

中看到的,在这种情况下实施blitting要做的工作更多。

答案 1 :(得分:0)

借助OpenCV,我找到了更快的解决方案。以下代码在我的计算机上运行2秒钟,即能够以500 fps的速度渲染(我知道人眼看不到它,但是很高兴知道这种方法非常快)

import numpy as np
import cv2

cv2.namedWindow('img', cv2.WINDOW_NORMAL)

for i in range(1000):
    A = np.random.randn(10,10)
    cv2.imshow("img", A)
    cv2.waitKey(1)  # it's needed, but no problem, it won't pause/wait