Python 将PNG文件导入Numpy?

Python 将PNG文件导入Numpy?,python,image,numpy,png,Python,Image,Numpy,Png,我有大约200个灰度PNG图像存储在这样一个目录中 1.png 2.png 3.png ... ... 200.png 我想将所有PNG图像作为NumPy数组导入。 我如何才能做到这一点?仅使用scipy、glob并安装PIL(pip安装枕头))您可以使用scipy的方法: 更新 根据文档,从scipy 1.0.0开始,scipy.misc.imread已被弃用,并将在1.2.0中删除。考虑使用 IMAIOO.IMAAD,而不是。请参阅。我做了一些更改,它是这样工作的,只要所有图像的尺寸相同,

我有大约200个灰度PNG图像存储在这样一个目录中

1.png
2.png
3.png
...
...
200.png
我想将所有PNG图像作为NumPy数组导入。
我如何才能做到这一点?

仅使用scipy、glob并安装PIL(
pip安装枕头)
)您可以使用scipy的方法:

更新
根据文档,从scipy 1.0.0开始,
scipy.misc.imread
已被弃用,并将在1.2.0中删除。考虑使用<代码> IMAIOO.IMAAD,而不是。请参阅。

我做了一些更改,它是这样工作的,只要所有图像的尺寸相同,就可以转储到一个数组中

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

im = np.asarray(png)

print 'Importing done...', im.shape
根据scipy.misc.imread从scipy 1.0.0开始就被弃用,并将在1.2.0中删除。考虑使用,

例如:

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

这也可以通过以下
图像
类完成:


注意:
.getdata()
可能不需要-
np.array(im\u frame)
也应该可以使用如果您正在加载图像,您可能需要使用
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的单个图像将使用opencv生成大小为(3,256,256)的矩阵,并使用matplotlib生成大小为(256,256,3)的矩阵。

首选使用(非常)常用的包:

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

我喜欢内置的pathlib库,因为它有一些快速选项,比如
directory=Path.cwd()
与opencv一起,将PNG读取到numpy阵列非常容易。 在本例中,您甚至可以检查图像的前缀

从pathlib导入路径
进口cv2
prefix=“p00”
后缀=“.png”
directory=Path.cwd()
file_names=[directory.rglob('*')中subp的subp.name if(subp.name中的前缀)&(suffix==subp.suffix)]
文件名。排序()
打印(文件名)
所有_帧=[]
对于文件名中的文件名:
file\u path=str(目录/文件名)
frame=cv2.imread(文件路径)
所有帧。追加(帧)
打印(键入(所有帧[0]))
打印(所有_帧[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]
['p000.png','p001.png','p002.png','p003.png','p004.png','p005.png','p006.png','p007.png','p008.png','p009.png']
[255 255 255]

只需更改为
glob.glob(“./train/*.png”)
完美。很好的一站式解决方案。我已将图像存储到np.array中,但由于数组(shape==(num\u images,)与每个图像(shape==(32,32,3)),因此遇到了问题。您的解决方案(加上
im=np.resporate(num\u images,32,32,3)
工作得非常出色:-)打字错误:我甚至不需要上面的重塑呼叫。在我恼火的黑客中,将其按摩成所需的形状变得越来越混乱。感谢直接路径。Downvoter,如果你能告诉我需要改进的地方,帮助我更好地回答这个问题,那将非常感谢!我不是Downvoter,但问题是将图像列表加载到文件夹中。你能修改你的答案来反映这一点吗,不仅仅是1-200.png,而且如果png有随机名称,那会对我有很大帮助。我确信我可以使用
os
ls
并获取文件名,但有没有更好的方法?也许你应该编辑以添加
glob
,另外,记住添加一个try-catch,因为imread可能抛出ValueError。我没有编辑权限,否则我会为您更新它。:)在这种情况下,开发人员应该选择是否引发异常并停止执行或以特定方式处理。在没有上下文的情况下,提升是首选。嗯,
glob
只会在目录树中查找与特定“globbing”路径(可以包含通配符等)匹配的文件,所以我不确定“glob忽略无效png错误”是什么意思由于glob只查看文件名,对您的图像一无所知。我大部分时间已经导入了matplotlib,所以这基本上没有额外的成本。matplotlib不总是有imread之类的吗?其他答案中使用的包有什么好处?我认为甚至不需要
.getdata()
np.array(im_frame)
也应该可以。感谢您的贡献:我在我的答案中添加了您的评论,以突出显示。我投票赞成,但.getdata()会导致错误,因此必须在没有.getdata()的情况下使用(Rob的方法)。这两种代码不一样!:raise TypeError('不支持输入类型{})。格式(npimg.dtype))TypeError:不支持输入类型int64似乎您的输入类型有问题。
import matplotlib.pyplot as plt
im = plt.imread('image.png')
['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]