将PNG文件导入Numpy?

oxcyiej7  于 2023-03-08  发布在  其他
关注(0)|答案(9)|浏览(192)

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

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

我想把所有的PNG图像导入为NumPy数组。我该怎么做?

8oomwypt

8oomwypt1#

根据docscipy.misc.imread从SciPy 1.0.0开始不建议使用,并将在1.2.0中删除。请考虑改用imageio.v3.imread
示例:

import imageio.v3 as iio

im = iio.imread('my_image.png')
print(im.shape)

您还可以使用imageio从各种不同的源加载:

im = iio.imread('http://upload.wikimedia.org/wikipedia/commons/d/de/Wikipedia_Logo_1.0.png')
  • 编辑:*

要加载特定文件夹中的所有*.png文件,可以使用glob包:

import imageio.v3 as iio
import glob

for im_path in glob.glob("path/to/folder/*.png"):
     im = iio.imread(im_path)
     print(im.shape)
     # do whatever with the image here
eit6fx6z

eit6fx6z2#

只需使用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

noj0wjuj

noj0wjuj3#

这也可以通过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())
  • 注意:可能不需要.getdata()-np.array(im_frame)也可以工作 *
csbfibhn

csbfibhn4#

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

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

knsnq2tg5#

如果要加载图像,则可能要使用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)的矩阵。

z8dt9xmd

z8dt9xmd6#

要读入一个图像:

import PIL.Image
im = PIL.Image.open('path/to/your/image')
im = np.array(im)

迭代读取多个图像。
这个答案类似于this,但更简单(不需要.getdata())。

68bkxrlz

68bkxrlz7#

我做了一些改动,它的工作原理是这样的,转储到一个数组中,假设所有的图像都是相同的维度。

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

im = np.asarray(png)

print 'Importing done...', im.shape
nfzehxib

nfzehxib8#

我喜欢内置的pathlib库,因为它有directory= Path.cwd()这样的快速选项,结合opencv,可以很容易地将pngs读取到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]
f0ofjuux

f0ofjuux9#

如果您更喜欢标准库:

#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()

相关问题