ускорить вывод изображений в matplotlib

Я написал немного Python в Spyder IDE, чтобы построить пару изображений рядом, чтобы я мог их визуально проверять. Мне нужно всего 3 секунды, чтобы посмотреть на них большую часть времени, но время от времени мне нужно больше времени, чтобы рассмотреть их поближе. Поэтому я не использовал time.sleep, вместо этого я закодировал его так, чтобы он ждал, пока я нажму клавишу Enter, как показано ниже:

import matplotlib.pyplot as plt
import os

def VI_segmentation():
    root = os.getcwd()
    NR_dir = root + '\\Neurite_Results\\'
    SO_dir = root + '\\Segmentation_Overlays\\'
    jpgs = os.listdir(NR_dir)
    fig = plt.figure(figsize=(20,12))
    for jpg in jpgs:
        fig.suptitle(jpg , fontsize=14, fontweight='bold')
        image_NR = plt.imread(NR_dir + jpg)
        image_SO = plt.imread(SO_dir + jpg)
        plt.subplot(121)
        plt.imshow(image_NR)
        plt.subplot(122)
        plt.imshow(image_SO)
        plt.draw()
        plt.pause(0.01)

        input('Press Enter to continue')

VI_segmentation()

Проблема в том, что я думаю быстрее, чем мой компьютер :). Компьютеру требуется 5 или 6 секунд, чтобы отреагировать на клавишу Enter, и еще несколько секунд для обновления после ответа. Это приводит к паршивой эргономике при просмотре сотен изображений, которые в основном хороши. Любые идеи по оптимизации этого кода будут высоко оценены.


person Dessie    schedule 09.11.2015    source источник
comment
Поскольку ни у кого, кроме вас, нет этих изображений, вам необходимо предоставить дополнительную информацию. По крайней мере, что именно работает медленно на вашем компьютере, прочитайте это о профилировании: .com/questions/5478351/   -  person fghj    schedule 09.11.2015


Ответы (2)


Эта версия кода в конечном итоге решила мою проблему:

import matplotlib.pyplot as plt
import os

def VI_segmentation():
    plt.ion()
    root = os.getcwd()
    NR_dir = root + '\\Neurite_Results\\'
    SO_dir = root + '\\Segmentation_Overlays\\'
    jpgs = os.listdir(NR_dir)
    f = plt.figure(figsize=(22,12))
    ax1 = f.add_subplot(121)
    ax2 = f.add_subplot(122)
    image_NR = plt.imread(NR_dir + jpgs[0])
    image_SO = plt.imread(SO_dir + jpgs[0])
    im1 = ax1.imshow(image_NR)
    im2 = ax2.imshow(image_SO) 
    f.suptitle(jpgs[0] , fontsize=14, fontweight='bold')
    f.show()
    plt.pause(0.01)
    input('Press Enter to continue')

    for jpg in jpgs[1:]:
        f.suptitle(jpg , fontsize=14, fontweight='bold')
        image_NR = plt.imread(NR_dir + jpg)
        image_SO = plt.imread(SO_dir + jpg)
        im1.set_data(image_NR)
        im2.set_data(image_SO)
        f.canvas.draw()
        plt.pause(0.01)
        input('Press Enter to continue')

VI_segmentation()

Ключевым моментом было изменение данных на графике, а не добавление нового графика. Этот ответ был полезен для меня.

Почему моя анимация pylab замедляется с каждым обновлением?< /а>

Как ни странно, когда я начал изменять данные графика вместо повторного построения, я начал получать странное поведение, когда фигура увеличивалась, а окружающее окно - нет. Каким-то образом этот fig.set_size_inches сломался, поэтому я перешел к созданию фигуры и созданию оси, чтобы я мог установить размер фигуры, когда фигура была сделана.

person Dessie    schedule 10.11.2015

Вы можете изменить бэкэнд matplotlib и проверить, что лучше для вашего сюжета.

вы можете попробовать бэкэнд GTKAgg, как описано в ответе: https://stackoverflow.com/a/30655528/2632856

попробуйте добавить вторую строку кода после оператора импорта matplotlib.

import matplotlib
matplotlib.use('GTKAgg')

Есть и другие бэкенды, с которыми вы можете поэкспериментировать. См. эту ссылку для доступных бэкэндов, http://matplotlib.org/faq/usage_faq.html#what-is-a-backend

person Kirubaharan J    schedule 09.11.2015