私はこうして配列を作成しました:
import numpy as np
data = np.zeros( (512,512,3), dtype=np.uint8)
data[256,256] = [255,0,0]
私がこれにしたいことは、512x512画像の中央に単一の赤い点を表示することです。(少なくとも、そもそも...残りはそこから理解できると思います)
私はこうして配列を作成しました:
import numpy as np
data = np.zeros( (512,512,3), dtype=np.uint8)
data[256,256] = [255,0,0]
私がこれにしたいことは、512x512画像の中央に単一の赤い点を表示することです。(少なくとも、そもそも...残りはそこから理解できると思います)
回答:
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()
(w,h,3)
で配列を作成しますが(h,w,3)
、PILでのインデックス付けはnumpyでのインデックス付けとは異なるため、そうする必要があります。関連する質問があります:stackoverflow.com/questions/33725237/...
(h,w,3)
。(上記のように修正されました。)最初の軸の長さは配列の行数、2番目の軸の長さは列数と考えることができます。したがって(h, w)
、「高さ」h
と「幅」の配列に対応しw
ます。Image.fromarray
この配列を高さh
と幅の画像に変換しw
ます。
img.show()
ipythonノートブックでは動作しません。img_pil = Image.fromarray(img, 'RGB') display(img_pil.resize((256,256), PIL.Image.LANCZOS))
以下はうまくいくはずです:
from matplotlib import pyplot as plt
plt.imshow(data, interpolation='nearest')
plt.show()
Jupyter Notebook / labを使用している場合は、matplotlibをインポートする前に次のインラインコマンドを使用します。
%matplotlib inline
plt.gray()
は、コードで一度呼び出して、以下のすべてのグラフをグレースケールに切り替えることをお勧めします。OPが望むものではありませんが、それでも知っておくと良いでしょう。
squeeze()
三次元を排除するために:plt.imshow(data.squeeze())
最短パスはscipy
、次のようにを使用することです。
from scipy.misc import toimage
toimage(data).show()
これには、PILまたは枕もインストールする必要があります。
PILまたは枕を必要とする同様のアプローチですが、別のビューアを呼び出す場合があります。
from scipy.misc import imshow
imshow(data)
scipy.misc.imshow(data)
。
toimage
はscipy-1.0.0で廃止され、1.2.0で削除されました。代わりにPillow'sが使用されていImage.fromarray
ます。
pygameを使用すると、ウィンドウを開いて、表面をピクセルの配列として取得し、そこから好きなように操作できます。numpy配列をサーフェス配列にコピーする必要がありますが、pygameサーフェス自体で実際のグラフィックス操作を実行するよりもはるかに遅くなります。
より簡単な答えがあることは知っていますが、これは実際に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=' ')
枕のfromarrayを使用して、例えば:
from PIL import Image
from numpy import *
im = array(Image.open('image.jpg'))
Image.fromarray(im).show()
Pythonの画像ライブラリは numpyのアレイを用いて画像を表示することができます。サンプルコードについては、このページをご覧ください。
編集:そのページの下部にあるメモが言うように、これをはるかに簡単にする最新のリリースノートを確認する必要があります:
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))