best way to browse images

Hi all,

In my work lately I have often wanted to browse through a series of images. This means displaying the image(s), looking at it/them and then continuing. I have coded this in a few different ways, but it is generally pretty slow – which is to say that the image display takes more than a couple seconds (~4) after I tell it to continue to the next image. I tested the loop without image display and it was a factor of ~80 times faster than it was with image display, so it’s doesn’t have anything to do with reading the images from disk. My latest approach is basically:

first = True

fig = plt.figure()

for file in imagefiles:

read in image data (fits files)

if first:

ax = fig.add_suplot(1,1,1)

im = ax.imshow(image)

else:

im.set_data(image)

ans = raw_input(‘continue?’)

if ans == ‘n’:

break

Is there a more efficient way to do this?

Regards,

Jon

···


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA


What is happening is that you are not telling the image to redraw, so you are only seeing it refresh for other reasons. Try adding a fig.draw() call prior to the raw_input() call.

Cheers!

Ben Root

···

On Tue, Oct 14, 2014 at 10:03 AM, Slavin, Jonathan <jslavin@…1081…> wrote:

Hi all,

In my work lately I have often wanted to browse through a series of images. This means displaying the image(s), looking at it/them and then continuing. I have coded this in a few different ways, but it is generally pretty slow – which is to say that the image display takes more than a couple seconds (~4) after I tell it to continue to the next image. I tested the loop without image display and it was a factor of ~80 times faster than it was with image display, so it’s doesn’t have anything to do with reading the images from disk. My latest approach is basically:

first = True

fig = plt.figure()

for file in imagefiles:

read in image data (fits files)

if first:

ax = fig.add_suplot(1,1,1)

im = ax.imshow(image)

else:

im.set_data(image)

ans = raw_input(‘continue?’)

if ans == ‘n’:

break

Is there a more efficient way to do this?

Regards,

Jon


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…4309… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA



Comprehensive Server Monitoring with Site24x7.

Monitor 10 servers for $9/Month.

Get alerted through email, SMS, voice calls or mobile push notifications.

Take corrective actions from your mobile device.

http://p.sf.net/sfu/Zoho


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Also, you aren’t updating “first” after the first call, so it is constantly making new axes and recalling imshow().

Ben Root

···

On Tue, Oct 14, 2014 at 10:41 AM, Benjamin Root <ben.root@…3286…> wrote:

What is happening is that you are not telling the image to redraw, so you are only seeing it refresh for other reasons. Try adding a fig.draw() call prior to the raw_input() call.

Cheers!

Ben Root

On Tue, Oct 14, 2014 at 10:03 AM, Slavin, Jonathan <jslavin@…1081…> wrote:

Hi all,

In my work lately I have often wanted to browse through a series of images. This means displaying the image(s), looking at it/them and then continuing. I have coded this in a few different ways, but it is generally pretty slow – which is to say that the image display takes more than a couple seconds (~4) after I tell it to continue to the next image. I tested the loop without image display and it was a factor of ~80 times faster than it was with image display, so it’s doesn’t have anything to do with reading the images from disk. My latest approach is basically:

first = True

fig = plt.figure()

for file in imagefiles:

read in image data (fits files)

if first:

ax = fig.add_suplot(1,1,1)

im = ax.imshow(image)

else:

im.set_data(image)

ans = raw_input(‘continue?’)

if ans == ‘n’:

break

Is there a more efficient way to do this?

Regards,

Jon


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA



Comprehensive Server Monitoring with Site24x7.

Monitor 10 servers for $9/Month.

Get alerted through email, SMS, voice calls or mobile push notifications.

Take corrective actions from your mobile device.

http://p.sf.net/sfu/Zoho


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Hi Ben,

Sorry, in my little example, I left out a few things. I do update first after the first call. And I do call draw() after other calls. So here is a more accurate representation of what I do:

first = True

fig = plt.figure()

for file in files:

hdu = fits.open(file)

