Python matplotlib imshow работает медленно - PullRequest
4 голосов
/ 20 февраля 2011

Я хочу отобразить файл изображения с помощью imshow. Это изображение в градациях серого 1600x1200, и я обнаружил, что matplotlib использует float32 для декодирования значений. Загрузка изображения занимает около 2 секунд, и я хотел бы знать, есть ли способ сделать это быстрее. Дело в том, что мне действительно не нужно изображение с высоким разрешением, я просто хочу отметить определенные точки и нарисовать изображение в качестве фона. Итак,

  • Первый вопрос: 2 секунды - это хорошая производительность для такого изображения или можно мне ускорить.
  • Второй вопрос: если это хорошая производительность, как я могу сделать процесс быстрее за счет уменьшения разрешения. Важный момент: я все еще хочу Изображение растянется до 1600x1200 пикселей в конце.

Мой код:

import matplotlib
import numpy

plotfig     = matplotlib.pyplot.figure()
plotwindow  = plotfig.add_subplot(111)
plotwindow.axis([0,1600,0,1200])
plotwindow.invert_yaxis() 
img = matplotlib.pyplot.imread("lowres.png")
im  = matplotlib.pyplot.imshow(img,cmap=matplotlib.cm.gray,origin='centre')
plotfig.set_figwidth(200.0)
plotfig.canvas.draw()
matplotlib.pyplot.show()

Это то, что я хочу сделать. Теперь, если изображение, сохраненное в lowres.png, имеет более низкое разрешение, например 1600x1200 (т.е. 400x300), оно отображается в верхнем углу, как и должно быть. Как я могу масштабировать его до 1600x1200 пикселей? Если я запускаю эту программу, медленная часть получается из команды canvas.draw () ниже. Есть ли способ ускорить эту команду?

Заранее спасибо!

По вашим предложениям Я обновился до последней версии matplotlib

версия 1.1.0svn, оформить заказ 8988

И я также использую следующий код:

img = matplotlib.pyplot.imread(pngfile)
img *= 255
img2 = img.astype(numpy.uint8)
im  = self.plotwindow.imshow(img2,cmap=matplotlib.cm.gray, origin='centre')

и, тем не менее, отображение изображения занимает около 2 секунд ... Есть еще идеи?

Просто добавить: Я нашел следующую функцию

zoomed_inset_axes

Таким образом, в принципе, matplotlib должен быть в состоянии выполнить задачу. Там же можно нарисовать картинку в увеличенном виде ...

Ответы [ 3 ]

5 голосов
/ 20 февраля 2011

Размер данных не зависит от размеров в пикселях конечного изображения.

Поскольку вы говорите, что вам не нужно изображение с высоким разрешением, вы можете сгенерировать изображение быстрее, уменьшив частоту дискретизации ваших данных. Если ваши данные представлены в виде пустого массива, быстрый и грязный способ - взять каждый столбец nth и строку с data[::n,::n].

Вы можете контролировать размеры выходного изображения в пикселях с помощью параметров fig.set_size_inches и plt.savefig dpi:

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np

data=np.arange(300).reshape((10,30))
plt.imshow(data[::2,::2],cmap=cm.Greys)

fig=plt.gcf()
# Unfortunately, had to find these numbers through trial and error
fig.set_size_inches(5.163,3.75)  
ax=plt.gca()
extent=ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())

plt.savefig('/tmp/test.png', dpi=400,
            bbox_inches=extent)

enter image description here

1 голос
/ 22 февраля 2011

Я нашел решение, пока нужно отображать только изображения с низким разрешением.Это можно сделать, используя строку

im  = matplotlib.pyplot.imshow(img,cmap=matplotlib.cm.gray, origin='centre',extent=(0,1600,0,1200))

, где параметр экстента указывает matplotlib построить график в этом диапазоне.Если использовать изображение с более низким разрешением, это значительно ускоряет процесс.Тем не менее, было бы замечательно, если бы кто-то знал дополнительные приемы, чтобы сделать процесс еще быстрее, чтобы использовать более высокое разрешение с той же скоростью.

Спасибо всем, кто задумался над моей проблемой, приветствуются дальнейшие замечания !!!

0 голосов
/ 22 ноября 2016

Вы можете отключить интерполяцию imshow по умолчанию, добавив следующую строку в ваш файл matplotlibrc (обычно это ~ / .matplotlib / matplotlibrc):

image.interpolation: нет

Результат - намного более быстрый рендеринг и более четкие изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...