imshow, imsave to PIL image conversion

I have a small problem how to convert an image from matplotlib to PIL

right now doing somthing like this:

···

------------------------------------------
from scipy import *
from pylab import *
from PIL import Image

a = arange(16384).reshape(128,128)
imsave( "test.png", a, cmap=cm.summer,vmin=0,vmax=16383)
b = Image.open("test.png" )
------------------------------------------

so I have a 128x128 array, get a 128x128 size png by making use of a
colormap and get a 128x128 size PIL image. But so far I could figure out a
way to do this directly without writing a temporary png and reading it
again, which is quite slow. My important point here is to keep the the pixel
resolution.
I would be glad about some help

Regards Hans
--
View this message in context: http://old.nabble.com/imshow%2C-imsave-to-PIL-image-conversion-tp28736246p28736246.html
Sent from the matplotlib - users mailing list archive at Nabble.com.

The Image.fromarray function should do what you want. For example,

import numpy as np # note: use of “from foo import *”

import Image # is discouraged where possible

a = np.arange(128)[None,:] * np.ones(128)[:,None]

b = Image.fromarray(a)

c = np.asarray(b)

np.all(c == a)

→ True

I hope that helps,

Angus.

···

On 31 May 2010 19:49, rugspin <piet_parnie@…273…> wrote:

I have a small problem how to convert an image from matplotlib to PIL

right now doing somthing like this:


from scipy import *

from pylab import *

from PIL import Image

a = arange(16384).reshape(128,128)

imsave( “test.png”, a, cmap=cm.summer,vmin=0,vmax=16383)

b = Image.open(“test.png” )


AJC McMorland
Post-doctoral research fellow
Neurobiology, University of Pittsburgh

I have a small problem how to convert an image from matplotlib to PIL

right now doing somthing like this:


from scipy import *

from pylab import *

from PIL import Image

a = arange(16384).reshape(128,128)

imsave( “test.png”, a, cmap=cm.summer,vmin=0,vmax=16383)

b = Image.open(“test.png” )


The Image.fromarray function should do what you want. For example,

import numpy as np # note: use of “from foo import *”

import Image # is discouraged where possible

a = np.arange(128)[None,:] * np.ones(128)[:,None]

Sorry - I was playing around with a few iterations of this line, and didn’t provide the most useful one. Your example:

a = np.arange(128**2).reshape(128,128)

should also work fine.

···

On 31 May 2010 23:17, Angus McMorland <amcmorl@…287…> wrote:

On 31 May 2010 19:49, rugspin <piet_parnie@…273…> wrote:

b = Image.fromarray(a)

c = np.asarray(b)

np.all(c == a)

→ True

I hope that helps,

Angus.

AJC McMorland
Post-doctoral research fellow
Neurobiology, University of Pittsburgh

Angus McMorland-2 wrote:

I have a small problem how to convert an image from matplotlib to PIL

right now doing somthing like this:
------------------------------------------
from scipy import *
from pylab import *
from PIL import Image

a = arange(16384).reshape(128,128)
imsave( "test.png", a, cmap=cm.summer,vmin=0,vmax=16383)
b = Image.open("test.png" )
------------------------------------------

The Image.fromarray function should do what you want. For example,

import numpy as np # note: use of "from foo import *"
import Image # is discouraged where possible

a = np.arange(128)[None,:] * np.ones(128)[:,None]

Sorry - I was playing around with a few iterations of this line, and
didn't
provide the most useful one. Your example:

a = np.arange(128**2).reshape(128,128)

should also work fine.

b = Image.fromarray(a)
c = np.asarray(b)
np.all(c == a)
  -> True

I hope that helps,

Angus.

--
AJC McMorland
Post-doctoral research fellow
Neurobiology, University of Pittsburgh

------------------------------------------------------------------------------

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
matplotlib-users List Signup and Options

Thank you Angus
but that's not exactly what i was looking for. The fromarray function is
very basic, so I would have to take care of all the RGBA of the array. the
imshow and imsave functions take care of all that for example adding a
colormap. After choosing a reasonable colormap (vmin, vmax, ....) I would
like to convert this into a PIL image.

Best Regard
Hans

···

On 31 May 2010 23:17, Angus McMorland <amcmorl@...287...> wrote:

On 31 May 2010 19:49, rugspin <piet_parnie@...273...> wrote:

--
View this message in context: http://old.nabble.com/imshow%2C-imsave-to-PIL-image-conversion-tp28736246p28739401.html
Sent from the matplotlib - users mailing list archive at Nabble.com.

You may use StringIO.

from scipy import *
from pylab import *
from PIL import Image

import cStringIO

a = arange(16384).reshape(128,128)

f = cStringIO.StringIO()
imsave(f, a, cmap=cm.summer,vmin=0,vmax=16383, format="png") # you'd
better set the format explicitly.
f.reset()
b = Image.open(f)
f.close()

IHTH,

-JJ

···

On Tue, Jun 1, 2010 at 5:18 AM, rugspin <piet_parnie@...273...> wrote:

Angus McMorland-2 wrote:

On 31 May 2010 23:17, Angus McMorland <amcmorl@...287...> wrote:

On 31 May 2010 19:49, rugspin <piet_parnie@...273...> wrote:

I have a small problem how to convert an image from matplotlib to PIL

right now doing somthing like this:
------------------------------------------
from scipy import *
from pylab import *
from PIL import Image

a = arange(16384).reshape(128,128)
imsave( "test.png", a, cmap=cm.summer,vmin=0,vmax=16383)
b = Image.open("test.png" )
------------------------------------------

The Image.fromarray function should do what you want. For example,

import numpy as np # note: use of "from foo import *"
import Image # is discouraged where possible

a = np.arange(128)[None,:] * np.ones(128)[:,None]