image = hdu[0].data

hdu.close()

if first:

    ax = fig,add_subplot(1,1,1) 

    im = ax.imshow(image)

    plt.show()

    first = False

else:

    im.set_data(image)

    plt.draw()

ans = raw_input('continue?')

if ans == 'n':

    break

Jon

···

On Tue, Oct 14, 2014 at 10:42 AM, Benjamin Root <ben.root@…1304…> wrote:

Also, you aren’t updating “first” after the first call, so it is constantly making new axes and recalling imshow().

Ben Root


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA


On Tue, Oct 14, 2014 at 10:41 AM, Benjamin Root <ben.root@…1304…> wrote:

What is happening is that you are not telling the image to redraw, so you are only seeing it refresh for other reasons. Try adding a fig.draw() call prior to the raw_input() call.

Cheers!

Ben Root

On Tue, Oct 14, 2014 at 10:03 AM, Slavin, Jonathan <jslavin@…1081…> wrote:

Hi all,

In my work lately I have often wanted to browse through a series of images. This means displaying the image(s), looking at it/them and then continuing. I have coded this in a few different ways, but it is generally pretty slow – which is to say that the image display takes more than a couple seconds (~4) after I tell it to continue to the next image. I tested the loop without image display and it was a factor of ~80 times faster than it was with image display, so it’s doesn’t have anything to do with reading the images from disk. My latest approach is basically:

first = True

fig = plt.figure()

for file in imagefiles:

read in image data (fits files)

if first:

ax = fig.add_suplot(1,1,1)

im = ax.imshow(image)

else:

im.set_data(image)

ans = raw_input(‘continue?’)

if ans == ‘n’:

break

Is there a more efficient way to do this?

Regards,

Jon


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA



Comprehensive Server Monitoring with Site24x7.

Monitor 10 servers for $9/Month.

Get alerted through email, SMS, voice calls or mobile push notifications.

Take corrective actions from your mobile device.

http://p.sf.net/sfu/Zoho


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Hmm. I just saw that you suggest fig.draw(). Is there a difference with plt.draw()?

Jon

···

On Tue, Oct 14, 2014 at 11:20 AM, Slavin, Jonathan <jslavin@…1081…> wrote:

Hi Ben,

Sorry, in my little example, I left out a few things. I do update first after the first call. And I do call draw() after other calls. So here is a more accurate representation of what I do:

first = True

fig = plt.figure()

for file in files:

hdu = fits.open(file)
image = hdu[0].data
hdu.close()
if first:
    ax = fig,add_subplot(1,1,1) 
    im = ax.imshow(image)
    plt.show()
    first = False
else:
    im.set_data(image)
    plt.draw()
ans = raw_input('continue?')
if ans == 'n':
    break

Jon


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA


On Tue, Oct 14, 2014 at 10:42 AM, Benjamin Root <ben.root@…1304…> wrote:

Also, you aren’t updating “first” after the first call, so it is constantly making new axes and recalling imshow().

Ben Root


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA


On Tue, Oct 14, 2014 at 10:41 AM, Benjamin Root <ben.root@…1304…> wrote:

What is happening is that you are not telling the image to redraw, so you are only seeing it refresh for other reasons. Try adding a fig.draw() call prior to the raw_input() call.

Cheers!

Ben Root

On Tue, Oct 14, 2014 at 10:03 AM, Slavin, Jonathan <jslavin@…1081…> wrote:

Hi all,

In my work lately I have often wanted to browse through a series of images. This means displaying the image(s), looking at it/them and then continuing. I have coded this in a few different ways, but it is generally pretty slow – which is to say that the image display takes more than a couple seconds (~4) after I tell it to continue to the next image. I tested the loop without image display and it was a factor of ~80 times faster than it was with image display, so it’s doesn’t have anything to do with reading the images from disk. My latest approach is basically:

first = True

fig = plt.figure()

for file in imagefiles:

