将大矩阵转为灰度图像

12 投票
4 回答
64386 浏览
提问于 2025-04-17 03:55

我有一个包含3,076,568个二进制值(1和0)的NumPy数组。我想把它转换成一个矩阵,然后再转换成一幅灰度图像,使用Python来实现。

但是,当我尝试把这个数组重新调整成一个1,538,284 x 1,538,284的矩阵时,出现了内存错误。

我该如何减少矩阵的大小,以便它能变成一幅适合在屏幕上显示的图像,同时又不丢失数据的独特性呢?

另外,我该如何把它转换成灰度图像呢?

任何帮助或建议都非常感谢。谢谢。

4 个回答

3

你可以使用 scipy.misc.toimage 这个工具,然后用 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")

这样做会得到下面的效果:

这里是图片描述

12

其实用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) 来在新窗口中显示图片。

23

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

如果是的话,你可以在调整大小后使用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有了变化,现在在用 fromarray 加载时需要加上 mode='L' 参数。

另外在下面的评论中提到,可能还需要 arr.astype(np.uint8),但我没有测试过。

撰写回答