我正在研究一些计算机视觉算法,我想展示 numpy 数组在每个步骤中如何变化。
现在有效的是,如果我有一个简单的imshow( array )
在我的代码末尾,窗口显示并显示最终图像。
然而,我想做的是随着图像在每次迭代中的变化而更新并显示 imshow 窗口。
例如我想做:
import numpy as np
import matplotlib.pyplot as plt
import time
array = np.zeros( (100, 100), np.uint8 )
for i in xrange( 0, 100 ):
for j in xrange( 0, 50 ):
array[j, i] = 1
#_show_updated_window_briefly_
plt.imshow( array )
time.sleep(0.1)
问题是,这样,只有在整个计算完成后,Matplotlib 窗口才被激活。
我尝试过原生 matplotlib 和 pyplot,但结果是相同的。对于绘图命令我找到了.ion()
切换,但这里似乎不起作用。
Q1.连续显示 numpy 数组(实际上是 uint8 灰度图像)更新的最佳方法是什么?
Q2。是否可以使用动画功能来做到这一点,就像在动态图像示例?我想在循环内调用一个函数,因此我不知道如何使用动画函数来实现这一点。
你不需要打电话imshow
每时每刻。使用对象的速度要快得多set_data
method:
myobj = imshow(first_image)
for pixel in pixels:
addpixel(pixel)
myobj.set_data(segmentedimg)
draw()
The draw()
应确保后端更新图像。
UPDATE:你的问题已被重大修改。在这种情况下,最好问另一个问题。下面是解决第二个问题的方法:
Matplotlib 的动画仅处理一个增加的维度(时间),因此您的双循环不起作用。您需要将索引转换为单个索引。这是一个例子:
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
nx = 150
ny = 50
fig = plt.figure()
data = np.zeros((nx, ny))
im = plt.imshow(data, cmap='gist_gray_r', vmin=0, vmax=1)
def init():
im.set_data(np.zeros((nx, ny)))
def animate(i):
xi = i // ny
yi = i % ny
data[xi, yi] = 1
im.set_data(data)
return im
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=nx * ny,
interval=50)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)