使用matplotlib显示图像序列

Yas*_*ash 7 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()
Run Code Online (Sandbox Code Playgroud)

我尝试了以下脚本,但打开以显示图表的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()
Run Code Online (Sandbox Code Playgroud)

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

tac*_*ell 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()
Run Code Online (Sandbox Code Playgroud)


小智 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)
Run Code Online (Sandbox Code Playgroud)

形成随机图像。

plt.figure如果图形尚不存在,则在第一轮创建该图形,然后将图形 1 设为当前图形。

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

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


Bil*_*ily 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)
Run Code Online (Sandbox Code Playgroud)