使用matplotlib Python绘制图像序列

4
我正在Python中实现kmeans聚类算法。我希望在每次迭代时绘制集群质量的状态(图像)。基本上,我有一个循环,在每次迭代时绘制一张图像,我想要动画化这个过程。我不知道我是否表达清楚了。目前我只是使用show()命令绘制图像,但然后我必须关闭它才能继续迭代。
那么,有没有一些方法可以动态显示每个步骤计算出的图像序列?
4个回答

4
我尝试使用ion()方法,对于小量数据效果很好,但是如果您有大量图像或者图像流速度比较快,这个方法会非常缓慢。据我所知,ion()每次更改图形(包括轴和标签等)时都会重新绘制所有内容,这可能不是您想要的。

这个线程展示了更好的做法。

这里有一个我制作的简单示例展示如何实现:

import time
import numpy
import matplotlib.pyplot as plt


fig = plt.figure( 1 )
ax = fig.add_subplot( 111 )
ax.set_title("My Title")

im = ax.imshow( numpy.zeros( ( 256, 256, 3 ) ) ) # Blank starting image
fig.show()
im.axes.figure.canvas.draw()

tstart = time.time()
for a in xrange( 100 ):
  data = numpy.random.random( ( 256, 256, 3 ) ) # Random image to display
  ax.set_title( str( a ) )
  im.set_data( data )
  im.axes.figure.canvas.draw()

print ( 'FPS:', 100 / ( time.time() - tstart ) )

使用上述代码,我的机器可以达到约30帧每秒的速度。当我使用plt.ion()ax.imshow(data)代替im.axes.figure.canvas.draw()im.set_data(data)运行相同的内容时,我只能获得大约1帧每秒的速度。


2

使用pause()函数。对于存储在video[t, x, y]中的一组图像,这会生成一个简单的动画:

import matplotlib.pyplot as plt
for i in range(video.shape[0]):
    plt.imshow(video[i,:,:])
    plt.pause(0.5)

这只显示了循环中的最后一张图片。 - mcExchange
1
现在它可以工作了!我不得不添加%matplotlib qt,以便将Python绘图显示在外部窗口中。此答案也令人耳目一新地简洁。 - mcExchange

0

只需启用交互模式:

ion()
show()

它会起作用的。这有点奇怪。但请记住:在 Python 脚本的末尾,它将关闭窗口。您必须调用

ion()
show()

在脚本的结尾,如果你不想让窗口关闭。

0

我已经实现了一个图像序列可视化工具,可能会很有帮助。你可以在这里试用一下。

下面是一个绘制动态正弦波的示例。

import numpy as np

def redraw_fn(f, axes):
    amp = float(f) / 3000
    f0 = 3
    t = np.arange(0.0, 1.0, 0.001)
    s = amp * np.sin(2 * np.pi * f0 * t)
    if not redraw_fn.initialized:
        redraw_fn.l, = axes.plot(t, s, lw=2, color='red')
        redraw_fn.initialized = True
    else:
        redraw_fn.l.set_ydata(s)

redraw_fn.initialized = False

num_time_steps = 100
videofig(num_time_steps, redraw_fn)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接