我有一个包含 3,076,568 个二进制值(1 和 0)的 NumPy 数组。我想将其转换为矩阵,然后转换为 Python 中的灰度图像。
但是,当我尝试将数组重塑为 1,538,284 x 1,538,284 矩阵时,出现内存错误。
如何减小矩阵的大小,使其变成适合屏幕的图像而不会丢失唯一性/数据?
此外,我如何将其变成灰度图像?
任何帮助或建议将不胜感激。谢谢你。
您的“二进制值”数组是字节数组?
如果是这样,您可以在调整大小后执行(使用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()
编辑(2018):
这个问题是在 2011 年编写的,并且 Pillow 自从要求mode='L'
在加载时使用参数后发生了变化fromarray
。
同样在下面的评论中,据说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)
您还可以使用plt.show(im)
在新窗口中显示图像。
您可以使用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")
这使
例如,如果您的 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()