python 批量随机粘贴png图片,进行数据增强,并保存为jpg

  • 将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张图片,效果如下:
在这里插入图片描述
在这里插入图片描述

<think>好的,我现在需要帮助用户解决如何将小图粘贴到大图上的图像合成问题。首先,用户提到了图像处理图片编辑,所以我要确保回答覆盖基本步骤和可能的代码示例。用户提供的引用资料里有关于Python实现的方法,特别是使用alpha blending和循环处理多张图片。 首先,我需要明确用户的需求:将小图粘贴到大图上,可能涉及位置调整、透明度处理等。根据引用[2]和[3],用户可能希望用Python实现批量处理,所以应该考虑使用PIL库。需要提到打开图片、调整大小(如果需要)、处理透明度、确定位置,然后合成保存。 然后,我需要检查是否有必要调整小图的大小,或者用户是否希望保持原样。引用[3]提到随机粘贴,可能需要随机位置,但用户的问题可能更基础,先讲基础步骤再提扩展。 接下来,处理透明度的部分,引用[1]中的alpha blending和multi-band blending,可能需要简单说明如何混合,比如使用paste方法的mask参数。同时,代码示例要正确,确保使用RGBA模式来保留透明度。 然后,考虑用户可能的后续问题,比如如何批量处理、优化合成效果,或者处理不同尺寸的小图。因此,在相关问题部分可以提出这些点,引导用户进一步学习。 最后,确保回答结构清晰,分步骤说明,附上代码示例。同时,引用资料中的信息要正确标注,比如在提到alpha blending时引用[^1],粘贴步骤引用[^2][^3]。</think>### 如何将小图粘贴到大图上:图像合成技巧 将小图粘贴到大图上(如图像水印、多图拼接)是图像处理中的常见需求,以下是详细步骤和技巧: --- #### **1. 基本步骤** 1. **加载图像** 使用图像处理库(如Python的Pillow)加载大图(背景图)和小图(前景图)。 ```python from PIL import Image background = Image.open("background.jpg").convert("RGBA") # 转换为RGBA模式以支持透明度 foreground = Image.open("foreground.png").convert("RGBA") ``` 2. **调整小图尺寸(可选)** 若小图过大,可调整尺寸: ```python foreground = foreground.resize((100, 100)) # 调整为目标尺寸 ``` 3. **确定粘贴位置** 定义小图在大图中的坐标(左上角为原点$(0,0)$): ```python position = (50, 30) # 示例坐标 ``` 4. **合成图像** 使用`paste`方法合图像,通过`mask`参数保留小图透明度[^1]: ```python background.paste(foreground, position, mask=foreground) background.save("result.png") ``` --- #### **2. 关键技巧** - **透明度处理** 若小图有透明区域(如PNG格式),需使用`mask`参数避免遮挡背景。 - **坐标计算** 居中粘贴小图时,计算位置: ```python x = (background.width - foreground.width) // 2 y = (background.height - foreground.height) // 2 ``` - **批量处理** 对多张大图和小图,可通过循环遍历文件夹实现批量合成。 --- #### **3. 代码示例(批量合成)** ```python import os from PIL import Image # 加载背景图和小图文件夹 background_folder = "backgrounds/" foreground_folder = "stickers/" output_folder = "outputs/" for bg_name in os.listdir(background_folder): bg = Image.open(os.path.join(background_folder, bg_name)).convert("RGBA") for fg_name in os.listdir(foreground_folder): fg = Image.open(os.path.join(foreground_folder, fg_name)).convert("RGBA") fg = fg.resize((100, 100)) x = (bg.width - fg.width) // 2 # 居中 y = (bg.height - fg.height) // 2 bg.paste(fg, (x, y), mask=fg) bg.save(os.path.join(output_folder, f"merged_{bg_name}_{fg_name}")) ``` --- #### **4. 进阶优化** - **混合模式** 使用`alpha blending`调整透明度叠加效果,例如: ```python blended = Image.blend(background, foreground, alpha=0.5) ``` - **抗锯齿** 调整小图时添加抗锯齿: ```python foreground = foreground.resize((100, 100), Image.LANCZOS) ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值