Christoph, if you're looking at special casing uint8's, you might want
to keep in mind that uint16 greyscale images are also quite common as
camera outputs in experimental setups. I think that the solution to
this should ideally minimise memory usage for any greyscale image, be
it uint8, uint16, float32 or float64. i.e. avoiding conversion to RGBA
for any single-plane 2D array type would be best IMHO,

Gary R.

On Thu, Feb 3, 2011 at 5:38 PM, Robert Abiad <ab...@ssl.berkeley.edu> wrote:
>
>
> On 2/2/2011 6:06 PM, Eric Firing wrote:
>> On 02/02/2011 03:08 PM, Robert Abiad wrote:
>>> On 2/2/2011 3:59 PM, Christoph Gohlke wrote:
>>>> On 2/2/2011 3:33 PM, Robert Abiad wrote:
>>>>> Hello All,
>>>>>
>>>>> I'm very new to python, so bear with me.
>>>>>
>>>>> I'd like to use python to do my image processing, but I'm running into 
>>>>> behavior that doesn't make
>>>>> sense to me.  I'm using Windows 7 Pro (64-bit) with 4 gigs of memory, 
>>>>> python 2.6.6, and the newest
>>>>> versions of ipython, pyfits, matplotlib (1.0.1), numpy (1.5.1), scipy.  
>>>>> I'm loading in a fits file
>>>>> that's 26 MB (~16 Mpixels).  When I load my image in ImageJ, I can see 
>>>>> memory usage go up by 50MB,
>>>>> but when I try displaying the image using imshow(), my memory usage goes 
>>>>> up by around 500MB, each
>>>>> time.  If I close the figure and replot it, imshow() crashes.  I don't 
>>>>> know if I'm doing something
>>>>> wrong, or if it's a new or known bug.  I tried the same thing on Linux 
>>>>> and got the same result.
>>>>> Here's a transcript.
>>>>>
>>>>>        Welcome to pylab, a matplotlib-based Python environment.
>>>>>        For more information, type 'help(pylab)'.
>>>>>
>>>>> In [1]: import pyfits
>>>>>
>>>>> In [2]: from Tkinter import *
>>>>>
>>>>> In [3]: import tkFileDialog
>>>>>
>>>>> In [4]: image=pyfits.getdata(tkFileDialog.askopenfilename())
>>>>>
>>>>> In [5]: imshow(image)
>>>>> Out[5]:<matplotlib.image.AxesImage object at 0x03BCA170>
>>>>>
>>>>> In [6]: close()
>>>>>
>>>>> In [7]: imshow(image,origin='lower')
>>>>> Out[7]:<matplotlib.image.AxesImage object at 0x0440E170>
>>>>>
>>>>> In [8]: close()
>>>>>
>>>>> In [9]: imshow(image[100:3600,100:3600],origin='lower')
>>>>> Out[9]:<matplotlib.image.AxesImage object at 0x045D9FB0>
>>>>>
>>>>> In [10]: Exception in Tkinter callback
>>>>> Traceback (most recent call last):
>>>>>        File "C:\app\Python2.6\lib\lib-tk\Tkinter.py", line 1410, in 
>>>>> __call__
>>>>>          return self.func(*args)
>>>>>        File "C:\app\Python2.6\lib\lib-tk\Tkinter.py", line 495, in callit
>>>>>          func(*args)
>>>>>        File 
>>>>> "C:\app\Python2.6\lib\site-packages\matplotlib\backends\backend_tkagg.py",
>>>>>  line 263, in
>>>>> idle_draw
>>>>>          self.draw()
>>>>>        File 
>>>>> "C:\app\Python2.6\lib\site-packages\matplotlib\backends\backend_tkagg.py",
>>>>>  line 248, in draw
>>>>>          FigureCanvasAgg.draw(self)
>>>>>        File 
>>>>> "C:\app\Python2.6\lib\site-packages\matplotlib\backends\backend_agg.py", 
>>>>> line 394, in draw
>>>>>          self.figure.draw(self.renderer)
>>>>>        File "C:\app\Python2.6\lib\site-packages\matplotlib\artist.py", 
>>>>> line 55, in draw_wrapper
>>>>>          draw(artist, renderer, *args, **kwargs)
>>>>>        File "C:\app\Python2.6\lib\site-packages\matplotlib\figure.py", 
>>>>> line 798, in draw
>>>>>          func(*args)
>>>>>        File "C:\app\Python2.6\lib\site-packages\matplotlib\artist.py", 
>>>>> line 55, in draw_wrapper
>>>>>          draw(artist, renderer, *args, **kwargs)
>>>>>        File "C:\app\Python2.6\lib\site-packages\matplotlib\axes.py", line 
>>>>> 1946, in draw
>>>>>          a.draw(renderer)
>>>>>        File "C:\app\Python2.6\lib\site-packages\matplotlib\artist.py", 
>>>>> line 55, in draw_wrapper
>>>>>          draw(artist, renderer, *args, **kwargs)
>>>>>        File "C:\app\Python2.6\lib\site-packages\matplotlib\image.py", 
>>>>> line 354, in draw
>>>>>          im = self.make_image(renderer.get_image_magnification())
>>>>>        File "C:\app\Python2.6\lib\site-packages\matplotlib\image.py", 
>>>>> line 569, in make_image
>>>>>          transformed_viewLim)
>>>>>        File "C:\app\Python2.6\lib\site-packages\matplotlib\image.py", 
>>>>> line 201, in _get_unsampled_image
>>>>>          x = self.to_rgba(self._A, self._alpha)
>>>>>        File "C:\app\Python2.6\lib\site-packages\matplotlib\cm.py", line 
>>>>> 193, in to_rgba
>>>>>          x = self.norm(x)
>>>>>        File "C:\app\Python2.6\lib\site-packages\matplotlib\colors.py", 
>>>>> line 820, in __call__
>>>>>          result = (val-vmin) / (vmax-vmin)
>>>>>        File "C:\app\Python2.6\lib\site-packages\numpy\ma\core.py", line 
>>>>> 3673, in __div__
>>>>>          return divide(self, other)
>>>>>        File "C:\app\Python2.6\lib\site-packages\numpy\ma\core.py", line 
>>>>> 1077, in __call__
>>>>>          m |= filled(domain(da, db), True)
>>>>>        File "C:\app\Python2.6\lib\site-packages\numpy\ma\core.py", line 
>>>>> 772, in __call__
>>>>>          return umath.absolute(a) * self.tolerance>= umath.absolute(b)
>>>>> MemoryError
>>>>>
>>>>>
>>>>> Thanks for any help,
>>>>> -robert
>>>>>
>>>>
>>>> These are previous discussions on the issue:
>>>>
>>>> <http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg14727.html>
>>>> <http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg19815.html>
>>>> <http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg19614.html>
>>>>
>>>> Christoph
>>>>
>>> The first 2 discussions lead to suggestions of more memory on a 64-bit 
>>> installation, but that
>>> doesn't seem like a great solution.  I use other image processing software 
>>> (ImageJ and IDL) and
>>> neither has any trouble with my images.  As I mentioned ImageJ uses 1/10th 
>>> the memory for the same
>>> display, or about 1 byte of memory for 1 byte of image.  I think matplotlib 
>>> should aim for the same.
>>>     I also think it should free up memory when the image is closed, but 
>>> maybe I'm not doing the right
>>> thing.  Is there something else I should be doing to free up memory?
>>>
>>> Things are even worse with plot.
>>>
>>> I'll file a bug report as Benjamin suggests.
>> Please file it in the "enhancement" category, not as a "bug".  The
>> difficulty that mpl has with images is the result of a design decision
>> long ago; as Christoph notes, mpl works primarily with float64 rgba,
>> which is horribly memory inefficient, but is very general and works fine
>> so long as the image is not too large.  uint8 is already used in some
>> circumstances.  I don't know how hard it would be to simply switch to
>> uint8 for images, or to make that an option, perhaps for all color
>> specification.  It may involve getting into arcana of the extension code
>> and the agg library, which is a daunting prospect for most of us,
>> certainly for me.  I agree entirely that a major reduction in memory
>> usage would be good; patches, or a mpl branch to achieve that, are welcome.
>>
>> Eric
> I'll put it in as an enhancement, but I'm still unsure if there is a bug in
> there as well.  Is there something I should be doing to clear memory after the
> first figure is closed other than close()?  I don't understand why memory 
> usage
> grows each time I replot, but I'm pretty sure it isn't desireable behavior.  
> As
> I mentioned, this effect is worse with plot.
>
> So is this a bug or improper usage?
>
> As for how to implement a fix for memory usage, I'll let you folks figure that
> out.  But it seems that if I want a grayscale image, I could reduce memory 
> usage
> by 4 if matplotlib could turn rgba into intensity.
>
> -robert
>
> ------------------------------------------------------------------------------
> Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
> Finally, a world-class log management solution at an even better price-free!
> Download using promo code Free_Logger_4_Dev2Dev. Offer expires
> February 28th, so secure your free ArcSight Logger TODAY!
> http://p.sf.net/sfu/arcsight-sfd2d
> _______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>

------------------------------------------------------------------------------
Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
Finally, a world-class log management solution at an even better price-free!
Download using promo code Free_Logger_4_Dev2Dev. Offer expires 
February 28th, so secure your free ArcSight Logger TODAY! 
http://p.sf.net/sfu/arcsight-sfd2d
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to