Повторите некоторые изображения в папке - PullRequest
0 голосов
/ 10 мая 2019

У меня папка набора данных состоит из подпапок, каждая из подпапок должна содержать 8 изображений, но некоторые из них содержат менее 8, например 3, 4, 5, 6, 7 или, может быть, 8 Я хочу выровнять их все в 8 изображений, повторяя существующие изображения, начиная с первого, доступного для последнего, до достижения 8 изображений, затем остановите и сохраните их все в одном и том же пути к каталогу.

Я сделал цикл для доступа к изображениям и прочитал их в виде кода ниже, но я столкнулся с проблемой, как я могу повторять их, пока не будет достигнуто 8 изображений для каждой папки.

ID_Paths = "path\of\dataset\folder"
listing = os.listdir(ID_Paths)
for fold_Path in listing:
    print("NOW input images of new individual... ", fold_Path)
    image_fold = os.listdir(ID_Paths + "\\" + fold_Path)
    for file in image_fold:
        segments = os.listdir(ID_Paths + "\\" + fold_Path + "\\" + file)
        im = ID_Paths + "\\" + fold_Path + "\\" + file + "\\" + segments
        test_image = cv2.imread(im)

1 Ответ

0 голосов
/ 10 мая 2019

В вашем ответе все еще есть ряд неуказанных вещей, но в интересах предоставления вам чего-то, что, мы надеемся, будет, по крайней мере, близко к тому, что вы хотите, я выложу ответ.Он использует несколько функций из модуля 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
...