#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
я жду нажатия клавиши, но когда я это делаю, поток не заканчивается. Необходимо завершить процесс.