有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)
用时: