- 将png图片粘贴到jpg图片上,针对某类数据做数据增强
- 对所有png图片进行随机resize(我设置的范围为680~780,可自己手动修改)、随机顺时针、逆时针旋转0-30°
- 支持批量粘贴png图片到大量图片上
- 代码有详细注释
- 生成的图片命名规则:主图_蒙层图_粘贴次数.jpg
- 效果图如下,展示一张的效果:
png图:
被粘贴的图:
粘贴后的效果:
代码如下:
from PIL import Image
import random
import os
from tqdm import tqdm
import configparser
def paste_enhance(png_path, images_paste_path, save_images_path, paste_num):
os.makedirs(save_images_path, exist_ok=True)
files = os.listdir(png_path)
paste_files = os.listdir(images_paste_path)
for png_img in files:
png_name = os.path.splitext(png_img)[0]
im = Image.open(f"{png_path}/{png_img}") # 读取蒙层
for n in range(paste_num): # 蒙层在主图上粘贴的次数,默认一次
for paste_img in tqdm(paste_files):
main_img_name = os.path.splitext(paste_img)[0]
main_img = Image.open(f"{images_paste_path}/{paste_img}") # 读取被粘贴的主图
w, h = main_img.size
random_result = dict()
random_result['num_resize'] = random.randint(680, 780) # 闭区间,保存随机resize尺寸
random_result['rotate_F'] = random.randint(1, 30) # 随机逆时针旋转角度、随机顺时针旋转角度
random_result['rotate_T'] = random.randint(-30, -1) # 随机顺时针旋转角度
random_result['status'] = random.randint(-1, 0) # 随机抽状态,-1逆时针,0顺时针
try:
random_result['cut_x_left'] = random.randint(0, w - random_result['num_resize']) # 随机主图-蒙层图范围的左上角x
random_result['cut_y_left'] = random.randint(0, h - random_result['num_resize']) # 随机主图-蒙层图范围的左上角y
except ValueError: # 蒙层图resize比主图尺寸大,那就不粘贴
continue
img_resize = im.resize((random_result['num_resize'], random_result['num_resize'])) # resize图片
if random_result['status'] == -1: # 随机旋转图片
img_rotate = img_resize.rotate(random_result['rotate_F'])
else:
img_rotate = img_resize.rotate(random_result['rotate_T'])
x_left, y_left = random_result['cut_x_left'], random_result['cut_y_left']
x_right = random_result['cut_x_left'] + random_result['num_resize']
y_right = random_result['cut_y_left'] + random_result['num_resize']
main_img.paste(img_rotate, (x_left, y_left, x_right, y_right), img_rotate) # 粘贴蒙层图片
save_img = main_img.convert('RGB') # 转换为jpg图片
save_img.save(f"{save_images_path}/{main_img_name}_{png_name}_{n}.jpg")
if __name__ == "__main__":
cf = configparser.ConfigParser()
cf.read('config.ini', encoding='utf-8')
png = cf.get('config', 'png')
images_path = cf.get('config', 'images_path')
save_path = cf.get('config', 'save_path')
num = int(cf.get('config', 'num'))
paste_enhance(png, images_path, save_path, num)
config.ini 文件:
[config]
;png蒙层图片所在文件夹地址
png = /media/test/png
;被粘贴主图所在文件夹地址
images_path = /media/test/images
;粘贴后的图片保存的文件夹地址
save_path = /media/test/save
;蒙层粘贴到主图的次数
num = 1
批量增强后的效果,13张png蒙层图,460张主图,增强后有5101张图片,效果如下: