仅在一个窗口中显示更新图像

5 python updating window image neural-network

我想在每秒更新多次的窗口中显示 jpg。我编写了一个非常非常紧凑的程序,只有 100 行代码(创建图像的神经网络),并且不想再添加 100 行代码来仅显示图像。我能做些什么来解决这个问题吗?

非常感谢,jj

mme*_*ing 5

正如评论中所说,IO 不是问题,我们将直接使用 中使用的可用标准图像绘图工具matplotlib,因为它是 python 事实上的标准绘图库。虽然不知道源自神经网络的典型图像的尺寸,但快速比较调用 例如和imshow对于不同图像尺寸所需的平均时间不会有什么坏处(pcolor 明显慢一些,因此被省略)。pcolormeshmatshow

import matplotlib.pyplot as plt
import numpy as np
import timeit

n = 13
repeats = 20
timetable = np.zeros((4, n-1))
labellist = ['imshow', 'matshow', 'pcolormesh']

for i in range(1, n):
    image = np.random.rand(2**i, 2**i)
    print('image size:', 2**i)
    timetable[0, i - 1] = 2**i

    timetable[1, i - 1] = timeit.timeit("plt.imshow(image)", setup="from __main__ import plt, image", number=repeats)/repeats
    plt.close('all')
    timetable[2, i - 1] = timeit.timeit("plt.matshow(image)", setup="from __main__ import plt, image", number=repeats)/repeats
    plt.close('all')
    timetable[3, i - 1] = timeit.timeit("plt.pcolormesh(image)", setup="from __main__ import plt, image", number=repeats)/repeats
    plt.close('all')

for i in range(1, 4):
    plt.semilogy(timetable[0, :], timetable[i, :], label=labellist[i - 1])
    plt.legend()
    plt.xlabel('image size')
    plt.ylabel('avg. exec. time [s]')
    plt.ylim(1e-3, 1)

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

所以,imshow确实如此。在 matplotlib 中更新或动画绘图的一种优雅方式是它提供的动画框架。这样一来,人们就不必像所要求的那样费心处理许多行代码。这是一个简单的例子:

import matplotlib.pyplot as plt
import numpy as np
import time
from matplotlib import animation

data = np.random.rand(128, 128)

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

im = ax.imshow(data, animated=True)

def update_image(i):
    data = np.random.rand(128, 128)
    im.set_array(data)
    # time.sleep(.5)
    # plt.pause(0.5)
ani = animation.FuncAnimation(fig, update_image, interval=0)

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此示例中,神经网络将从更新函数中调用。繁重计算工作下的更新行为可以通过 进行模拟time.sleep。如果您的应用程序是多线程的,plt.pause则可能会派上用场,让其他线程有时间完成其工作。interval=0基本上使情节尽可能频繁地更新。

我希望这能为您指明总体方向并有所帮助。如果您不想使用动画,则需要手动处理画布清除和/或位块传送。