我有一个由子文件夹组成的数据集文件夹,每个子文件夹必须包含8张图像,但其中一些图像少于8张,例如3、4、5、6、7或8我想通过从第一个可用图像到最后一个图像重复现有图像,直到达到8张图像,将所有图像均等化为8张图像,然后停止并将所有图像保存在同一目录路径中。
我循环访问图像并按以下代码读取它们,但是我遇到了一个问题,即如何重复它们,直到每个文件夹达到8张图像为止。
[['10005' '10005']]
答案 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