仅显示一个更新图像 window
Show an updating image in just one window
我想在每秒更新多次的 window 中显示 jpg。
我编写了一个非常非常紧凑的程序,只有 100 行代码(一个创建图像的神经网络)并且不想再添加 100 行代码来显示图像。
有什么办法可以解决这个问题吗?
非常感谢,jj
正如评论中所述,IO 不是问题,我们将直接使用 matplotlib
中使用的可用标准图像绘图工具,因为它是 [=32] 的事实上的标准绘图库=].虽然不知道源自神经网络的典型图像的尺寸,但可以快速比较调用 e.g. 所需的平均时间。 imshow
、pcolormesh
和 matshow
对于不同的图像尺寸不会造成伤害(pcolor 明显较慢,因此被省略)。
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()
所以,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()
在此示例中,神经网络将从更新函数中调用。 time.sleep
可以模拟繁重计算工作下的更新行为。如果您的应用程序是多线程的,plt.pause
可能会派上用场,让其他线程有时间完成他们的工作。 interval=0
基本上是让剧情更新尽可能频繁。
我希望这能为您指明大致方向并对您有所帮助。如果您不想使用动画,canvas 清除 and/or blitting 需要手动处理。
我想在每秒更新多次的 window 中显示 jpg。 我编写了一个非常非常紧凑的程序,只有 100 行代码(一个创建图像的神经网络)并且不想再添加 100 行代码来显示图像。 有什么办法可以解决这个问题吗?
非常感谢,jj
正如评论中所述,IO 不是问题,我们将直接使用 matplotlib
中使用的可用标准图像绘图工具,因为它是 [=32] 的事实上的标准绘图库=].虽然不知道源自神经网络的典型图像的尺寸,但可以快速比较调用 e.g. 所需的平均时间。 imshow
、pcolormesh
和 matshow
对于不同的图像尺寸不会造成伤害(pcolor 明显较慢,因此被省略)。
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()
所以,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()
在此示例中,神经网络将从更新函数中调用。 time.sleep
可以模拟繁重计算工作下的更新行为。如果您的应用程序是多线程的,plt.pause
可能会派上用场,让其他线程有时间完成他们的工作。 interval=0
基本上是让剧情更新尽可能频繁。
我希望这能为您指明大致方向并对您有所帮助。如果您不想使用动画,canvas 清除 and/or blitting 需要手动处理。