Превращение большой матрицы в изображение в градациях серого - PullRequest
9 голосов
/ 08 октября 2011

У меня есть массив NumPy с 3 076 568 двоичными значениями (1 с и 0 с).Я хотел бы преобразовать это в матрицу, а затем в изображение в градациях серого в Python.

Однако, когда я пытаюсь преобразовать массив в матрицу 1,538,284 x 1,538,284, я получаю ошибку памяти.

Как я могу уменьшить размер матрицы, чтобы она превратилась в изображение, которое уместится на экране без потери уникальности / данных?

Кроме того, как я могу превратить ее в изображение в градациях серого?

Буду признателен за любую помощь или совет.Спасибо.

Ответы [ 4 ]

18 голосов
/ 08 октября 2011

Ваш массив "двоичных значений" является массивом байтов?

Если это так, вы можете сделать (используя Подушка ) после изменения его размера:

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 году, и с тех пор Подушка изменилась, требуя использовать параметр mode='L' при загрузке с fromarray.

Также в комментариях ниже было сказано, что arr.astype(np.uint8) также необходимо, но я не проверял его

8 голосов
/ 08 октября 2011

Использование 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 голосов
/ 30 декабря 2015

Вы можете сделать это с 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")

, что дает

enter image description here

0 голосов
/ 22 февраля 2018

Если у вас есть, например, текстовый файл на вашем ПК с некоторыми данными (изображением), для визуализации таких данных, как изображение в оттенках серого, вы можете использовать это:

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