python学习——cv2与imageio读取多个图像到numpy数组

有50000张64*64*3的人脸图像,放在E:\Desktop\celeba_64 目录文件夹下,要读取所有图片到numpy数组中

使用cv2读入图像数据

方法一:

import cv2
import numpy as np
import os

# 图片路径
imgpath = "E:/Desktop/celeba_64"
imgfiles = os.listdir(imgpath)

# 提前创建好numpy数组的大小,其应与所需数据集大小相等
X_train = np.empty((50000, 64, 64, 3))
i = 0

# 开始读取图片,后加[:,:,::-1],将其转换为RGB格式
for file in imgfiles:
    img = cv2.imread(imgpath + "/" + file)[:,:,::-1]
    X_train[i] = img
    i = i + 1

注意:X_train的numpy数组的dtype类型为float64 ,同时注意cv2读取的图片为BGR格式

 用时:

方法二:

import cv2
import numpy as np
import os

# 图片路径
imgpath = "E:/Desktop/celeba_64"
imgfiles = os.listdir(imgpath)

# 先用List保存图片的数组,后加[:,:,::-1],将其转换为RGB格式
imgs = []
for file in imgfiles:
    img = cv2.imread(imgpath + "/" + file)[:,:,::-1]
    imgs.append(img)

# 将List转化为numpy数组,也可使用dtype=np.float32
imgs = np.array(imgs,dtype=float)
print(imgs.shape)

注意:将List转化为numpy数组时要指定dtype类型,不然默认为unit8,会出错,同时注意cv2读取的图片为BGR格式

用时:

PS:之前想用类似List的方法,np.append(X_train, img, axis=0)方法将读取到的每一个图片依次加入到numpy数组中,但总是会出错,而且速度很慢,查了一下,解释如下:

NumPy数组存储在连续的内存块中,如果要将行或列添加到现有数组中,则需要将整个数组复制到一个新的内存块,从而为要存储的新元素创建间隙。如果重复建立一个数组,这是非常低效的。

在添加行的情况下,最好的办法是创建一个与您的数据集最终大小一样的数组,然后向其中按行添加数据。也就是类似方法一的办法。

或者一次构建只有一个列的矩阵,将它保存在列表中,直到它完成,然后才转换为一个numpy数组,即类似方法二

参考:在NumPy中如何创建一个空的数组/矩阵?

 

使用imageio读入图像数据

方法一:

import numpy as np
import os
import imageio


imgpath = "E:/Desktop/celeba_64"
imgfiles = os.listdir(imgpath)

imgs1=[]
for file in imgfiles:
        img = imageio.imread(imgpath + "/" + file)
        imgs1.append(img)

imgs1 = np.array(imgs1,dtype=float)

 

方法二:与方法一类似

import numpy as np
import os
import imageio

imgpath = "E:/Desktop/celeba_64"
imgfiles = os.listdir(imgpath)

imgs = []

for file in imgfiles:
        img = np.array(imageio.imread(imgpath + "/" + file), dtype=float)
        imgs.append(img)

imgs = np.array(imgs)

用时:

综合来说,推荐用cv2来读取图像,速度快很多

 

你可能感兴趣的:(python)