Постройте последовательность изображений с помощью matplotlib Python - PullRequest
4 голосов
/ 26 марта 2012

Я реализую алгоритм кластеризации kmeans в Python.Я хотел бы построить на каждой итерации статус (изображение) качества кластеров.Итак, в основном у меня есть цикл, который строит на каждой итерации изображение, и я хочу анимировать это.Я не знаю, дал ли я это понять.В данный момент я просто использую команду show (), которая строит изображение, но затем мне нужно закрыть его, чтобы продолжить итерацию.

Итак, есть ли способ анимировать последовательность изображений, вычисленных на каждомшаг?

Ответы [ 4 ]

4 голосов
/ 12 июня 2013

Я попробовал метод 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 FPS на моей машине с кодом выше. Когда я запускаю ту же самую вещь с plt.ion() и ax.imshow( data ) вместо im.axes.figure.canvas.draw() и im.set_data( data ), я получаю около 1 FPS

1 голос
/ 25 ноября 2015

Используйте 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)
0 голосов
/ 10 мая 2017

Я реализовал утилиту визуализации последовательности изображений, которая может оказаться полезной.Попробуйте здесь

Ниже приведен пример, который рисует динамическую синусоидальную волну.

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)
0 голосов
/ 26 марта 2012

Просто включите интерактивный режим:

ion()
show()

И это будет работать. Это немного странно. Но помните: в конце скрипта на python он закроет окна. Вы должны позвонить

ion()
show()

в конце скрипта, если вы не хотите закрывать окна.

...