Как отобразить изображение с помощью Pylab из скрипта неблокирующим способом

#python #image #matplotlib

#python #изображение #matplotlib

Вопрос:

Я пишу некоторый итеративный алгоритм обработки изображений в скрипте (я не хочу использовать IPython), и я хотел бы визуализировать изображение, которое я генерирую после каждой итерации. Это очень легко сделать в Matlab, не блокируя основной поток, но я изо всех сил пытаюсь сделать это на Python.

В pylab функция show() заблокирована, и мне нужно закрыть окно, чтобы продолжить выполнение моего скрипта. Я видел, что некоторые люди используют функцию ion (), но в моем случае это не имеет никакого эффекта, например:

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

все еще блокируется. Я также видел людей, говорящих, что «использование draw вместо plot» может решить эту проблему. Однако я использую не plot, а imshow / показать, есть ли что-то, чего мне здесь не хватает?

С другой стороны, PIL также имеет некоторые функции отображения, но, похоже, он генерирует временное изображение, а затем отображает его с помощью imagemagick, поэтому я предполагаю, что здесь нет способа отобразить изображение и обновить его в том же окне с помощью этого метода.

Я использую Ubuntu 10.10.

Кто-нибудь знает, как это сделать просто, или мне нужно начать использовать что-то вроде Qt, чтобы иметь минимальный графический интерфейс, который я могу легко обновлять?

Ответ №1:

Попробуйте использовать pylab.draw() вместо pylab.show() .

pylab.show() запустится основной цикл Tk, следовательно, он блокируется. В то время как pylab.draw() принудительно отобразит фигуру в этой точке. Поскольку вы используете pylab.ion() , рисунки уже созданы. Но в конце скрипта вы должны поставить pylab.show() иначе рисунки будут закрыты, когда скрипт завершится, поскольку нет основного цикла. Одним из побочных эффектов является то, что вы не можете взаимодействовать с рисунками, пока не достигнете pylab.show() .

Комментарии:

1. спасибо, ваш комментарий, который 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()
  

Комментарии:

1. У меня это не работает. В do your stuff я жду нажатия клавиши, но когда я это делаю, поток не заканчивается. Необходимо завершить процесс.