【发布时间】:2015-10-01 21:04:57
【问题描述】:
我在这样的目录中存储了大约 200 张灰度 PNG 图像。
1.png
2.png
3.png
...
...
200.png
我想将所有 PNG 图像导入为 NumPy 数组。 我该怎么做?
【问题讨论】:
我在这样的目录中存储了大约 200 张灰度 PNG 图像。
1.png
2.png
3.png
...
...
200.png
我想将所有 PNG 图像导入为 NumPy 数组。 我该怎么做?
【问题讨论】:
根据doc,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')
编辑:
要加载特定文件夹中的所有*.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
【讨论】:
os 到ls 并获取文件名,但有更好的方法吗?也许你应该编辑添加glob
glob 仅在目录树中找到与某个“通配符”路径(可以包含通配符等)匹配的文件,所以我不确定您所说的“无效 png”是什么意思glob 会忽略错误”,因为 glob 只查看文件名,而对您的图像一无所知。
仅使用 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 1.0.0 开始不推荐使用 scipy.misc.imread,并将在 1.2.0 中删除。考虑使用imageio.imread instead。见the answer by Charles。
【讨论】:
glob.glob("./train/*.png")
这也可以通过PIL library 的Image 类来完成:
from PIL import Image
import numpy as np
im_frame = Image.open(path_to_file + 'file.png')
np_frame = np.array(im_frame.getdata())
注意:.getdata() 可能不需要 - np.array(im_frame) 也应该可以工作
【讨论】:
.getdata()。 np.array(im_frame) 也应该可以工作。
首选使用(非常)常用的包:
import matplotlib.pyplot as plt
im = plt.imread('image.png')
【讨论】:
如果您正在加载图像,您可能会使用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 的单个图像将使用 opencv 生成大小为 (3, 256, 256) 的矩阵,使用 matplotlib 生成 (256, 256, 3) 大小的矩阵。
【讨论】:
我做了一点改动,它就像这样工作,转储到一个数组中,前提是所有图像都具有相同的尺寸。
png = []
for image_path in glob.glob("./train/*.png"):
png.append(misc.imread(image_path))
im = np.asarray(png)
print 'Importing done...', im.shape
【讨论】:
im = np.reshape(num_images,32,32,3)效果很好!:-)
我喜欢内置的 pathlib 库,因为有 directory= Path.cwd() 这样的快速选项
与 opencv 一起,将 pngs 读取到 numpy 数组非常容易。
在此示例中,您甚至可以检查图像的前缀。
from pathlib import Path
import cv2
prefix = "p00"
suffix = ".png"
directory= Path.cwd()
file_names= [subp.name for subp in directory.rglob('*') if (prefix in subp.name) & (suffix == subp.suffix)]
file_names.sort()
print(file_names)
all_frames= []
for file_name in file_names:
file_path = str(directory / file_name)
frame=cv2.imread(file_path)
all_frames.append(frame)
print(type(all_frames[0]))
print(all_frames[0] [1][1])
输出:
['p000.png', 'p001.png', 'p002.png', 'p003.png', 'p004.png', 'p005.png', 'p006.png', 'p007.png', 'p008.png', 'p009.png']
<class 'numpy.ndarray'>
[255 255 255]
【讨论】:
读取一张图片:
im = PIL.Image.open('path/to/your/image')
im = np.array(im)
迭代读取多个图像。
这类似于this,但更简单(不需要.getdata())。
【讨论】: