Python 将大型矩阵转换为灰度图像

Python 将大型矩阵转换为灰度图像,python,image,matrix,grayscale,Python,Image,Matrix,Grayscale,我有一个3076568二进制值(1和0)的NumPy数组。我想将其转换为矩阵,然后转换为Python中的灰度图像 但是,当我尝试将数组重新整形为1538284 x 1538284矩阵时,会出现内存错误 如何减小矩阵的大小,使其变成适合屏幕的图像,而不丢失唯一性/数据 此外,我如何将其转换为灰度图像 任何帮助或建议都将不胜感激。谢谢。您的“二进制值”数组是字节数组吗 如果是这样,可以在调整大小后执行(使用): from PIL import Image im = Image.fromarray(a

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

但是,当我尝试将数组重新整形为1538284 x 1538284矩阵时,会出现内存错误

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

此外,我如何将其转换为灰度图像

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

您的“二进制值”数组是字节数组吗

如果是这样,可以在调整大小后执行(使用):

from PIL import Image
im = Image.fromarray(arr)
然后
im.show()
查看它

如果数组只有0和1(1位深度或b/w),则可能需要将其乘以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()

编辑(2018年):

这个问题是在2011年写的,自从使用
fromarray
加载时需要使用
mode='L'
参数以来,这个问题就发生了变化


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

使用PIL并不是真的需要,你可以直接用pyplot绘制数组(见下文)。要保存到文件,可以使用
plt.imsave('fname.png',im)

代码如下

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)
将numpy导入为np
将matplotlib.pyplot作为plt导入
x=(np.random.rand(1754**2)<0.5).aType(int)
im=x.重塑(17541754)
plt.gray()
plt.imshow(im)
您还可以使用
plt.show(im)
在新窗口中显示图像。

您可以使用和
im.save(“foobar.png”)

#/usr/bin/env python
#您的数据是“数组”-我只是为了测试而做的
宽度,高度=512,100
将numpy作为np导入
数组=(np.random.rand(宽*高)<0.5.astype(int)
数组=数组。重塑形状(高度、宽度)
#你需要什么
从scipy.misc导入到图像
im=toimage(阵列)
保存(“foobar.png”)


例如,如果您的电脑中有一个包含一些数据(图像)的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()

呃。。。3076568值将是~1754x1754图像,而不是1538284x1538284图像。啊。。很晚了,我错了。:-)感谢您指出这一点。在尝试上述示例时,我遇到了一个错误“无法处理此数据类型”。我需要传递mode=“L”like:im=Image.fromarray(arr,mode=“L”)@barbolo-mine没有引发错误,它只是使整个图片变白。但是使用“L”模式修复了它,谢谢!我必须使用
arr.astype(np.uint8)
mode='L'
(如上所述)来获得正确的输出(请参阅)。
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()