read in image data (fits files)

if first:

ax = fig.add_suplot(1,1,1)

im = ax.imshow(image)

else:

im.set_data(image)

ans = raw_input(‘continue?’)

if ans == ‘n’:

break

Is there a more efficient way to do this?

Regards,

Jon


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA



Comprehensive Server Monitoring with Site24x7.

Monitor 10 servers for $9/Month.

Get alerted through email, SMS, voice calls or mobile push notifications.

Take corrective actions from your mobile device.

http://p.sf.net/sfu/Zoho


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Only if there are multiple figures (plt.draw() operates on the current active figure, while fig.draw() explicitly operates upon that figure). Another possibility is that the bottleneck truly is the IO. Depending on exactly how fits work, it might be lazily loading data for you, so the test without the display of the images might not actually be loading any data into memory.

Ben Root

···

On Tue, Oct 14, 2014 at 11:22 AM, Slavin, Jonathan <jslavin@…1081…> wrote:

Hmm. I just saw that you suggest fig.draw(). Is there a difference with plt.draw()?

Jon

On Tue, Oct 14, 2014 at 11:20 AM, Slavin, Jonathan <jslavin@…1081…> wrote:

Hi Ben,

Sorry, in my little example, I left out a few things. I do update first after the first call. And I do call draw() after other calls. So here is a more accurate representation of what I do:

first = True

fig = plt.figure()

for file in files:

hdu = fits.open(file)
image = hdu[0].data
hdu.close()
if first:
    ax = fig,add_subplot(1,1,1) 
    im = ax.imshow(image)
    plt.show()
    first = False
else:
    im.set_data(image)
    plt.draw()
ans = raw_input('continue?')
if ans == 'n':
    break

Jon


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA


On Tue, Oct 14, 2014 at 10:42 AM, Benjamin Root <ben.root@…1304…> wrote:

Also, you aren’t updating “first” after the first call, so it is constantly making new axes and recalling imshow().

Ben Root


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA


On Tue, Oct 14, 2014 at 10:41 AM, Benjamin Root <ben.root@…1304…> wrote:

What is happening is that you are not telling the image to redraw, so you are only seeing it refresh for other reasons. Try adding a fig.draw() call prior to the raw_input() call.

Cheers!

Ben Root

On Tue, Oct 14, 2014 at 10:03 AM, Slavin, Jonathan <jslavin@…1081…> wrote:

Hi all,

In my work lately I have often wanted to browse through a series of images. This means displaying the image(s), looking at it/them and then continuing. I have coded this in a few different ways, but it is generally pretty slow – which is to say that the image display takes more than a couple seconds (~4) after I tell it to continue to the next image. I tested the loop without image display and it was a factor of ~80 times faster than it was with image display, so it’s doesn’t have anything to do with reading the images from disk. My latest approach is basically:

first = True

fig = plt.figure()

for file in imagefiles:

read in image data (fits files)

if first:

ax = fig.add_suplot(1,1,1)

im = ax.imshow(image)

else:

im.set_data(image)

ans = raw_input(‘continue?’)

if ans == ‘n’:

break

Is there a more efficient way to do this?

Regards,

Jon


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA



Comprehensive Server Monitoring with Site24x7.

Monitor 10 servers for $9/Month.

Get alerted through email, SMS, voice calls or mobile push notifications.

Take corrective actions from your mobile device.

http://p.sf.net/sfu/Zoho


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

