【问题标题】:Read all images from subfolder, resize them and save them with their original name in Python?从子文件夹中读取所有图像,调整它们的大小并用 Python 中的原始名称保存它们?
【发布时间】:2020-01-29 11:12:38
【问题描述】:

我想从不同的子文件夹中读取所有图像,调整它们的大小并用它们的原始名称保存它们。但是,我收到如下所示的错误。如何解决此错误?

示例代码:

from PIL import Image

import os

size = (112, 112)

def resize_img(path,dest_path):

    name_list = []
    label_list = []
    resized_list = []
    if not os.path.exists(dest_path):
        os.makedirs(dest_path)
    folder_list = os.listdir(path)
    for num_imgs,folder in enumerate(folder_list):
        print(str(num_imgs) + " : " + folder)
        files_path = path + "/" + folder
        image_list = os.listdir(files_path)
        name_list.append(folder)
        for image_name in image_list:
            image_path = path + "/" + folder + "/" + image_name
            print(image_path)
            img = Image.open(image_path)
            label_list.append(img)
            for image in label_list:
                image = image.resize((112, 112))
                resized_list.append(image)
                for (i,new) in enumerate (resized_list):
                    new.save('{}{}{}'.format(dest_path+'/'+str(label_list)+str('_'), i+1, '.jpg'))

resize_img('C:/Users/aunglay/PycharmProjects/FR_using_cnn/Face_database',
           'C:/Users/aunglay/PycharmProjects/FR_using_cnn/resized_images')

出现错误:

Traceback (most recent call last):

  File "C:/Users/aunglay/PycharmProjects/FR_using_cnn/smaple2.py", line 30, in <module>
    'C:/Users/aunglay/PycharmProjects/FR_using_cnn/resized_images')

  File "C:/Users/aunglay/PycharmProjects/FR_using_cnn/smaple2.py", line 27, in resize_img
    new.save('{}{}{}'.format(dest_path+'/'+str(label_list)+str('_'), i+1, '.jpg'))

  File "C:\Users\aunglay\Anaconda3\envs\tensorflow_env\lib\site-packages\PIL\Image.py", line 2099, in save
    fp = builtins.open(filename, "w+b")
OSError: [Errno 22] Invalid argument: 'C:/Users/aunglay/PycharmProjects/FR_using_cnn/resized_images/[<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=64x64 at 0x2D7ACFD508>]_1.jpg'

【问题讨论】:

    标签: python python-imaging-library


    【解决方案1】:

    问题似乎出在代码的最后一行:

    new.save('{}{}{}'.format(dest_path+'/'+str(label_list)+str('_'), i+1, '.jpg'))
    

    具体来说,label_list 将是一个图像对象列表,并且不会包含您刚刚读取的图像的名称。另外,我认为最后两个 for 循环是不必要的。您可以更改代码:

    for image_name in image_list:
            image_path = path + "/" + folder + "/" + image_name
            print(image_path)
            img = Image.open(image_path)
            label_list.append(img)
            for image in label_list:
                image = image.resize((112, 112))
                resized_list.append(image)
                for (i,new) in enumerate (resized_list):
                    new.save('{}{}{}'.format(dest_path+'/'+str(label_list)+str('_'), i+1, '.jpg'))
    

    到:

    for image_name in image_list:
            image_path = path + "/" + folder + "/" + image_name
            print(image_path)
            img = Image.open(image_path)
            label_list.append(img)
            resized_list.append(img.resize((112, 112)))
            resized_list[-1].save(dest_path+'/'+image_name+'.jpg')
    

    这应该实现你所描述的。

    编辑: 关于 cmets 中的问题:

    def resize_img(path,dest_path):
    
       name_list = []
       label_list = []
       resized_list = []
       folder_list = os.listdir(path)
       for num_imgs,folder in enumerate(folder_list):
           if not os.path.exists(dest_path+'/'+folder):
               os.makedir(dest_path+'/'+folder)
           print(str(num_imgs) + " : " + folder)
           files_path = path + "/" + folder
           image_list = os.listdir(files_path)
           name_list.append(folder)
           for image_name in image_list:
              image_path = path + "/" + folder + "/" + image_name
              print(image_path)
              img = Image.open(image_path)
              label_list.append(img)
              resized_list.append(img.resize((112, 112)))
              resized_list[-1].save(dest_path+'/'+folder+'/'+image_name+'.jpg'
    

    这应该实现您所描述的。您需要为要创建的每个子文件夹调用 os.mkdir(),因此它必须位于第一个 for 循环内。

    【讨论】:

    • 谢谢你。这是工作。但是所有调整大小的图像将仅保存在一个文件夹中,不再有子文件夹。我该如何解决这个问题:在 face_database 文件夹中有 5 个子文件夹,但在调整图像大小后,它们只保存在一个文件夹中。我想问你“resized_list[-1]”中的[-1]是什么?请。
    • resized_list[-1] 表示resized_list 中的最后一个元素。关于文件夹,您是否要将每组图像保存在不同的子文件夹中,每个子文件夹都以读取图像的文件夹命名?
    • 是的,当然。在代码中:image_path = path + "/" + folder + "/" + image_name, path = 'C:/Users/aunglay/PycharmProjects/FR_using_cnn/Face_database'。在这个文件夹中,“Face_database”有 5 个不同的 sub_folder。我想从不同的 sub_folder 读取每个图像并想要调整大小,然后想将调整大小的图像及其原始名称保存到读取图像的每个 sub_folder。感谢您的帮助。
    • 您可以通过在最后一个 for 循环之前添加 os.mkdir(dest_path+''/"+folder) 来在目标中创建具有相同名称的子文件夹,然后将最后一行替换为 resized_list[- 1].save(dest_path+'/'+文件夹+'/'+image_name+'.jpg')
    • 请给我看例子。我确实尝试过但没有工作并且发生错误。如何在最后一个 for 循环之前添加 os.mkdir?请
    猜你喜欢
    • 2021-08-31
    • 1970-01-01
    • 2020-11-10
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多