python学习——cv2与imageio读取多个图像到numpy数组(仅限于读入图片文件,且未做预处理)

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

使用cv2读入图像数据

方法一:


 
   
   
   
   
  1. import cv2
  2. import numpy as np
  3. import os
  4. # 图片路径
  5. imgpath = "E:/Desktop/celeba_64"
  6. imgfiles = os.listdir(imgpath)
  7. # 提前创建好numpy数组的大小,其应与所需数据集大小相等
  8. X_train = np.empty(( 50000, 64, 64, 3))
  9. i = 0
  10. # 开始读取图片,后加[:,:,::-1],将其转换为RGB格式
  11. for file in imgfiles:
  12. img = cv2.imread(imgpath + "/" + file)[:,:,:: -1]
  13. X_train[i] = img
  14. i = i + 1

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

 用时:

方法二:


 
   
   
   
   
  1. import cv2
  2. import numpy as np
  3. import os
  4. # 图片路径
  5. imgpath = "E:/Desktop/celeba_64"
  6. imgfiles = os.listdir(imgpath)
  7. # 先用List保存图片的数组,后加[:,:,::-1],将其转换为RGB格式
  8. imgs = []
  9. for file in imgfiles:
  10. img = cv2.imread(imgpath + "/" + file)[:,:,:: -1]
  11. imgs.append(img)
  12. # 将List转化为numpy数组,也可使用dtype=np.float32
  13. imgs = np.array(imgs,dtype=float)
  14. print(imgs.shape)

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

用时:

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

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

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

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

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

 

使用imageio读入图像数据

方法一:


 
   
   
   
   
  1. import numpy as np
  2. import os
  3. import imageio
  4. imgpath = "E:/Desktop/celeba_64"
  5. imgfiles = os.listdir(imgpath)
  6. imgs1=[]
  7. for file in imgfiles:
  8. img = imageio.imread(imgpath + "/" + file)
  9. imgs1.append(img)
  10. imgs1 = np.array(imgs1,dtype=float)

 

方法二:与方法一类似


 
   
   
   
   
  1. import numpy as np
  2. import os
  3. import imageio
  4. imgpath = "E:/Desktop/celeba_64"
  5. imgfiles = os.listdir(imgpath)
  6. imgs = []
  7. for file in imgfiles:
  8. img = np.array(imageio.imread(imgpath + "/" + file), dtype=float)
  9. imgs.append(img)
  10. imgs = np.array(imgs)

用时:

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

 

你可能感兴趣的:(深度学习及Python相关知识)