在文件夹中重复一些图像

时间:2019-05-09 22:47:27

标签: python save repeat cv2

我有一个由子文件夹组成的数据集文件夹,每个子文件夹必须包含8张图像,但其中一些图像少于8张,例如3、4、5、6、7或8我想通过从第一个可用图像到最后一个图像重复现有图像,直到达到8张图像,将所有图像均等化为8张图像,然后停止并将所有图像保存在同一目录路径中。

我循环访问图像并按以下代码读取它们,但是我遇到了一个问题,即如何重复它们,直到每个文件夹达到8张图像为止。

[['10005' '10005']] 

1 个答案:

答案 0 :(得分:0)

您的答案中仍有许多未说明的事情,但是为了给您提供希望至少与您想要的东西接近的利益,我将发布答案。它使用itertools模块中的几个函数来为复制的文件生成文件名。它只是使用shutil.copyfile()函数而不是使用cv2模块将图像文件复制到内存中,然后再次将其写出,从而复制了图像文件。不要对图像做其他任何事情。

我试图使变量名非常易于理解,并在关键位置添加了注释。

from itertools import count, cycle
import os
import os.path
from shutil import copyfile

ID_Paths = r"path\of\dataset\folder"
REQ_NUM_IMGS = 8  # Required number of image files in each subfolder.

# Subfolders in ID_Paths.
subfolders = [subfolder for subfolder in os.listdir(ID_Paths)
                  if os.path.isdir(os.path.join(ID_Paths, subfolder))]

# Equalize number of (image) files in each subfolder.
for subfolder in subfolders:
    print("NOW input images of new individual...", subfolder)

    # Assumes all files in subfolder are image files.
    subfolder_path = os.path.join(ID_Paths, subfolder)
    image_filenames = os.listdir(subfolder_path)
    print(' original files:', image_filenames)

    shortage = REQ_NUM_IMGS - len(image_filenames)
    if shortage > 0:  # Need repeats?
        for i, src_img_filename in zip(count(REQ_NUM_IMGS+1),
                                       cycle(image_filenames)):
            src_imgfile_path = os.path.join(subfolder_path, src_img_filename)
            img_filename, img_ext = os.path.splitext(src_img_filename)
            suffix = '_' + str(i)
            dst_img_filename = os.path.join(subfolder_path,
                                            img_filename+suffix+img_ext)
            dst_imgfile_path = os.path.join(subfolder_path, dst_img_filename)
            print('   copying: {}\n'
                  '        to: {}'.format(src_imgfile_path, dst_imgfile_path))
            copyfile(src_imgfile_path, dst_imgfile_path)
            shortage -= 1
            if shortage == 0:
                break