当前位置:   article > 正文

【python】将文件夹下图片随机抽取一定数量或比例,并复制到新文件夹

图片随机抽取

前言

我们在深度学习或者其他任务中经常需要处理图像数据,往往需要从一堆图片中抽取一部分进行训练或者验证。
源文件夹往往是这样的:

可以看到,源文件夹下有许多子文件夹,子文件夹里面才会有各种图片,需要我们先遍历源文件夹里面的所有图片再随机选取,最后复制选好的图片到新文件夹中。

处理后的新文件夹如图所示:
在这里插入图片描述

下面就提供一个python脚本实现从源文件夹中随机选择指定数量或者指定比例的图片,复制到一个新的文件夹,再重新命名的功能。


提示:以下代码可以根据需要自行更改参数,注意看注释

一、从源文件夹提取指定数量的图片

import os
import random
import shutil

def getFileList(dir, Filelist, ext=None):
    """
    获取文件夹及其子文件夹中文件列表
    输入 dir:文件夹根目录
    输入 ext: 扩展名
    返回: 文件路径列表
    """
    newDir = dir
    if os.path.isfile(dir):
        if ext is None:
            Filelist.append(dir)
        else:
            if ext in dir[-3:]:
                Filelist.append(dir)

    elif os.path.isdir(dir):
        for s in os.listdir(dir):
            newDir = os.path.join(dir, s)
            getFileList(newDir, Filelist, ext)

    return Filelist

# 把下面改成你的参数设置
org_img_folder = 'C:/Users/xxx/org'  # 待处理源文件夹路径
tar_img_folder = 'C:/Users/xxx/tar'     # 移动到新文件夹路径
picknumber = 8000  # 需要从源文件夹中抽取的图片数量
img_format = 'jpg' # 需要处理的图片后缀
i = 1  # 选取后的图片从1开始命名

# 检索源文件夹并随机选择图片
imglist = getFileList(org_img_folder, [], img_format)  # 获取源文件夹及其子文件夹中图片列表
samplelist = random.sample(imglist, picknumber)  # 获取随机抽样后的图片列表

print('本次执行检索到 ' + str(len(imglist)) + ' 张图像\n')
print('本次共随机抽取 ' + str(len(samplelist)) + ' 张图像\n')

# 复制选取好的图片到新文件夹中,并重新命名
new_img_folder = tar_img_folder
for imgpath in samplelist:
    name = str(i).zfill(5)  # 设置图片名为5位数,即从00001开始重新命名
    new_img_folder = os.path.join(tar_img_folder, name + '.' + img_format)
    i = i + 1 
    # 如果不需要重命名就把上面三行注释掉
    shutil.copy(imgpath, new_img_folder)  #  复制图片到新文件夹

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

二、从源文件夹提取指定比例的图片

import os
import random
import shutil

def getFileList(dir, Filelist, ext=None):
    """
    获取文件夹及其子文件夹中文件列表
    输入 dir:文件夹根目录
    输入 ext: 扩展名
    返回: 文件路径列表
    """
    newDir = dir
    if os.path.isfile(dir):
        if ext is None:
            Filelist.append(dir)
        else:
            if ext in dir[-3:]:
                Filelist.append(dir)

    elif os.path.isdir(dir):
        for s in os.listdir(dir):
            newDir = os.path.join(dir, s)
            getFileList(newDir, Filelist, ext)

    return Filelist

# 把下面改成你的参数设置
org_img_folder = 'C:/Users/xxx/org'  # 待处理源文件夹路径
tar_img_folder = 'C:/Users/xxx/tar'     # 移动到新文件夹路径
pickpercent = 0.1  # 需要从源文件夹中抽取的图片比例
img_format = 'png' # 需要处理的图片后缀
i = 1  # 选取后的图片从1开始命名

# 检索源文件夹并随机选择图片
imglist = getFileList(org_img_folder, [], img_format)  # 获取源文件夹及其子文件夹中图片列表
picknumber = int(len(imglist)*pickpercent)
samplelist = random.sample(imglist, picknumber)  # 获取随机抽样后的图片列表

print('本次执行检索到 ' + str(len(imglist)) + ' 张图像\n')
print('本次共随机抽取百分之 ' + str(pickpercent*100) + '% 的图像\n')

# 复制选取好的图片到新文件夹中,并重新命名
new_img_folder = tar_img_folder
for imgpath in samplelist:
    name = str(i).zfill(5)  # 设置图片名为5位数,即从00001开始重新命名
    new_img_folder = os.path.join(tar_img_folder, name + '.' + img_format)
    i = i + 1 
    # 如果不需要重命名就把上面三行注释掉
    shutil.copy(imgpath, new_img_folder)  # 复制图片到新文件夹
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

参考文献

  1. python实现将子文件夹下的图片复制到新的文件夹并重命名: http://t.csdn.cn/YDpp0
  2. python 遍历文件夹下所有图片: http://t.csdn.cn/hf6dH
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/711219
推荐阅读
相关标签
  

闽ICP备14008679号