当前位置: 首页 > 面试题库 >

如何交互更新matplotlib的imshow()窗口?

单于正业
2023-03-14
问题内容

我正在研究一些计算机视觉算法,我想展示一个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方法要快得多:

myobj = imshow(first_image)
for pixel in pixels:
    addpixel(pixel)
    myobj.set_data(segmentedimg)
    draw()

draw()应确保后端更新图像。

更新: 您的问题已被重大修改。在这种情况下,最好再问一个问题。这是解决第二个问题的方法:

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)


 类似资料:
  • 我的当前程序将向用户输出图像,并根据用户输入,根据需要重新调整图像。 长话短说,我试图在图像文件中找到圆形对象。我将使用Hough圆变换。然而,因为我在图像中的许多圆不是“完美圆”,所以我正在做一个“猜测”圆半径的算法。但是,我希望允许用户根据需要重新调整半径。 有没有办法要求用户输入,然后根据用户输入,重新调整imshow()中的窗口?现在,imshow()拒绝显示实际的窗口,直到我使用cv2.

  • 我试图更新数据在matplotlib imshow窗口内的Tkinter gui,我的代码示例如下: 如您所见,我使用imshow()加载图像,然后尝试使用set_data()更新图像的数据,然后希望使用root.update()更新gui的根窗口。执行时,打印“旋转按钮按下......”行被执行,但其余行似乎没有执行。我需要如何将图像句柄传递给旋转函数,还是返回旋转的图像?

  • 问题内容: 我正在使用IPython,有时想快速切换到交互式,可缩放的matplotlib GUI来查看图(在终端Python控制台中绘制图时会弹出的图)。我该怎么办?最好不要离开或重新启动笔记本。 IPy笔记本中的嵌入式绘图的问题在于它们的分辨率有限,我无法放大以查看一些较小的部分。使用从终端启动的maptlotlibGUI,我可以选择要放大的图形矩形,并相应地调整轴。我尝试过 和 但这什么也没

  • 问题内容: 我想知道是否有人想知道为什么在按下GUI上的按钮后,下面的代码为什么不显示带有线的图形。我想创建一个程序,该程序在通过单击按钮导入一组数据后执行一长串命令。这些命令之一将是在同一窗口内的图形上显示光谱数据。这是我到目前为止的内容: 问题答案: 那是因为xaxis和yaxis的范围不会更改为新数据的范围,因此请更改您的refreshFigure,如下所示:

  • 问题内容: 我想绘制概率图,但是imshow会为概率为零的点生成模糊值。如何摆脱围绕真实网格点的模糊外围? 例: 问题答案: 默认情况下(在mpl 2.0中已更改),对数据进行插值(就像对图像所做的那样)。您需要做的就是告诉它不要插值: 也将为您想要的工作。 doc

  • 问题内容: 我在这里重新绘制图形时遇到问题。我允许用户在时间刻度(x轴)中指定单位,然后重新计算并调用此函数plots()。我希望该图仅进行更新,而不是将另一个图附加到该图上。 问题答案: 你基本上有两个选择: 精确执行当前操作,但在重新配置数据之前先致电和。这是最慢但最简单,最可靠的选择。 除了重新绘制外,你还可以更新绘图对象的数据。你需要在代码中进行一些更改,但这比每次重新绘制都快得多。但是,