[Matplotlib-users] 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 jsla...@cfa.harvard.edu 60 Garden Street, MS 83 phone: (617) 496-7981 Cambridge, MA 02138-1516 fax: (617) 496-7577USA -- 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
Re: [Matplotlib-users] best way to browse images
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 jsla...@cfa.harvard.edu 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 jsla...@cfa.harvard.edu 60 Garden Street, MS 83 phone: (617) 496-7981 Cambridge, MA 02138-1516 fax: (617) 496-7577USA -- 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 -- 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
Re: [Matplotlib-users] best way to browse images
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.r...@ou.edu 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 jsla...@cfa.harvard.edu 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 jsla...@cfa.harvard.edu 60 Garden Street, MS 83 phone: (617) 496-7981 Cambridge, MA 02138-1516 fax: (617) 496-7577USA -- 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 -- 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
Re: [Matplotlib-users] best way to browse images
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.r...@ou.edu wrote: 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.r...@ou.edu 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 jsla...@cfa.harvard.edu 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 jsla...@cfa.harvard.edu 60 Garden Street, MS 83 phone: (617) 496-7981 Cambridge, MA 02138-1516 fax: (617) 496-7577USA -- 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 -- Jonathan D. Slavin Harvard-Smithsonian CfA jsla...@cfa.harvard.edu 60 Garden Street, MS 83 phone: (617) 496-7981 Cambridge, MA 02138-1516 fax: (617) 496-7577USA -- 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
Re: [Matplotlib-users] best way to browse images
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 jsla...@cfa.harvard.edu 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 On Tue, Oct 14, 2014 at 10:42 AM, Benjamin Root ben.r...@ou.edu wrote: 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.r...@ou.edu 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 jsla...@cfa.harvard.edu 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 jsla...@cfa.harvard.edu 60 Garden Street, MS 83 phone: (617) 496-7981 Cambridge, MA 02138-1516 fax: (617) 496-7577USA -- 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 -- Jonathan D. Slavin Harvard-Smithsonian CfA jsla...@cfa.harvard.edu 60 Garden Street, MS 83 phone: (617) 496-7981 Cambridge, MA 02138-1516 fax: (617) 496-7577USA -- Jonathan D. Slavin Harvard-Smithsonian CfA jsla...@cfa.harvard.edu 60 Garden Street, MS 83 phone: (617) 496-7981 Cambridge, MA 02138-1516 fax: (617) 496-7577USA -- 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
Re: [Matplotlib-users] best way to browse images
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 jsla...@cfa.harvard.edu 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 jsla...@cfa.harvard.edu 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 On Tue, Oct 14, 2014 at 10:42 AM, Benjamin Root ben.r...@ou.edu wrote: 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.r...@ou.edu 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 jsla...@cfa.harvard.edu 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 jsla...@cfa.harvard.edu 60 Garden Street, MS 83 phone: (617) 496-7981 Cambridge, MA 02138-1516 fax: (617) 496-7577USA -- 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 -- Jonathan D. Slavin Harvard-Smithsonian CfA jsla...@cfa.harvard.edu 60 Garden Street, MS 83 phone: (617) 496-7981 Cambridge, MA 02138-1516 fax: (617) 496-7577USA -- Jonathan D. Slavin Harvard-Smithsonian CfA jsla...@cfa.harvard.edu 60 Garden Street, MS 83 phone: (617) 496-7981 Cambridge, MA 02138-1516 fax: (617) 496-7577USA -- 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
Re: [Matplotlib-users] best way to browse images
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.r...@ou.edu 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 On Tue, Oct 14, 2014 at 11:22 AM, Slavin, Jonathan jsla...@cfa.harvard.edu 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 jsla...@cfa.harvard.edu 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 On Tue, Oct 14, 2014 at 10:42 AM, Benjamin Root ben.r...@ou.edu wrote: 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.r...@ou.edu 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 jsla...@cfa.harvard.edu 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 jsla...@cfa.harvard.edu 60 Garden Street, MS 83 phone: (617) 496-7981 Cambridge, MA 02138-1516 fax: (617) 496-7577USA -- 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 -- Jonathan D. Slavin Harvard-Smithsonian CfA jsla...@cfa.harvard.edu 60 Garden Street, MS 83 phone: (617) 496-7981 Cambridge, MA 02138-1516 fax: (617) 496-7577USA -- Jonathan D. Slavin Harvard-Smithsonian CfA jsla...@cfa.harvard.edu 60 Garden Street, MS 83 phone: (617) 496-7981 Cambridge, MA 02138-1516 fax: (617) 496-7577USA
Re: [Matplotlib-users] best way to browse images
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 cbeaum...@cfa.harvard.edu 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 On Tue, Oct 14, 2014 at 12:08 PM, Benjamin Root ben.r...@ou.edu 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 On Tue, Oct 14, 2014 at 11:22 AM, Slavin, Jonathan jsla...@cfa.harvard.edu 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 jsla...@cfa.harvard.edu 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 On Tue, Oct 14, 2014 at 10:42 AM, Benjamin Root ben.r...@ou.edu wrote: 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.r...@ou.edu 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 jsla...@cfa.harvard.edu 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 jsla...@cfa.harvard.edu 60 Garden Street, MS 83 phone: (617) 496-7981 Cambridge, MA 02138-1516 fax: (617) 496-7577USA -- 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 -- Jonathan D. Slavin Harvard-Smithsonian CfA jsla...@cfa.harvard.edu 60 Garden Street, MS 83 phone: (617) 496-7981 Cambridge, MA 02138-1516 fax: (617) 496-7577USA -- Jonathan D. Slavin Harvard-Smithsonian CfA jsla...@cfa.harvard.edu 60 Garden