有50000张64*64*3的人脸图像,放在E:\Desktop\celeba_64 目录文件夹下,要读取所有图片到numpy数组中
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中如何创建一个空的数组/矩阵?
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)
用时: