slow rendering of 2K images using Animation_blit_tk.py - bis

Dear all,

I recently cried for help (see below) but sadly didn’t get any answer… This problem is really a bottleneck for me and if I must find a solution… Can anyone PLEAAAAAAAAASE point me in the right direction ?

I recently bumped into a problem while trying to display
imshow images (2048x2048 pix) in a GUI based on TkAgg (matplotib0.91.2,
python 2…4.4, numpy1.0.4). In brief, building the image with imshow is
Ok, but the call to show() or draw() takes about 1.2 s on my system
(XP, 2.8Ghz, 2Go ram). After reading a lot of posts and trying out a
few things, I turned to the Animation_blit_tk.py example and modified
it accordingly (code attached below). In the end, the display is still
not much faster using this method (still in the order of 1.2 s as
indicated by the result below).
Could any one tel me whether I’m doing something wrong ?

As
far as I understand, at least in my Tk GUI, the limiting step using the
ImageTk.FigureCanvasTkAgg is the call to draw() or draw_artist(). I
read some comments from John regarding TkAgg being slow in some cases
but couldn’t find a definite answer.

Any hint would be much appreciated…

Cheers,

Aure

···

For detailed comments on animation and the techniqes used here, see

the wiki entry http://www.scipy.org/Cookbook/Matplotlib/Animations

import matplotlib
matplotlib.use(‘TkAgg’)

import sys
import pylab as p
#import matplotlib.numerix as nx
import time

from FileUtils10 import fileHandling

for profiling

tstart = time.time()
tprevious = time.time()

fnamelist = [‘fname1’,‘fname2’,‘fname3’]

ax = p.subplot(111)
canvas = ax.figure.canvas

print 't1 ',time.time()-tprevious
tprevious = time.time()

create the initial line

dataarr = fileHandling(fnamelist[0]).readSpecial()
#print dataarr.dtype => numpy dtype
uint16
#dataarr = dataarr.astype(‘uint8’)
print 't2 ',time.time()-tprevious
tprevious = time.time()

image = p.imshow(dataarr, animated=True)
print 't3 ',time.time()-tprevious
tprevious = time.time()

def run(*args):
tprevious = time.time()
background = canvas.copy_from_bbox(ax.bbox)
print 't4 ',time.time()-tprevious
tprevious = time.time()
while 1:
#print fnamelist[run.cnt]
# restore the clean slate background
canvas.restore_region(background)
print 't5 ',time.time()-tprevious
tprevious = time.time()
# update the data
dataarr = fileHandling(fnamelist[run.cnt]).readSpecial()
print 't6
',time.time()-tprevious
tprevious = time.time()
image.set_data(dataarr)
print 't7 ',time.time()-tprevious
tprevious = time.time()
# just draw the animated artist
ax.draw_artist(image)
print 't8 ',time.time()-tprevious
tprevious = time.time()
# just redraw the axes rectangle
canvas.blit(ax.bbox)
print 't9 ',time.time()-tprevious
tprevious = time.time()

    if fnamelist[run.cnt] == fnamelist[-1]:
        # print the timing info and quit
         print 'total time:' ,

time.time()-tstart
print ‘FPS:’ , 1000./(time.time()-tstart)
p.close(‘all’)
sys.exit()

    run.cnt += 1

run.cnt = 0

p.subplots_adjust(left=0.3, bottom=0.3) # check for flipy bugs
p.grid() # to ensure proper background restore
manager = p.get_current_fig_manager()
manager.window.after(100, run)

p.show()

====
Results in:

t1 0.858999967575
t2 0.0320000648499
t3 1.31299996376
t4 0.0
t5 0.0
t6 0.0310001373291
t7 0.0
t8 1.18700003624
t9 0.0160000324249
t5 0.0
t6 0.0469999313354
t7 0…0
t8 1.17200016975
t9 0.0149998664856
t5 0.0
t6 0.047000169754
t7 0.0
t8 1.21899986267
t9
0.0
t5 0.0
t6 0.0460000038147
t7 0.0
t8 1.17199993134
t9 0.0
t5 0.0
t6 0.0469999313354
t7 0.0
t8 1.18700003624
t9 0.0160000324249
total time: 8.75
FPS: 114.285714286

There are a few ways to improve the speed, which, I guess, will give
you factor of a few speed up.
If you need more than that, I guess matplotlib is not suitable for your purpose.

* try a simple interpolation method, eg. imshow(arr, interpolation="nearest")
* reduce the image size. Unless you have a monitor this large, you
loose the image quality anyhow.

In my machine (linux, xeon 2.6 GHz), it takes about ~0.8 s to display
2k x 2k image. 0.3 s for 1k x 1k.

Regards,

-JJ

···

On Fri, Sep 4, 2009 at 5:18 AM, Auré Gourrier<aurelien.gourrier@...2771......> wrote:

Dear all,

