使用matplotlib显示图像序列

时间:2013-07-26 18:33:41

标签: python opencv matplotlib

我有这个简单的python脚本,使用OpenCV从文件夹加载图像并在循环中显示它们。我想使用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()

我尝试了以下脚本,但打开以显示图表的pyplot窗口变得无法响应。

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()

我搜索了很多但找不到任何解决方案。我该怎么做呢?我在Windows 8上使用Anaconda 1.6 32bit。

3 个答案:

答案 0 :(得分:22)

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()

答案 1 :(得分:4)

我已经实现了一个基于matplotlib的方便脚本,它非常适合您的需求。检查here

在您的情况下,以下代码段应该有效:

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)

答案 2 :(得分:1)

我喜欢以下这样做的方式,它非常简单,可以更新整个图形,包括标题,标签等,而不仅仅是图像。

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)

形成随机图像。

plt.figure如果尚未存在,则第一次创建数字,然后将图1作为当前数字。

plt.clf清除数字,以便后续更新不会相互叠加。然后,图像以标题显示。

plt.pause语句是关键,因为这会导致显示更新 - 包括标题,标签等。