web-dev-qa-db-fra.com

Importer des fichiers PNG dans Numpy?

J'ai environ 200 images PNG en niveaux de gris stockées dans un répertoire comme celui-ci.

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

Je veux importer toutes les images PNG en tant que tableaux NumPy. Comment puis-je faire ceci?

37
pbu

En utilisant simplement scipy, glob et après avoir installé PIL (pip install pillow) vous pouvez utiliser la méthode imread de scip:

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

MISE À JOUR

Selon le doc, scipy.misc.imread est obsolète à partir de SciPy 1.0.0 et sera supprimé de la version 1.2.0. Pensez à utiliser imageio.imread instead. Voir la réponse de Charles .

29
spoorcc

Un peu tard dans la soirée, mais la réponse actuelle est maintenant obsolète.

Selon le doc , scipy.misc.imread est obsolète à partir de SciPy 1.0.0 et sera supprimé de la version 1.2.0. Envisagez d'utiliser imageio.imread à la place.

Exemple:

import imageio

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

Vous pouvez également utiliser imageio pour charger à partir de sources fantaisies:

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

Modifier:

Pour charger tous les *.png fichiers d’un dossier spécifique, vous pouvez utiliser le package 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

Cela peut aussi être fait avec la classe Image de la bibliothèque PIL :

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

Si vous chargez des images, vous travaillerez probablement avec l’un ou les deux éléments matplotlib et opencv pour manipuler et afficher les images.

Pour cette raison, j'ai tendance à utiliser leurs lecteurs d'images et à les ajouter aux listes, à partir desquelles je crée un tableau 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)

La seule différence à prendre en compte est la suivante:

  • opencv charge des canaux premier
  • matplotlib charge les canaux dernier.

Ainsi, une seule image de 256 * 256 de taille produirait des matrices de taille (3, 256, 256) avec opencv et (256, 256, 3) en utilisant matplotlib.

3
n1k31t4

J'ai un peu changé et cela a fonctionné comme ceci, vidé dans un seul tableau, à condition que toutes les images aient les mêmes dimensions.

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

L'utilisation d'un paquet (très) couramment utilisé est préférable:

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