改代码令人头疼,在网上搜了许多代码达不到想要的效果,索性将代码组合在一起实现了我想要的功能。
以下代码能够同时将数据集和标签随机裁剪为指定大小,数据集和对应标签名称是一样的,数据集和标签分别在不同的文件夹。
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)