У меня есть около 200 изображений в градациях серого в формате PNG, которые хранятся в таком каталоге.
1.png
2.png
3.png
...
...
200.png
Я хочу импортировать все изображения PNG в виде массивов NumPy. Как я могу это сделать?
У меня есть около 200 изображений в градациях серого в формате PNG, которые хранятся в таком каталоге.
1.png
2.png
3.png
...
...
200.png
Я хочу импортировать все изображения PNG в виде массивов NumPy. Как я могу это сделать?
Используя только 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
. Смотрите ответ чарльза.
Немного опоздал на вечеринку, но текущий ответ устарел.
Согласно документу, 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
Это также можно сделать с помощью класса 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())
Если вы загружаете изображения, вы, вероятно, собираетесь работать с одним или обоими из 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)
Единственное различие, о котором нужно знать, заключается в следующем:
Таким образом, одно изображение размером 256 * 256 создаст матрицы размера (3, 256, 256) с opencv и (256, 256, 3) с использованием matplotlib.
Я немного поменял, и он работал так, сбрасывался в один массив, при условии, что все изображения имеют одинаковые размеры.
png = []
for image_path in glob.glob("./train/*.png"):
png.append(misc.imread(image_path))
im = np.asarray(png)
print 'Importing done...', im.shape
Использование (очень) часто используемого пакета предпочтительнее:
import matplotlib.pyplot as plt
im = plt.imread('image.png')