Turning a Large Matrix into a Grayscale Image
I have a NumPy array of 3,076,568 binary values (1s and 0s). I would like to convert this to a matrix, and then to a grayscale image in Python.
However, when I try to reshape the array into a 1,538,284 x 1,538,284 matrix, I get a memory error.
H开发者_StackOverflow中文版ow can I reduce the size of the matrix so that it will turn into an image that will fit on a screen without losing the uniqueness/data?
Furthermore, how would I turn it into a grayscale image?
Any help or advice would be appreciated. Thank you.
Your array of "binary values" is an array of bytes?
If so, you can do (using Pillow) after resizing it:
from PIL import Image
im = Image.fromarray(arr)
And then im.show()
to see it.
If your array has only 0's and 1's (1-bit depth or b/w) you may have to multiply it to 255
im = Image.fromarray(arr * 255)
Here an example:
>>> arr = numpy.random.randint(0,256, 100*100) #example of a 1-D array
>>> arr.resize((100,100))
>>> im = Image.fromarray(arr)
>>> im.show()
Edit (2018):
This question was written in 2011 and Pillow changed ever since requiring to use the mode='L'
parameter when loading with fromarray
.
Also on comments below it was said arr.astype(np.uint8)
was needed as well, but I have not tested it
Using PIL is not really needed, you can plot the array directly with pyplot (see below). To save to a file, you could use plt.imsave('fname.png', im)
.
Code below.
import numpy as np
import matplotlib.pyplot as plt
x = (np.random.rand(1754**2) < 0.5).astype(int)
im = x.reshape(1754, 1754)
plt.gray()
plt.imshow(im)
You can also use plt.show(im)
to display image in new window.
You can do so with scipy.misc.toimage
and im.save("foobar.png")
:
#!/usr/bin/env python
# your data is "array" - I just made this for testing
width, height = 512, 100
import numpy as np
array = (np.random.rand(width*height) < 0.5).astype(int)
array = array.reshape(height, width)
# what you need
from scipy.misc import toimage
im = toimage(array)
im.save("foobar.png")
which gives
If you have as example a txt file in your PC with some data (an image), in order to visualize such data as gray scale image you can use this:
with open("example.txt", "r") as f:
data = [i.strip("\n").split() for i in f.readlines()]
data1 = np.array(data, dtype=float)
plt.figure(1)
plt.gray()
plt.imshow(data1)
plt.show()
精彩评论