I recently cried for help (see below) but sadly didn't get any answer...
This problem is really a bottleneck for me and if I must find a solution...
Can anyone PLEAAAAAAAAASE point me in the right direction ?

I recently bumped into a problem while trying to display imshow images
(2048x2048 pix) in a GUI based on TkAgg (matplotib0.91.2, python 2..4.4,
numpy1.0.4). In brief, building the image with imshow is Ok, but the call to
show() or draw() takes about 1.2 s on my system (XP, 2.8Ghz, 2Go ram). After
reading a lot of posts and trying out a few things, I turned to the
Animation_blit_tk.py example and modified it accordingly (code attached
below). In the end, the display is still not much faster using this method
(still in the order of 1.2 s as indicated by the result below).
Could any one tel me whether I'm doing something wrong ?

As far as I understand, at least in my Tk GUI, the limiting step using the
ImageTk.FigureCanvasTkAgg is the call to draw() or draw_artist(). I read
some comments from John regarding TkAgg being slow in some cases but
couldn't find a definite answer.

Any hint would be much appreciated....

Cheers,

Aure

--------
# For detailed comments on animation and the techniqes used here, see
# the wiki entry http://www.scipy.org/Cookbook/Matplotlib/Animations

import matplotlib
matplotlib.use('TkAgg')

import sys
import pylab as p
#import matplotlib.numerix as nx
import time

from FileUtils10 import fileHandling

# for profiling
tstart = time.time()
tprevious = time.time()

fnamelist = ['fname1','fname2','fname3']

ax = p.subplot(111)
canvas = ax.figure.canvas

print 't1 ',time.time()-tprevious
tprevious = time.time()

# create the initial line
dataarr = fileHandling(fnamelist[0]).readSpecial()
#print dataarr.dtype => numpy dtype uint16
#dataarr = dataarr.astype('uint8')
print 't2 ',time.time()-tprevious
tprevious = time.time()

image = p.imshow(dataarr, animated=True)
print 't3 ',time.time()-tprevious
tprevious = time.time()

