¿Importando archivos PNG a Numpy?

Tengo alrededor de 200 imágenes PNG en escala de grises almacenadas en un directorio como este.

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

Quiero importar todas las imágenes PNG a Numpy y luego quiero aplicar k-means para generar un diccionario de parches utilizando k-means (scikit)

¿Alguien conoce una biblioteca de python que pueda cargar estas imágenes en una gran cantidad en una mosca?

Usando solo scipy, glob y teniendo PIL instalado ( pip install pillow ), puede usar el método imread de scipy :

 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 

ACTUALIZAR

Según el documento, scipy.misc.imread está en desuso al iniciar SciPy 1.0.0 y se eliminará en 1.2.0. Considera usar imageio.imread instead . Vea la respuesta por Carlos .

Poco tarde a la fiesta, pero la respuesta actual ahora está en desuso.

Según el documento , scipy.misc.imread está en desuso al iniciar SciPy 1.0.0 y se eliminará en 1.2.0. Considera usar imageio.imread en imageio.imread lugar.

Ejemplo:

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

También puedes usar imageio para cargar desde fonts de fantasía:

 im = imageio.imread('http://sofes.miximages.com/python/Wikipedia_Logo_1.0.png') 

Editar:

Para cargar todos los archivos *.png en una carpeta específica, puede usar el paquete 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 

Esto también se puede hacer con la clase de Image de la biblioteca 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 está cargando imágenes, es probable que esté trabajando con uno o ambos de matplotlib y opencv para manipular y ver las imágenes.

Por esta razón, tiendo a usar sus lectores de imágenes y a añadirlos a las listas, de los cuales hago una matriz 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 única diferencia a tener en cuenta es la siguiente:

  • opencv carga los canales primero
  • Matplotlib carga los canales al final .

Por lo tanto, una sola imagen que tenga un tamaño de 256 * 256 producirá matrices de tamaño (3, 256, 256) con opencv y (256, 256, 3) usando matplotlib.

Cambié un poco y funcionó así, volcado en una sola matriz, siempre que todas las imágenes sean de las mismas dimensiones.

 png = [] for image_path in glob.glob("./train/*.png"): png.append(misc.imread(image_path)) im = np.asarray(png) print 'Importing done...', im.shape