我有大约200个灰度PNG图像存储在这样的目录中。
1.png
2.png
3.png
...
...
200.png
我想将所有PNG图像导入Numpy,然后想要应用k-means使用k-means(scikit)生成补丁字典
有人知道一个python库可以将这些图像加载到numpy中吗?
答案 0 :(得分:47)
派对迟到了,但目前的答案现已弃用。
根据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
答案 1 :(得分:27)
使用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
。请参阅the answer by Charles。
答案 2 :(得分:4)
这也可以使用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())
答案 3 :(得分:2)
如果要加载图像,则很可能将使用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)的矩阵。
答案 4 :(得分:2)
首选使用(非常)常用的软件包:
import matplotlib.pyplot as plt
im = plt.imread('image.png')
答案 5 :(得分:1)
我改变了一点,如果所有图像尺寸相同,它会像这样工作,转储成一个单独的数组。
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 :(得分:0)
我喜欢内置的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]