将 PNG 文件导入 Numpy?
Importing PNG files into 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
。参见 。
我做了一点改动,它像这样工作,转储到一个数组中,前提是所有图像的尺寸都相同。
png = []
for image_path in glob.glob("./train/*.png"):
png.append(misc.imread(image_path))
im = np.asarray(png)
print 'Importing done...', im.shape
按照doc, scipy.misc.imread
is deprecated starting SciPy 1.0.0, and will be removed in 1.2.0. Consider using 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
这也可以通过 PIL library 的 Image
class 来完成:
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)
也应该有效
如果您正在加载图像,您可能会使用 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 加载通道 last.
因此,大小为 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 数组非常容易。
在此示例中,您甚至可以检查图像的前缀。
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]
读入一张图片:
import PIL.Image
im = PIL.Image.open('path/to/your/image')
im = np.array(im)
迭代读取多张图片。
这个答案类似于 但更简单(不需要 .getdata()
)。
如果您更喜欢标准库:
#IMPORTANT: This Code only works with Python>=3.6
Directory="."#Your directory
import os
import tkinter
import numpy
tk=tkinter.Tk()
tk.overrideredirect(1)
tk.geometry("0x0")
Items=[]
for i in os.listdir(Directory):
fn=Directory+os.sep+i
imgArray=[]
image=tkinter.PhotoImage(file=fn)
for w in range(image.width()):
entry=[]
for h in range(image.height()):
entry.append(image.get(w,h))
imgArray.append(entry)
imgArray=numpy.array(imgArray)
Items.append(imgArray)
tk.destroy()
我有大约 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
。参见
我做了一点改动,它像这样工作,转储到一个数组中,前提是所有图像的尺寸都相同。
png = []
for image_path in glob.glob("./train/*.png"):
png.append(misc.imread(image_path))
im = np.asarray(png)
print 'Importing done...', im.shape
按照doc, scipy.misc.imread
is deprecated starting SciPy 1.0.0, and will be removed in 1.2.0. Consider using 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
这也可以通过 PIL library 的 Image
class 来完成:
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)
也应该有效
如果您正在加载图像,您可能会使用 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 加载通道 last.
因此,大小为 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 数组非常容易。
在此示例中,您甚至可以检查图像的前缀。
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]
读入一张图片:
import PIL.Image
im = PIL.Image.open('path/to/your/image')
im = np.array(im)
迭代读取多张图片。
这个答案类似于 .getdata()
)。
如果您更喜欢标准库:
#IMPORTANT: This Code only works with Python>=3.6
Directory="."#Your directory
import os
import tkinter
import numpy
tk=tkinter.Tk()
tk.overrideredirect(1)
tk.geometry("0x0")
Items=[]
for i in os.listdir(Directory):
fn=Directory+os.sep+i
imgArray=[]
image=tkinter.PhotoImage(file=fn)
for w in range(image.width()):
entry=[]
for h in range(image.height()):
entry.append(image.get(w,h))
imgArray.append(entry)
imgArray=numpy.array(imgArray)
Items.append(imgArray)
tk.destroy()