I’ve found that, for big images, the first draw is very slow, due to the intensity scaling of the image, which happens at full resolution. Panning and zooming afterwards is fast because the intensity scaling is cached, but changing the data array or updating the norm kwarg is slow again. I made ModestImage (https://github.com/ChrisBeaumont/mpl-modest-image) to deal with this – it dynamically downsamples images to screen resolution. This makes the first draw after updating the data or norm much faster, while slowing down subsequent redraws. Perhaps this could help you out?

cheers,

chris

···

On Tue, Oct 14, 2014 at 12:08 PM, Benjamin Root <ben.root@…1304…> wrote:

Only if there are multiple figures (plt.draw() operates on the current active figure, while fig.draw() explicitly operates upon that figure). Another possibility is that the bottleneck truly is the IO. Depending on exactly how fits work, it might be lazily loading data for you, so the test without the display of the images might not actually be loading any data into memory.

Ben Root


Comprehensive Server Monitoring with Site24x7.

Monitor 10 servers for $9/Month.

Get alerted through email, SMS, voice calls or mobile push notifications.

Take corrective actions from your mobile device.

http://p.sf.net/sfu/Zoho


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users


Chris Beaumont
Senior Software Engineer
Harvard Center for Astrophysics

60 Garden Street, MS 42

Cambridge, MA 02138

chrisbeaumont.org


On Tue, Oct 14, 2014 at 11:22 AM, Slavin, Jonathan <jslavin@…1081…> wrote:

Hmm. I just saw that you suggest fig.draw(). Is there a difference with plt.draw()?

Jon

On Tue, Oct 14, 2014 at 11:20 AM, Slavin, Jonathan <jslavin@…1081…> wrote:

Hi Ben,

Sorry, in my little example, I left out a few things. I do update first after the first call. And I do call draw() after other calls. So here is a more accurate representation of what I do:

first = True

fig = plt.figure()

for file in files:

hdu = fits.open(file)
image = hdu[0].data
hdu.close()
if first:
    ax = fig,add_subplot(1,1,1) 
    im = ax.imshow(image)
    plt.show()
    first = False
else:
    im.set_data(image)
    plt.draw()
ans = raw_input('continue?')
if ans == 'n':
    break

Jon


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA


On Tue, Oct 14, 2014 at 10:42 AM, Benjamin Root <ben.root@…1304…> wrote:

Also, you aren’t updating “first” after the first call, so it is constantly making new axes and recalling imshow().

Ben Root


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA


On Tue, Oct 14, 2014 at 10:41 AM, Benjamin Root <ben.root@…1304…> wrote:

What is happening is that you are not telling the image to redraw, so you are only seeing it refresh for other reasons. Try adding a fig.draw() call prior to the raw_input() call.

Cheers!

Ben Root

On Tue, Oct 14, 2014 at 10:03 AM, Slavin, Jonathan <jslavin@…1081…> wrote:

Hi all,

In my work lately I have often wanted to browse through a series of images. This means displaying the image(s), looking at it/them and then continuing. I have coded this in a few different ways, but it is generally pretty slow – which is to say that the image display takes more than a couple seconds (~4) after I tell it to continue to the next image. I tested the loop without image display and it was a factor of ~80 times faster than it was with image display, so it’s doesn’t have anything to do with reading the images from disk. My latest approach is basically:

first = True

fig = plt.figure()

for file in imagefiles:

read in image data (fits files)

if first:

ax = fig.add_suplot(1,1,1)

im = ax.imshow(image)

else:

im.set_data(image)

ans = raw_input(‘continue?’)

if ans == ‘n’:

break

Is there a more efficient way to do this?

Regards,

Jon


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA



Comprehensive Server Monitoring with Site24x7.

Monitor 10 servers for $9/Month.

Get alerted through email, SMS, voice calls or mobile push notifications.

Take corrective actions from your mobile device.

http://p.sf.net/sfu/Zoho


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Hi Chris,

Thanks for that tip. I’ll give it a try. They are big images (2048 x 2048) so it seems like your suggestion should work.

Jon

···

On Tue, Oct 14, 2014 at 12:18 PM, Chris Beaumont <cbeaumont@…1081…> wrote:

I’ve found that, for big images, the first draw is very slow, due to the intensity scaling of the image, which happens at full resolution. Panning and zooming afterwards is fast because the intensity scaling is cached, but changing the data array or updating the norm kwarg is slow again. I made ModestImage (https://github.com/ChrisBeaumont/mpl-modest-image) to deal with this – it dynamically downsamples images to screen resolution. This makes the first draw after updating the data or norm much faster, while slowing down subsequent redraws. Perhaps this could help you out?

cheers,

chris


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA


On Tue, Oct 14, 2014 at 12:08 PM, Benjamin Root <ben.root@…1304…> wrote:

Only if there are multiple figures (plt.draw() operates on the current active figure, while fig.draw() explicitly operates upon that figure). Another possibility is that the bottleneck truly is the IO. Depending on exactly how fits work, it might be lazily loading data for you, so the test without the display of the images might not actually be loading any data into memory.

Ben Root


Comprehensive Server Monitoring with Site24x7.

Monitor 10 servers for $9/Month.

Get alerted through email, SMS, voice calls or mobile push notifications.

Take corrective actions from your mobile device.

http://p.sf.net/sfu/Zoho


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Harvard Center for Astrophysics

60 Garden Street, MS 42

Cambridge, MA 02138

chrisbeaumont.org



Chris Beaumont
Senior Software Engineer

On Tue, Oct 14, 2014 at 11:22 AM, Slavin, Jonathan <jslavin@…1081…> wrote:

Hmm. I just saw that you suggest fig.draw(). Is there a difference with plt.draw()?

Jon

On Tue, Oct 14, 2014 at 11:20 AM, Slavin, Jonathan <jslavin@…1081…> wrote:

Hi Ben,

Sorry, in my little example, I left out a few things. I do update first after the first call. And I do call draw() after other calls. So here is a more accurate representation of what I do:

first = True

fig = plt.figure()

for file in files:

hdu = fits.open(file)
image = hdu[0].data
hdu.close()
if first:
    ax = fig,add_subplot(1,1,1) 
    im = ax.imshow(image)
    plt.show()
    first = False
else:
    im.set_data(image)
    plt.draw()
ans = raw_input('continue?')
if ans == 'n':
    break

Jon


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA


On Tue, Oct 14, 2014 at 10:42 AM, Benjamin Root <ben.root@…1304…> wrote:

Also, you aren’t updating “first” after the first call, so it is constantly making new axes and recalling imshow().

Ben Root


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA


On Tue, Oct 14, 2014 at 10:41 AM, Benjamin Root <ben.root@…1304…> wrote:

What is happening is that you are not telling the image to redraw, so you are only seeing it refresh for other reasons. Try adding a fig.draw() call prior to the raw_input() call.

Cheers!

Ben Root

On Tue, Oct 14, 2014 at 10:03 AM, Slavin, Jonathan <jslavin@…1081…> wrote:

Hi all,

In my work lately I have often wanted to browse through a series of images. This means displaying the image(s), looking at it/them and then continuing. I have coded this in a few different ways, but it is generally pretty slow – which is to say that the image display takes more than a couple seconds (~4) after I tell it to continue to the next image. I tested the loop without image display and it was a factor of ~80 times faster than it was with image display, so it’s doesn’t have anything to do with reading the images from disk. My latest approach is basically:

first = True

fig = plt.figure()

for file in imagefiles:

read in image data (fits files)

if first:

ax = fig.add_suplot(1,1,1)

im = ax.imshow(image)

else:

im.set_data(image)

ans = raw_input(‘continue?’)

if ans == ‘n’:

break

Is there a more efficient way to do this?

Regards,

Jon


Jonathan D. Slavin Harvard-Smithsonian CfA
jslavin@…1081… 60 Garden Street, MS 83
phone: (617) 496-7981 Cambridge, MA 02138-1516
fax: (617) 496-7577 USA



Comprehensive Server Monitoring with Site24x7.

Monitor 10 servers for $9/Month.

Get alerted through email, SMS, voice calls or mobile push notifications.

Take corrective actions from your mobile device.

http://p.sf.net/sfu/Zoho


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users