将PNG文件导入Numpy?

pbu*_*pbu 39 python png numpy image

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

1.png
2.png
3.png
...
...
200.png
Run Code Online (Sandbox Code Playgroud)

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

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

Cha*_*les 55

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

根据doc,scipy.misc.imread不推荐使用SciPy 1.0.0,并将在1.2.0中删除.考虑imageio.imread改用.

例:

import imageio

im = imageio.imread('my_image.png')
print(im.shape)
Run Code Online (Sandbox Code Playgroud)

您还可以使用imageio从花哨的资源加载:

im = imageio.imread('http://upload.wikimedia.org/wikipedia/commons/d/de/Wikipedia_Logo_1.0.png')
Run Code Online (Sandbox Code Playgroud)

编辑:

要加载*.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
Run Code Online (Sandbox Code Playgroud)

  • Downvoter,如果您能通过告诉我要改进什么来帮助我使此答案更好,将不胜感激! (2认同)
  • 在这种情况下,开发人员应该选择是否应该引发异常并停止执行或以特定方式处理。如果没有上下文,则首选提高。 (2认同)

spo*_*rcc 28

使用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
Run Code Online (Sandbox Code Playgroud)

UPDATE

根据doc,scipy.misc.imread不推荐使用SciPy 1.0.0,并将在1.2.0中删除.考虑使用imageio.imread instead.查看查尔斯的答案.

  • `scipy.misc.imread`已弃用.请参阅下面的答案! (2认同)

Nir*_*Nir 11

最好使用(非常)常用的包:

import matplotlib.pyplot as plt
im = plt.imread('image.png')
Run Code Online (Sandbox Code Playgroud)

  • 我大部分时间已经导入了 matplotlib,所以这基本上没有额外的成本。matplotlib 不总是有 imread 之类的吗?其他答案中使用的包有什么优点? (3认同)

mrk*_*mrk 7

这也可以通过PIL库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())
Run Code Online (Sandbox Code Playgroud)

  • 我认为甚至不需要`.getdata()`。`np.array(im_frame)` 也应该有效。 (2认同)
  • 要将其获取为 RGB,请使用 `img = np.asarray(Image.open('file.png').convert('RGB'))` (2认同)

n1k*_*1t4 6

如果您正在加载图片,你可能要与一个或两个的合作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)
Run Code Online (Sandbox Code Playgroud)

唯一需要注意的区别如下:

  • opencv首先加载频道
  • matplotlib最后加载通道。

因此,大小为 256*256 的单个图像将使用 opencv 生成大小为 (3, 256, 256) 的矩阵,使用 matplotlib 生成大小为 (256, 256, 3) 的矩阵。


zab*_*bop 5

要读取一张图像:

import PIL.Image
im = PIL.Image.open('path/to/your/image')
im = np.array(im)
Run Code Online (Sandbox Code Playgroud)

迭代读取多个图像。

这个答案与此类似,但更简单(不需要.getdata())。