Подтвердить что ты не робот

Импорт PNG файлов в Numpy?

У меня есть около 200 изображений в градациях серого в формате PNG, которые хранятся в таком каталоге.

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

Я хочу импортировать все изображения PNG в виде массивов NumPy. Как я могу это сделать?

4b9b3361

Ответ 1

Используя только 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

UPDATE

Согласно документу, scipy.misc.imread устарела, начиная с SciPy 1.0.0, и будет удалена в 1.2.0. Подумайте об использовании imageio.imread instead. Смотрите ответ чарльза.

Ответ 2

Немного опоздал на вечеринку, но текущий ответ устарел.

Согласно документу, 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')

Edit:

Чтобы загрузить все файлы *.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

Ответ 3

Это также можно сделать с помощью класса Image библиотеки 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())

Ответ 4

Если вы загружаете изображения, вы, вероятно, собираетесь работать с одним или обоими из matplotlib и opencv для манипулирования и просмотра изображений.

По этой причине я обычно использую их устройства чтения изображений и добавляю их в списки, из которых я делаю массив 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 загружает каналы последний.

Таким образом, одно изображение размером 256 * 256 создаст матрицы размера (3, 256, 256) с opencv и (256, 256, 3) с использованием matplotlib.

Ответ 5

Я немного поменял, и он работал так, сбрасывался в один массив, при условии, что все изображения имеют одинаковые размеры.

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

im = np.asarray(png)

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

Ответ 6

Использование (очень) часто используемого пакета предпочтительнее:

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