9 votes

Afficher une séquence d'images à l'aide de matplotlib

J'ai ce simple python script utilisant OpenCV pour charger des images depuis un dossier et les afficher dans une boucle. Je veux reproduire cet effet en utilisant matplotlib .

import cv2 as cv
import os

im_files = [for f in os.listdir('.') if f[-3:] == 'png']

for f in im_files:
    im = cv.imread(f, 0) #read image in greyscale
    cv.imshow('display', im)
    cv.waitKey(1)

cv.destroyAllWindows()

J'ai essayé le script suivant mais la fenêtre pyplot qui s'ouvre pour afficher les tracés devient peu réactive.

import pylab as pl
import os

files = [f for f in os.listdir('.') if f[-3:] == 'png']
pl.ion()
for f in files:
    im=pl.imread(f)
    pl.imshow(im)
    pl.draw()

J'ai beaucoup cherché sur Google mais je n'ai pas trouvé de solution. Comment dois-je m'y prendre ? J'utilise Anaconda 1.6 32 bits sous Windows 8.

25voto

tcaswell Points 21489
img = None
for f in files:
    im=pl.imread(f)
    if img is None:
        img = pl.imshow(im)
    else:
        img.set_data(im)
    pl.pause(.1)
    pl.draw()

4voto

Bily Points 498

J'ai implémenté un script pratique basé sur matplotlib qui répond à vos besoins et bien plus encore. Vérifiez-le aquí

Dans votre cas, l'extrait suivant devrait fonctionner :

import os
from scipy.misc import imread

img_files = [for f in os.listdir('.') if f[-3:] == 'png']

# redraw_fn draw frame f in a image sequence
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)

4voto

robertofbaycot Points 51

J'aime la méthode suivante, qui est très simple et qui permet de mettre à jour l'ensemble de la figure, y compris le titre, les étiquettes, etc.

import numpy as np
from matplotlib import pyplot as plt

for j in range(0,3):
    img = np.random.normal(size=(100,150))
    plt.figure(1); plt.clf()
    plt.imshow(img)
    plt.title('Number ' + str(j))
    plt.pause(3)

Une image aléatoire est formée.

plt.figure crée la figure la première fois si elle n'existe pas déjà, et ensuite fait de la figure 1 la figure courante.

plt.clf efface la figure pour que les mises à jour suivantes ne se superposent pas les unes aux autres. L'image est ensuite affichée avec un titre.

El plt.pause est la clé, car elle entraîne la mise à jour de l'affichage - y compris le titre, les étiquettes, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X