web-dev-qa-db-ja.com

大きなマトリックスをグレースケール画像に変換する

3,076,568個のバイナリ値(1と0)のNumPy配列があります。これをマトリックスに変換してから、Pythonでグレースケール画像に変換したいと思います。

ただし、配列を1,538,284 x 1,538,284の行列に再形成しようとすると、メモリエラーが発生します。

マトリックスのサイズを小さくして、一意性/データを失うことなく画面に収まる画像にするにはどうすればよいですか?

さらに、どうすればグレースケール画像に変換できますか?

どんな助けやアドバイスもいただければ幸いです。ありがとうございました。

11
user748176

「バイナリ値」の配列はバイトの配列ですか?

もしそうなら、あなたはそれをサイズ変更した後に( を使用して)行うことができます:

_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年に作成され、fromarrayをロードするときに_mode='L'_パラメーターを使用する必要があったため、Pillowは変更されました。

また、以下のコメントでは、arr.astype(np.uint8)も必要であると言われていましたが、私はそれをテストしていません

20
JBernardo

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)を使用して、新しいウィンドウに画像を表示することもできます。

8
wim

_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

2
Martin Thoma

例として、いくつかのデータ(画像)を含むtxtファイルがPCにある場合、グレースケール画像などのデータを視覚化するために、これを使用できます。

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