17

I found my answer in a previous post: Saving a Numpy array as an image. The only problem being, there isn't much instruction on using the PyPNG module.

There are only a few examples online-- http://packages.python.org/pypng/ex.html#numpy http://nullege.com/codes/search/png.Writer.write

But what do I do in light of .write errors like this:

Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/png.py", line 638, in write nrows = self.write_passes(outfile, rows) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/png.py", line 783, in write_passes extend(row) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/png.py", line 780, in <lambda> return lambda sl: f(map(int, sl)) TypeError: argument 2 to map() must support iteration 

Here's where the error happens in my code, PCA_tool.py (The error comes after "folder.write(outfilename, PrincipalComponent"):

#PrincipalComponent.save(path+'transform_'+str(each)+'.png', format='PNG') outfilename = open(str(path)+'transformed/transform_'+str(each)+'.png', 'wb') folder = png.Writer(m,n,greyscale=True) folder.write(outfilename, PrincipalComponent) outfilename.close() sys.exit(0) 

I'm trying to save a 8400 element numpy.ndarray as a n=80 column, m=105 row greyscale png image.

Thanks,

3
  • 2
    PIL, for all it's problems, is at least more widely used, and therefore a bit better supported. pythonware.com/products/pil You'd probably be better off just doing any rescaling you need to (e.g. rescale and convert to uint8) and then Image.fromarray(data).save('whatever.png') Commented Aug 2, 2011 at 16:16
  • I should say, PrincipalComponent is of numpy.ndarray type and not a list. I can rescale the array using PrincipalComponent.reshape(row,col), but conversion of a numpy.ndarray into a writable image file? Commented Aug 2, 2011 at 18:43
  • That's (a numpy.ndarray) what Image.fromarray expects, for what it's worth. Commented Aug 2, 2011 at 18:57

3 Answers 3

40

You might be better off using PIL:

from PIL import Image import numpy as np data = np.random.random((100,100)) #Rescale to 0-255 and convert to uint8 rescaled = (255.0 / data.max() * (data - data.min())).astype(np.uint8) im = Image.fromarray(rescaled) im.save('test.png') 
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks for the help Joe! The image files are reading out as expected.
how will u do the same if your data is 3 dimensiona data into rgb format
how can save this variable as an image file on server?
0
import matplotlib.pyplot as plt import numpy as np plt.imshow(np.random.random(100, 100)) plt.savefig('') 

3 Comments

Hello, consider adding an explanation of your code.
Welcome to Stack Overflow! Thank you for this code snippet, which may provide some immediate help. A proper explanation would greatly improve its educational value by showing why this is a good solution to the problem, and would make it more useful to future readers with similar, but not identical, questions. Please edit your answer to add explanation, and give an indication of what limitations and assumptions apply.
this doesn't work as expected as it include the matplotlib frame
-1

It would be best to use scipy for it.

from scipy.misc import imsave # x is the array you want to save imsave("image.png", x) 

Full documentation is here: https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.misc.imsave.html

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.