def run(*args):
tprevious = time.time()
background = canvas.copy_from_bbox(ax.bbox)
print 't4 ',time.time()-tprevious
tprevious = time.time()
while 1:
#print fnamelist[run.cnt]
# restore the clean slate background
canvas.restore_region(background)
print 't5 ',time.time()-tprevious
tprevious = time.time()
# update the data
dataarr = fileHandling(fnamelist[run.cnt]).readSpecial()
print 't6 ',time.time()-tprevious
tprevious = time.time()
image.set_data(dataarr)
print 't7 ',time.time()-tprevious
tprevious = time.time()
# just draw the animated artist
ax.draw_artist(image)
print 't8 ',time.time()-tprevious
tprevious = time.time()
# just redraw the axes rectangle
canvas.blit(ax.bbox)
print 't9 ',time.time()-tprevious
tprevious = time.time()

    if fnamelist\[run\.cnt\] == fnamelist\[\-1\]:
        \# print the timing info and quit
        print &#39;total time:&#39; , time\.time\(\)\-tstart
        print &#39;FPS:&#39; , 1000\./\(time\.time\(\)\-tstart\)
        p\.close\(&#39;all&#39;\)
        sys\.exit\(\)

    run\.cnt \+= 1

run.cnt = 0

p.subplots_adjust(left=0.3, bottom=0.3) # check for flipy bugs
p.grid() # to ensure proper background restore
manager = p.get_current_fig_manager()
manager.window.after(100, run)

p.show()

====
Results in:

t1 0.858999967575
t2 0.0320000648499
t3 1.31299996376
t4 0.0
t5 0.0
t6 0.0310001373291
t7 0.0
t8 1.18700003624
t9 0.0160000324249
t5 0.0
t6 0.0469999313354
t7 0..0
t8 1.17200016975
t9 0.0149998664856
t5 0.0
t6 0.047000169754
t7 0.0
t8 1.21899986267
t9 0.0
t5 0.0
t6 0.0460000038147
t7 0.0
t8 1.17199993134
t9 0.0
t5 0.0
t6 0.0469999313354
t7 0.0
t8 1.18700003624
t9 0.0160000324249
total time: 8.75
FPS: 114.285714286

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus
on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

OK, thanks JJ, I just wanted to make sure I was not missing something. I guess I’ll have to check how it goes once rebinned.
Cheers,
Auré

···

De : Jae-Joon Lee <lee.j…joon@…287…>
À : Auré Gourrier <aurelien.gourrier@…136…>
Cc : matplotlib-users@…564…net
Envoyé le : Lundi, 7 Septembre 2009, 4h11mn 29s
Objet : Re:
[Matplotlib-users] slow rendering of 2K images using Animation_blit_tk.py - bis

There are a few ways to improve the speed, which, I guess, will give
you factor of a few speed up.
If you need more than that, I guess matplotlib is not suitable for your purpose.

  • try a simple interpolation method, eg. imshow(arr, interpolation=“nearest”)
  • reduce the image size. Unless you have a monitor this large, you
    loose the image quality anyhow.

In my machine (linux, xeon 2.6 GHz), it takes about ~0.8 s to display
2k x 2k image. 0.3 s for 1k x 1k.

Regards,

-JJ

On Fri, Sep 4, 2009 at 5:18 AM, Auré Gourrier<aurelien.gourrier@…136…> wrote:

Dear all,

I recently cried for help (see below) but sadly didn’t get any answer…
This problem is really a bottleneck for
me and if I must find a solution…
Can anyone PLEAAAAAAAAASE point me in the right direction ?

I recently bumped into a problem while trying to display imshow images
(2048x2048 pix) in a GUI based on TkAgg (matplotib0.91.2, python 2…4.4,
numpy1.0.4). In brief, building the image with imshow is Ok, but the call to
show() or draw() takes about 1.2 s on my system (XP, 2.8Ghz, 2Go ram). After
reading a lot of posts and trying out a few things, I turned to the
Animation_blit_tk.py example and modified it accordingly (code attached
below). In the end, the display is still not much faster using this method
(still in the order of 1.2 s as indicated by the result below).
Could any one tel me whether I’m doing something wrong ?

As far as I understand, at least in my Tk GUI, the limiting step using the
ImageTk.FigureCanvasTkAgg is the call to draw() or
draw_artist(). I read
some comments from John regarding TkAgg being slow in some cases but
couldn’t find a definite answer.

Any hint would be much appreciated…

Cheers,

Aure


For detailed comments on animation and the techniqes used here, see

the wiki entry http://www.scipy.org/Cookbook/Matplotlib/Animations

import matplotlib
matplotlib.use(‘TkAgg’)

import sys
import pylab as p
#import matplotlib.numerix as nx
import time

from FileUtils10 import fileHandling

for profiling

tstart = time.time()
tprevious = time.time()

fnamelist = [‘fname1’,‘fname2’,‘fname3’]

ax = p.subplot(111)
canvas =
ax.figure.canvas

print 't1 ',time.time()-tprevious
tprevious = time.time()

create the initial line

dataarr = fileHandling(fnamelist[0]).readSpecial()
#print dataarr.dtype => numpy dtype uint16
#dataarr = dataarr.astype(‘uint8’)
print 't2 ',time.time()-tprevious
tprevious = time.time()

image = p.imshow(dataarr, animated=True)
print 't3 ',time.time()-tprevious
tprevious = time.time()

def run(*args):
tprevious = time.time()
background = canvas…copy_from_bbox(ax.bbox)
print 't4 ',time.time()-tprevious
tprevious = time.time()
while 1:
#print fnamelist[run.cnt]
# restore the clean slate background

  canvas.restore_region(background)
    print 't5 ',time.time()-tprevious
    tprevious = time.time()
    # update the data
    dataarr = fileHandling(fnamelist[run.cnt]).readSpecial()
    print 't6 ',time.time()-tprevious
    tprevious = time.time()
    image.set_data(dataarr)
    print 't7 ',time.time()-tprevious
    tprevious = time.time()
    # just draw the animated artist
    ax.draw_artist(image)
    print 't8 ',time.time()-tprevious
    tprevious = time.time()
    # just redraw the axes

rectangle

    canvas.blit(ax.bbox)
    print 't9 ',time.time()-tprevious
    tprevious = time.time()

    if fnamelist[run.cnt] == fnamelist[-1]:
        # print the timing info and quit
        print 'total time:' , time.time()-tstart
        print 'FPS:' , 1000./(time.time()-tstart)
        p.close('all')
        sys.exit()

    run.cnt += 1

run…cnt = 0

p.subplots_adjust(left=0.3, bottom=0…3) # check for flipy bugs
p.grid() # to ensure proper background restore
manager = p.get_current_fig_manager()

manager.window.after(100, run)

p.show()

====
Results in:

t1 0.858999967575
t2 0.0320000648499
t3 1.31299996376
t4 0.0
t5 0.0
t6 0.0310001373291
t7 0.0
t8 1.18700003624
t9 0.0160000324249
t5 0.0
t6 0.0469999313354
t7 0…0
t8 1.17200016975
t9 0.0149998664856
t5 0.0
t6 0.047000169754
t7 0.0
t8 1.21899986267
t9 0.0
t5 0.0
t6 0.0460000038147
t7 0.0
t8 1.17199993134
t9 0.0
t5 0.0
t6 0.0469999313354
t7 0.0
t8 1.18700003624
t9 0.0160000324249
total time: 8.75
FPS:
114.285714286


Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus
on
what you do best, core application coding. Discover what’s new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july


Matplotlib-users mailing list
Matplotlib-users@…1735…sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users