Sorry - I was playing around with a few iterations of this line, and
didn't
provide the most useful one. Your example:

a = np.arange(128**2).reshape(128,128)

should also work fine.

b = Image.fromarray(a)
c = np.asarray(b)
np.all(c == a)
-> True

I hope that helps,

Angus.

--
AJC McMorland
Post-doctoral research fellow
Neurobiology, University of Pittsburgh

------------------------------------------------------------------------------

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
matplotlib-users List Signup and Options

Thank you Angus
but that's not exactly what i was looking for. The fromarray function is
very basic, so I would have to take care of all the RGBA of the array. the
imshow and imsave functions take care of all that for example adding a
colormap. After choosing a reasonable colormap (vmin, vmax, ....) I would
like to convert this into a PIL image.

Best Regard
Hans

--
View this message in context: http://old.nabble.com/imshow%2C-imsave-to-PIL-image-conversion-tp28736246p28739401.html
Sent from the matplotlib - users mailing list archive at Nabble.com.

------------------------------------------------------------------------------

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
matplotlib-users List Signup and Options

Thanks Jae-Joo

That's doing it, thought there might be an internal way within matplotlib,
but I could figure one.
I'm quite confused with the canvas, dpi, ...

Regards Hans

Jae-Joon Lee wrote:

···

You may use StringIO.

from scipy import *
from pylab import *
from PIL import Image

import cStringIO

a = arange(16384).reshape(128,128)

f = cStringIO.StringIO()
imsave(f, a, cmap=cm.summer,vmin=0,vmax=16383, format="png") # you'd
better set the format explicitly.
f.reset()
b = Image.open(f)
f.close()

IHTH,

-JJ

On Tue, Jun 1, 2010 at 5:18 AM, rugspin <piet_parnie@...273...> wrote:

Angus McMorland-2 wrote:

On 31 May 2010 23:17, Angus McMorland <amcmorl@...287...> wrote:

On 31 May 2010 19:49, rugspin <piet_parnie@...273...> wrote:

I have a small problem how to convert an image from matplotlib to PIL

right now doing somthing like this:
------------------------------------------
from scipy import *
from pylab import *
from PIL import Image

a = arange(16384).reshape(128,128)
imsave( "test.png", a, cmap=cm.summer,vmin=0,vmax=16383)
b = Image.open("test.png" )
------------------------------------------

The Image.fromarray function should do what you want. For example,

import numpy as np # note: use of "from foo import *"
import Image # is discouraged where possible

a = np.arange(128)[None,:] * np.ones(128)[:,None]

Sorry - I was playing around with a few iterations of this line, and
didn't
provide the most useful one. Your example:

a = np.arange(128**2).reshape(128,128)

should also work fine.

b = Image.fromarray(a)
c = np.asarray(b)
np.all(c == a)
-> True

I hope that helps,

Angus.

--
AJC McMorland
Post-doctoral research fellow
Neurobiology, University of Pittsburgh

------------------------------------------------------------------------------

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
matplotlib-users List Signup and Options

Thank you Angus
but that's not exactly what i was looking for. The fromarray function is
very basic, so I would have to take care of all the RGBA of the array.
the
imshow and imsave functions take care of all that for example adding a
colormap. After choosing a reasonable colormap (vmin, vmax, ....) I would
like to convert this into a PIL image.

Best Regard
Hans

--
View this message in context:
http://old.nabble.com/imshow%2C-imsave-to-PIL-image-conversion-tp28736246p28739401.html
Sent from the matplotlib - users mailing list archive at Nabble.com.

------------------------------------------------------------------------------

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
matplotlib-users List Signup and Options

------------------------------------------------------------------------------

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
matplotlib-users List Signup and Options

--
View this message in context: http://old.nabble.com/imshow%2C-imsave-to-PIL-image-conversion-tp28736246p28745632.html
Sent from the matplotlib - users mailing list archive at Nabble.com.

That's doing it, thought there might be an internal way within matplotlib,
but I could figure one.

I think you can use the agg backend and the corresponding Canvas'es method

canvas.tostring_rgb()

. Then you can load this in PIL by Image.fromstring.

Well, I simply send you my PIL backend. Tell me if it's still working ...

Friedrich

canvas.py (2.02 KB)

If you need more hard-core way of doing this,

a = np.arange(16384).reshape(128, 128)

from matplotlib.colors import Normalize
import matplotlib.cm as cm
norm = Normalize(vmin=0, vmax=16383)
cmap = cm.summer

A = (cmap(norm(a))*255).astype(np.uint8)

import Image
pilim = Image.fromarray(A, "RGBA")

···

On Tue, Jun 1, 2010 at 2:22 PM, rugspin <piet_parnie@...273...> wrote:

That's doing it, thought there might be an internal way within matplotlib,
but I could figure one.

Thanks Jae-Joon and Friedrich

I will try out both solutions.

Regards Hans

Jae-Joon Lee wrote:

···

On Tue, Jun 1, 2010 at 2:22 PM, rugspin <piet_parnie@...273...> wrote:

That's doing it, thought there might be an internal way within
matplotlib,
but I could figure one.

If you need more hard-core way of doing this,

a = np.arange(16384).reshape(128, 128)

from matplotlib.colors import Normalize
import matplotlib.cm as cm
norm = Normalize(vmin=0, vmax=16383)
cmap = cm.summer

A = (cmap(norm(a))*255).astype(np.uint8)

import Image
pilim = Image.fromarray(A, "RGBA")

------------------------------------------------------------------------------

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
matplotlib-users List Signup and Options

--
View this message in context: http://old.nabble.com/imshow%2C-imsave-to-PIL-image-conversion-tp28736246p28753655.html
Sent from the matplotlib - users mailing list archive at Nabble.com.