使用Matplotlib显示图像序列

11

我有一个简单的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 32位。


https://dev59.com/-WvXa4cB1Zd3GeqPImSo - tacaswell
https://dev59.com/NmQm5IYBdhLWcg3w8iyD - tacaswell
https://dev59.com/ZGMm5IYBdhLWcg3wIsbj#17837600 - tacaswell
可能是[为什么我的pylab动画每次更新都变慢?]的重复问题(https://dev59.com/wGkv5IYBdhLWcg3w6k1Q) - tacaswell
@tcaswell,感谢您提供这些链接。这正是我在寻找的。 - Yash
3个回答

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

6
我喜欢以下这种做法,非常直接简单,可以更新整个图形,包括标题、标签等,而不仅仅是图像。
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 语句是关键,因为它导致显示被更新 - 包括标题、标签等。


1
plt.pause() 是关键。 - Sridhar Thiagarajan

5

我已经基于matplotlib实现了一个方便的脚本,它完全适合您的需求并且更加强大。请在此处查看

对于您的情况,以下代码片段应该能够正常工作:

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)

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