将PNG文件导入Numpy?

时间:2015-07-13 14:28:40

标签: python image-processing numpy png

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

1.png
2.png
3.png
...
...
200.png

我想将所有PNG图像导入Numpy,然后想要应用k-means使用k-means(scikit)生成补丁字典

有人知道一个python库可以将这些图像加载到numpy中吗?

7 个答案:

答案 0 :(得分:47)

派对迟到了,但目前的答案现已弃用。

根据docscipy.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 libraryImage类来完成:

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)

如果要加载图像,则很可能将使用matplotlibopencv中的一个或两个来操作和查看图像。

由于这个原因,我倾向于使用他们的图像读取器,并将其附加到列表中,然后从中创建一个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)的矩阵。

答案 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]