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?
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
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 .
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
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())
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:
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.
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
L'utilisation d'un paquet (très) couramment utilisé est préférable:
import matplotlib.pyplot as plt
im = plt.imread('image.png')