将大矩阵转换为灰度图像

时间:2011-10-08 04:10:42

标签: python image matrix grayscale

我有一个3,076,568个二进制值(1和0)的NumPy数组。我想将其转换为矩阵,然后转换为Python中的灰度图像。

然而,当我尝试将数组重新整形为1,538,284 x 1,538,284矩阵时,我收到内存错误。

如何减小矩阵的大小,使其变成适合屏幕的图像,而不会丢失唯一性/数据?

此外,我如何将其变成灰度图像?

任何帮助或建议将不胜感激。谢谢。

4 个答案:

答案 0 :(得分:18)

你的“二进制值”数组是一个字节数组吗?

如果是这样,您可以在调整大小后使用Pillow):

from PIL import Image
im = Image.fromarray(arr)

然后im.show()看到它。

如果您的数组只有0和1(1位深度或黑白),则可能需要将其乘以255

im = Image.fromarray(arr * 255)

这是一个例子:

>>> arr = numpy.random.randint(0,256, 100*100) #example of a 1-D array
>>> arr.resize((100,100))
>>> im = Image.fromarray(arr)
>>> im.show()

Random image

编辑(2018):

这个问题写于2011年,Pillow因为在加载mode='L'时需要使用fromarray参数而发生了变化。

同样在下面的评论中也有人说arr.astype(np.uint8)也是必需的,但我还没有测试过它

答案 1 :(得分:7)

实际上不需要使用PIL,您可以使用pyplot直接绘制数组(见下文)。要保存到文件,您可以使用plt.imsave('fname.png', im)

enter image description here

以下代码。

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)

您也可以使用plt.show(im)在新窗口中显示图像。

答案 2 :(得分:2)

您可以使用scipy.misc.toimageim.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")

给出了

enter image description here

答案 3 :(得分:0)

如果您的PC中有一个带有某些数据(图像)的txt文件,为了将这些数据可视化为灰度图像,您可以使用:

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()