Solución:
No necesitas llamar imshow
todo el tiempo. Es mucho más rápido usar el objeto set_data
método:
myobj = imshow(first_image)
for pixel in pixels:
addpixel(pixel)
myobj.set_data(segmentedimg)
draw()
los draw()
debe asegurarse de que el backend actualice la imagen.
ACTUALIZAR: su pregunta se modificó significativamente. En tales casos, es mejor hacer otra pregunta. Aquí hay una forma de abordar su segunda pregunta:
La animación de Matplotlib solo se ocupa de una dimensión creciente (tiempo), por lo que su ciclo doble no funcionará. Necesita convertir sus índices a un solo índice. Aquí hay un ejemplo:
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
nx = 150
ny = 50
fig = plt.figure()
data = np.zeros((nx, ny))
im = plt.imshow(data, cmap='gist_gray_r', vmin=0, vmax=1)
def init():
im.set_data(np.zeros((nx, ny)))
def animate(i):
xi = i // ny
yi = i % ny
data[xi, yi] = 1
im.set_data(data)
return im
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=nx * ny,
interval=50)
Si está utilizando Jupyter, tal vez esta respuesta le interese. Leí en este sitio que la función incorporada de clear_output
puede hacer el truco:
%matplotlib inline
from matplotlib import pyplot as plt
from IPython.display import clear_output
plt.figure()
for i in range(len(list_of_frames)):
plt.imshow(list_of_frames[i])
plt.title('Frame %d' % i)
plt.show()
clear_output(wait=True)
Es cierto que este método es bastante lento, pero se puede utilizar con fines de prueba.
Implementé un práctico script que se adapta a sus necesidades. Pruébalo aquí
Un ejemplo que muestra imágenes en un directorio personalizado es el siguiente:
import os
import glob
from scipy.misc import imread
img_dir="YOUR-IMAGE-DIRECTORY"
img_files = glob.glob(os.path.join(video_dir, '*.jpg'))
def redraw_fn(f, axes):
img_file = img_files[f]
img = imread(img_file)
if not redraw_fn.initialized:
redraw_fn.im = axes.imshow(img, animated=True)
redraw_fn.initialized = True
else:
redraw_fn.im.set_array(img)
redraw_fn.initialized = False
videofig(len(img_files), redraw_fn, play_fps=30)