numpy配列を画像に変換(および表示)するにはどうすればよいですか?


228

私はこうして配列を作成しました:

import numpy as np
data = np.zeros( (512,512,3), dtype=np.uint8)
data[256,256] = [255,0,0]

私がこれにしたいことは、512x512画像の中央に単一の赤い点を表示することです。(少なくとも、そもそも...残りはそこから理解できると思います)


1
stackoverflow.com/questions/902761/…も参照してください。ただし、PILを使用できないという制約がありました。
Peter Hansen

受け入れられた回答をピーターに変更することを検討していただけますか?numpy配列の周りにオブジェクトをラップする必要性を回避し、イメージを表示するための一時ファイルの書き込みを回避します。
Josiah Yoder

回答:


225

PILを使用して画像を作成(および表示)できます。

from PIL import Image
import numpy as np

w, h = 512, 512
data = np.zeros((h, w, 3), dtype=np.uint8)
data[0:256, 0:256] = [255, 0, 0] # red patch in upper left
img = Image.fromarray(data, 'RGB')
img.save('my.png')
img.show()

3
バグがあるようです。サイズ(w,h,3)で配列を作成しますが(h,w,3)、PILでのインデックス付けはnumpyでのインデックス付けとは異なるため、そうする必要があります。関連する質問があります:stackoverflow.com/questions/33725237/...
fdermishin

1
@ user502144:私のエラーを指摘してくれてありがとう。形の配列を作成する必要がありました(h,w,3)。(上記のように修正されました。)最初の軸の長さは配列の行数、2番目の軸の長さは列数と考えることができます。したがって(h, w)、「高さ」hと「幅」の配列に対応しwます。Image.fromarrayこの配列を高さhと幅の画像に変換しwます。
unutbu

1
img.show()ipythonノートブックでは動作しません。img_pil = Image.fromarray(img, 'RGB') display(img_pil.resize((256,256), PIL.Image.LANCZOS))
mrgloom

@unutbuこの方法は、画像...歪めるようだstackoverflow.com/questions/62293077/...
ルドヴィコVerniani

285

以下はうまくいくはずです:

from matplotlib import pyplot as plt
plt.imshow(data, interpolation='nearest')
plt.show()

Jupyter Notebook / labを使用している場合は、matplotlibをインポートする前に次のインラインコマンドを使用します。

%matplotlib inline 

3
これはPILよりも正確です。PILは配列値を再スケーリング/正規化しますが、pyplotは実際のRGB値をそのまま使用します。
GaryO 2013年

21
多分知っているかもしれません:グレースケール画像を表示したい場合plt.gray()は、コードで一度呼び出して、以下のすべてのグラフをグレースケールに切り替えることをお勧めします。OPが望むものではありませんが、それでも知っておくと良いでしょう。
チェルノ

2
保存する方法は?
user334639

ファイル "<ipython-input-29-29c784f62838>"、39行目plt.show()^ SyntaxError:無効な構文
Mona Jalal

1
@Cernoまた、グレースケール画像は(h、w、1)ではなく、(h、w)の形状を持つ必要があります。あなたは使用することができるsqueeze()三次元を排除するために:plt.imshow(data.squeeze())
ジョサイアYoderの

51

最短パスはscipy、次のようにを使用することです。

from scipy.misc import toimage
toimage(data).show()

これには、PILまたは枕もインストールする必要があります。

PILまたは枕を必要とする同様のアプローチですが、別のビューアを呼び出す場合があります。

from scipy.misc import imshow
imshow(data)

したがって、このメソッドはpython 3.5と互換性がありません...?
クリストファー

@bordeo、なぜ3.5と互換性がないのですか?それは単なるインポートといくつかの関数呼び出しです。
Peter Hansen、

PILは3.5と互換性がありません(インストールされません)
Christopher

1
Ftr:を直接使用すると、これをさらに短縮できますscipy.misc.imshow(data)
dtk

3
toimageはscipy-1.0.0で廃止され、1.2.0で削除されました。代わりにPillow'sが使用されていImage.fromarrayます。
シド

4

pygameを使用すると、ウィンドウを開いて、表面をピクセルの配列として取得し、そこから好きなように操作できます。numpy配列をサーフェス配列にコピーする必要がありますが、pygameサーフェス自体で実際のグラフィックス操作を実行するよりもはるかに遅くなります。


3

例を使用してnumpy配列に保存された画像を表示する方法(Jupyterノートブックで機能)

より簡単な答えがあることは知っていますが、これは実際にnumpy配列から画像が溺れる方法を理解するのに役立ちます。

読み込み例

from sklearn.datasets import load_digits
digits = load_digits()
digits.images.shape   #this will give you (1797, 8, 8). 1797 images, each 8 x 8 in size

1つの画像の配列を表示

digits.images[0]
array([[ 0.,  0.,  5., 13.,  9.,  1.,  0.,  0.],
       [ 0.,  0., 13., 15., 10., 15.,  5.,  0.],
       [ 0.,  3., 15.,  2.,  0., 11.,  8.,  0.],
       [ 0.,  4., 12.,  0.,  0.,  8.,  8.,  0.],
       [ 0.,  5.,  8.,  0.,  0.,  9.,  8.,  0.],
       [ 0.,  4., 11.,  0.,  1., 12.,  7.,  0.],
       [ 0.,  2., 14.,  5., 10., 12.,  0.,  0.],
       [ 0.,  0.,  6., 13., 10.,  0.,  0.,  0.]])

100個の画像を視覚化するための空の10 x 10サブプロットを作成する

import matplotlib.pyplot as plt
fig, axes = plt.subplots(10,10, figsize=(8,8))

100画像のプロット

for i,ax in enumerate(axes.flat):
    ax.imshow(digits.images[i])

結果:

ここに画像の説明を入力してください

何をしaxes.flatますか? numpy列挙子を作成するので、オブジェクトを描画するために軸を反復できます。 例:

import numpy as np
x = np.arange(6).reshape(2,3)
x.flat
for item in (x.flat):
    print (item, end=' ')

2

枕のfromarrayを使用して、例えば:

from PIL import Image
from numpy import *

im = array(Image.open('image.jpg'))
Image.fromarray(im).show()

1

Pythonの画像ライブラリは numpyのアレイを用いて画像を表示することができます。サンプルコードについては、このページをご覧ください。

編集:そのページの下部にあるメモが言うように、これをはるかに簡単にする最新のリリースノートを確認する必要があります:

http://effbot.org/zone/pil-changes-116.htm


これは質問の答えにはなりません
john ktejik

0

matplotlibでそうするための補足。コンピュータビジョンタスクを行うのに便利です。dtype = int32でデータを取得したとしましょう

from matplotlib import pyplot as plot
import numpy as np

fig = plot.figure()
ax = fig.add_subplot(1, 1, 1)
# make sure your data is in H W C, otherwise you can change it by
# data = data.transpose((_, _, _))
data = np.zeros((512,512,3), dtype=np.int32)
data[256,256] = [255,0,0]
ax.imshow(data.astype(np.uint8))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.