首页 > 解决方案 > 使用python显示来自多个文件夹的随机图像

问题描述

python v 3.7.3
matplotlib3.1.1
运行在Google colab

我有一个包含 101 个文件夹的数据集,每个文件夹大约有 750 张图像。我想从任何给定的文件夹中随机显示其中的 16 张图像。这些图像是这样组织的:

火车目录

等等。

我尝试创建遍历每个文件夹并选择随机图像 16 次 TOTAL(不是每个文件夹)的代码。

到目前为止,这是我的代码:

import random
from PIL import Image 

for folder in os.listdir(train_folder):
  for image in os.listdir(train_folder + '/' + folder):
    img = os.path.join(train_folder, folder, image)
    #print(img)

    plt.figure(1, figsize=(15, 9))
    plt.axis('off')
    n = 0
    for i in range(16):
      n += 1
      random_img = random.choice(img)
      imgs = imread(random_img)
      plt.subplot(4, 4, n)
      axis('off')
      plt.imshow(imgs)

plt.show()

这是错误:

FileNotFoundError                         Traceback (most recent call last)
<ipython-input-19-2f47ab853e7c> in <module>()
     13       n += 1
     14       random_img = random.choice(img)
---> 15       imgs = imread(random_img)
     16       plt.subplot(4, 4, n)
     17       #plt.subplots_adjust(hspace = 0.5, wspace = 0.5)

1 frames
/usr/local/lib/python3.6/dist-packages/PIL/Image.py in open(fp, mode)
   2764 
   2765     if filename:
-> 2766         fp = builtins.open(filename, "rb")
   2767         exclusive_fp = True
   2768 

FileNotFoundError: [Errno 2] No such file or directory: '6'

我不确定在哪里提出随机选择其中一张图像的论据。我还认为我使用的结构可能不是最有效的,因为它可能需要对文件夹进行多次迭代。最好只浏览一次文件夹,然后选择 16 张图像。在python中有没有一种有效的方法来做到这一点?我还不知道它的局限性。

标签: pythonmatplotlibrandom

解决方案


os.path.join 连接路径,但它没有列出您可以从中随机选择路径名称的列表。您还需要分离生成列表并从中随机选择。尝试类似:

import random
from PIL import Image 

images = []
for folder in os.listdir(train_folder):
  for image in os.listdir(train_folder + '/' + folder):
    images.append(os.path.join(train_folder, folder, image))

plt.figure(1, figsize=(15, 9))
plt.axis('off')
n = 0
for i in range(16):
  n += 1
  random_img = random.choice(images)
  imgs = imread(random_img)
  plt.subplot(4, 4, n)
  axis('off')
  plt.imshow(imgs)

plt.show()

希望有帮助!


推荐阅读