web-dev-qa-db-ja.com

PNGファイルをNumpyにインポートしますか?

このようなディレクトリには、約200個のグレースケールPNG画像が保存されています。

1.png
2.png
3.png
...
...
200.png

すべてのPNG画像をNumPy配列としてインポートしたい。これどうやってするの?

37
pbu

Scipy、globを使用してPILをインストールすると(pip install pillow)、scipyの imread メソッドを使用できます。

from scipy import misc
import glob

for image_path in glob.glob("/home/adam/*.png"):
    image = misc.imread(image_path)
    print image.shape
    print image.dtype

更新

ドキュメントによると、scipy.misc.imreadはSciPy 1.0.0以降では非推奨であり、1.2.0で削除される予定です。 imageio.imread insteadの使用を検討してください。 Charlesによる答え を参照してください。

29
spoorcc

パーティーに少し遅れましたが、現在の回答は非推奨になりました。

doc によると、scipy.misc.imreadはSciPy 1.0.0以降では非推奨であり、1.2.0で削除されます。代わりに imageio.imread の使用を検討してください。

例:

import imageio

im = imageio.imread('my_image.png')
print(im.shape)

Imageioを使用して派手なソースから読み込むこともできます。

im = imageio.imread('http://upload.wikimedia.org/wikipedia/commons/d/de/Wikipedia_Logo_1.0.png')

編集:

特定のフォルダーにある*.pngファイルをすべて読み込むには、globパッケージを使用できます。

import imageio
import glob

for im_path in glob.glob("path/to/folder/*.png"):
     im = imageio.imread(im_path)
     print(im.shape)
     # do whatever with the image here
50
Charles

これは、 PILライブラリImageクラスでも実行できます。

from PIL import Image
import numpy as np

im_frame = Image.open(path_to_file + 'file.png')
np_frame = np.array(im_frame.getdata())
5
mrk

画像をロードする場合は、matplotlibopencvの一方または両方を操作して、画像を操作および表示することになるでしょう。

このため、私は彼らの画像リーダーを使用し、それらをリストに追加し、そこからNumPy配列を作成する傾向があります。

import os
import matplotlib.pyplot as plt
import cv2
import numpy as np

# Get the file paths
im_files = os.listdir('path/to/files/')

# imagine we only want to load PNG files (or JPEG or whatever...)
EXTENSION = '.png'

# Load using matplotlib
images_plt = [plt.imread(f) for f in im_files if f.endswith(EXTENSION)]
# convert your lists into a numpy array of size (N, H, W, C)
images = np.array(images_plt)

# Load using opencv
images_cv = [cv2.imread(f) for f in im_files if f.endswith(EXTENSION)]
# convert your lists into a numpy array of size (N, C, H, W)
images = np.array(images_cv)

注意すべき唯一の違いは次のとおりです。

  • opencvはチャンネルをロードします最初
  • matplotlibはチャネルをロードしますlast

したがって、サイズが256 * 256の単一イメージは、opencvでサイズ(3、256、256)のマトリックスを生成し、matplotlibを使用して(256、256、3)を生成します。

3
n1k31t4

私は少し変更し、すべての画像が同じ次元である限り、このように機能し、1つの単一の配列にダンプされました。

png = []
for image_path in glob.glob("./train/*.png"):
    png.append(misc.imread(image_path))    

im = np.asarray(png)

print 'Importing done...', im.shape
2
pbu

(非常に)一般的に使用されるパッケージを使用することをお勧めします。

import matplotlib.pyplot as plt
im = plt.imread('image.png')
1
Nir