【问题标题】:How to display an image with Pylab from a script in a non blocking way如何使用 Pylab 从脚本中以非阻塞方式显示图像
【发布时间】:2011-05-05 11:10:10
【问题描述】:

我正在编写一些迭代图像处理算法在脚本中(我不想使用 iPython),我想可视化每次迭代后生成的图像。这在 Matlab 中很容易做到,不会阻塞主线程,但我在 Python 中很难做到。

在 pylab 中,show() 函数被阻塞,我需要关闭窗口才能继续执行我的脚本。我看到有些人使用 ion() 函数,但在我的情况下它没有效果,例如:

pylab.ion()
img = pylab.imread('image.png')
pylab.imshow(img)
pylab.show()

仍处于阻塞状态。我也看到有人说“用draw而不是plot”可以解决这个问题。但是,我使用的不是情节而是 imshow/show,这里有什么我遗漏的吗?

另一方面,PIL也有一些显示功能,不过好像是生成了一个临时图片,然后用imagemagick显示出来,所以我假设这里没有办法显示图片并使用此方法在同一窗口中更新它。

我使用的是 Ubuntu 10.10。

有谁知道如何简单地做到这一点,还是我必须开始使用 Qt 之类的东西才能拥有可以轻松更新的最小 GUI?

【问题讨论】:

    标签: python image matplotlib


    【解决方案1】:

    尝试使用pylab.draw() 而不是pylab.show()

    pylab.show() 将启动一个 Tk 主循环,因此它是阻塞的。而pylab.draw() 将在此时强制绘制图形。由于您使用的是pylab.ion(),因此已经创建了图形。但是在脚本的最后你必须放一个pylab.show() 否则当脚本完成时数字将被关闭,因为没有主循环。一个副作用是,在到达pylab.show() 之前,您无法与这些人物互动。

    【讨论】:

    • 谢谢,您对using pylab.ion(), figures are created already 的评论帮助解决了我的问题。换句话说,据我所知,进行任何绘图之前,这一点很重要。
    【解决方案2】:

    你可以尝试线程化你的 pylab 东西:

    import pylab
    import threading
    
    pylab.ion()
    img = pylab.imread('map.png')
    
    def create_show():
        pylab.imshow(img)
        pylab.show()
    
    thread = threading.Thread(target=create_show)
    thread.start()
    
    #do your stuff
    
    thread.join()
    

    【讨论】:

    • 这对我不起作用。在do your stuff 中,我等待按下一个键,但是当我这样做时,线程并没有结束。必须终止进程。
    猜你喜欢
    • 2011-10-03
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    相关资源
    最近更新 更多