使用python批量随机裁剪图片为目标大小;同时切分数据集和标签

改代码令人头疼,在网上搜了许多代码达不到想要的效果,索性将代码组合在一起实现了我想要的功能。

以下代码能够同时将数据集和标签随机裁剪为指定大小,数据集和对应标签名称是一样的,数据集和标签分别在不同的文件夹。

import os
# coding=gbk
import cv2
import numpy as np

# 待裁剪的标签文件夹maskFile
# 待裁剪的图片文件夹imgFile 两者实际操作相同,如果只裁剪一类图像,如只有mask,则删除对应的裁剪图片的代码即可
maskFile = r'C:\Users\Aisin Gioro dong po\Desktop\train_label'
imgFile = r'C:\Users\Aisin Gioro dong po\Desktop\train'
# 新文件路径
new_file_path = r'C:\Users\Aisin Gioro dong po\Desktop\train1'
new_file_path_label = r'C:\Users\Aisin Gioro dong po\Desktop\train_label1'
# 判断是否存在目标文件夹,不存在则创建
if os.path.isdir(new_file_path):
    pass
else:
    os.makedirs(new_file_path)
if os.path.isdir(new_file_path_label):
    pass
else:
    os.makedirs(new_file_path_label)
list_mask = []
list_img = []
# 获取所有mask图像的绝对路径(包括图片名称)保存在list_mask列表
for root, _, fnames in sorted(os.walk(maskFile)):  # sorted() 函数对所有可迭代的对象进行排序操作;
    # os.walk()方法是用来获取指定路径下所有文件:返回三个参数的列表,os.walk(root,dirs,files)
    # ①root保存的就是当前遍历的文件夹的绝对路径;②dirs保存当前文件夹下的所有子文件夹的名称;③files保存当前文件夹下的所有文件的名称
    for fname in fnames:
        path = os.path.join(root, fname)
        list_mask.append(path)
# 获取所有img图像的绝对路径(包括图片名称)保存在list_img列表
for root, _, fnames in sorted(os.walk(imgFile)):
    for fname in fnames:
        path = os.path.join(root, fname)
        list_img.append(path)

for i in range(len(list_mask)):

    p, n = os.path.split(list_mask[i])  # os.path.split() 返回文件的路径和文件名
    pro, ext = os.path.splitext(n)  # os.path.splitext() 将文件名和扩展名分开
    print(pro)                      # 打印文件名
    mask = cv2.imread(list_mask[i])  # cv2.imread 用来从文件中读取图像
    img = cv2.imread(list_img[i])

    (h, w, c) = mask.shape      # shape返回图片的高,宽,通道数
    # os.path.basename() 输出带后缀的最后一级目录,即“图片名称.后缀名”
    basename = os.path.basename(list_mask[i])
    # 裁剪块的大小:512*512
    patchsize = 512
    # 裁剪的数量
    num_patches = 2

    for j in range(num_patches):
        rr = np.random.randint(0, h - patchsize)  # 代表随机生成一个整数:a<=随机数<=b
        cc = np.random.randint(0, w - patchsize)

        patchs = img[rr:rr + patchsize, cc:cc + patchsize, :]  # 在原图片中切出一个新图片patchs
        patchs_label = mask[rr:rr + patchsize, cc:cc + patchsize, :]
        cv2.imwrite(
            os.path.join(new_file_path, basename.split('.')[0] + '{}.png'.format(j)),
            patchs)
        cv2.imwrite(
            os.path.join(new_file_path_label, basename.split('.')[0] + '{}.png'.format(j)),
            patchs_label)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值