生成一个Python脚本来批量处理图片(图片类型有jpg,jpeg,webp,png),包括裁剪、旋转、镜像翻转、图像分割和颜色调整,还要自动生成至少10张图片且格式都为jpg。图片存放路径为E:\Pycharm_demo\yolov5\VOCData\sea_mine 生成的新的图片的存放路径为E:\Pycharm_demo\yolov5\VOCData\sea_mine_augmented
时间: 2025-08-10 09:28:53 浏览: 3
<think>嗯,用户需要生成一个Python脚本来批量处理图片,支持多种格式,处理后转成JPG,还要生成至少10张新图片。首先,我得考虑用什么库来处理图像。Pillow库应该够用,因为它支持常见的图片格式,并且能进行裁剪、旋转、翻转等操作。不过,图像分割可能需要更复杂的处理,用户可能指的是简单的分割,比如随机裁剪或分块,或者使用更高级的方法。这里可能需要进一步明确,但用户可能希望用简单的分割方法,比如将图片分成几块,或者随机裁剪部分区域。接下来,图片的输入路径是E:\Pycharm_demo\yolov5\VOCData\sea_mine,输出路径是sea_mine_augmented。需要确保输出路径存在,如果不存在的话,脚本需要自动创建,可以用os.makedirs函数。
然后,处理图片的类型包括jpg、jpeg、webp、png,需要遍历该目录下所有符合条件的文件。可以使用glob模块来匹配这些扩展名。注意,处理后的图片必须保存为JPG格式,所以保存时要指定后缀为.jpg,并且处理质量可能需要调整,避免文件过大。每个原始图片需要生成至少10张增强后的图片。可能需要为每张原始图片应用不同的变换组合,直到生成足够数量的图片。比如,对于每张原始图片,循环应用不同的变换,直到生成10张。或者,如果原始图片数量不足,可能需要重复应用变换,直到总数达到10张。但用户可能希望每个原始图片生成多张增强图片,所以应该为每个输入图片生成多个变体,直到总数量达到至少10张。比如,如果有3张原始图片,每张生成4张,总共12张。
变换操作包括裁剪、旋转、镜像翻转、颜色调整和图像分割。需要逐个实现这些函数:
1.裁剪:随机裁剪,使用Image.crop方法,随机选择区域。可能需要指定裁剪的大小,比如原图的80%大小,或者固定尺寸。这里可能需要根据原图尺寸调整。
2.旋转:随机角度,比如0-360度,或者更常见的90、180、270度。注意旋转时可能会超出图片范围,需要处理边框,比如填充白色或扩展图片。
3.镜像翻转:水平或垂直翻转,使用Image.transpose方法,参数为Image.FLIP_LEFT_RIGHT或Image.FLIP_TOP_BOTTOM。4.颜色调整:调整亮度、对比度、饱和度。可以用ImageEnhance模块中的类来调整,每个参数随机一个系数,比如0.5到1.5之间。5.图像分割:这里可能需要将图片分割成多个部分,比如四等分,然后选择其中一块,或者随机切割。比如,分割成上下两部分,取上半部分,或者随机位置的分割。或者,用户可能指的是语义分割,但这里应该是简单的分割处理,所以可能随机裁剪或分割成几块后保存。每个变换函数应该返回处理后的新Image对象。然后,组合这些变换,例如先旋转再裁剪,或者随机应用几种变换。但用户可能希望每个生成的图片应用至少一种变换,或者多种组合。需要确定如何生成多样性足够的图片。例如,每次生成时随机选择几种变换应用。脚本的结构大致如下:
-遍历输入目录中的所有图片文件。
-对每个图片,生成足够数量的增强图片,直到总数量达到至少10张。-对每个增强操作,应用随机变换,保存为JPG。
需要考虑处理不同图片格式时的读取问题,Pillow的Image.open应该能处理这些格式。保存时注意转换为RGB模式,因为有些格式(如PNG)可能有Alpha通道,而JPG不支持,所以需要转换。另外,生成的文件名需要唯一,可以使用原文件名加上序号和变换名称,或者使用UUID。例如,原文件名为image.jpg,生成image_1_crop.jpg,image_2_rotate.jpg等。还需要处理可能的异常,比如损坏的图片文件,跳过这些文件。最后,测试脚本是否能在指定路径下正确生成至少10张JPG图片,并且变换后的图片符合要求。</think>以下是使用Pillow库实现的图片批量处理脚本,包含要求的全部功能:
```python
import os
import glob
import random
from PIL import Image, ImageEnhance, ImageOps
input_path = r"E:\Pycharm_demo\yolov5\VOCData\sea_mine"
output_path = r"E:\Pycharm_demo\yolov5\VOCData\sea_mine_augmented"
os.makedirs(output_path, exist_ok=True)
def random_crop(img):
"""随机裁剪(保留80%-95%的原始区域)"""
w, h = img.size
crop_w = int(w * random.uniform(0.8, 0.95))
crop_h = int(h * random.uniform(0.8, 0.95))
x = random.randint(0, w - crop_w)
y = random.randint(0, h - crop_h)
return img.crop((x, y, x+crop_w, y+crop_h))
def random_rotation(img):
"""随机旋转(-45到45度)"""
return img.rotate(random.randint(-45, 45), expand=True)
def random_flip(img):
"""随机镜像翻转"""
if random.random() > 0.5:
return ImageOps.mirror(img)
return ImageOps.flip(img)
def color_adjust(img):
"""随机颜色调整"""
enhancer = ImageEnhance.Color(img)
img = enhancer.enhance(random.uniform(0.5, 1.5))
enhancer = ImageEnhance.Brightness(img)
img = enhancer.enhance(random.uniform(0.7, 1.3))
enhancer = ImageEnhance.Contrast(img)
return enhancer.enhance(random.uniform(0.7, 1.3))
def image_split(img):
"""图像分割(四等分随机选择一块)"""
w, h = img.size
split_w = w // 2
split_h = h // 2
positions = [
(0, 0, split_w, split_h),
(split_w, 0, w, split_h),
(0, split_h, split_w, h),
(split_w, split_h, w, h)
]
return img.crop(random.choice(positions))
def apply_transformations(original_img):
"""应用随机变换组合"""
transforms = [
random_crop,
random_rotation,
random_flip,
color_adjust,
image_split
]
img = original_img.copy()
# 随机应用3-5种变换
for _ in range(random.randint(3, 5)):
transform = random.choice(transforms)
img = transform(img)
return img
def process_images():
extensions = ['*.jpg', '*.jpeg', '*.webp', '*.png']
count = 0
for ext in extensions:
for img_path in glob.glob(os.path.join(input_path, ext)):
try:
with Image.open(img_path) as img:
img = img.convert('RGB') # 统一转换为RGB格式
# 为每张原始图片生成多个变体
while count < 10:
transformed = apply_transformations(img)
output_file = os.path.join(
output_path,
f"aug_{count}_{os.path.basename(img_path)}"
)
transformed.save(output_file, 'JPEG', quality=85)
count += 1
# 如果已有10张则停止
if count >= 10:
break
except Exception as e:
print(f"处理 {img_path} 时出错: {str(e)}")
# 如果原始图片不足,重复处理直到达到10张
if count < 10:
existing_images = glob.glob(os.path.join(output_path, '*.jpg'))
while count < 10:
for existing in existing_images:
with Image.open(existing) as img:
transformed = apply_transformations(img)
output_file = os.path.join(
output_path,
f"aug_{count}_{os.path.basename(existing)}"
)
transformed.save(output_file, 'JPEG', quality=85)
count += 1
if count >= 10:
break
if __name__ == "__main__":
process_images()
print(f"已生成至少10张增强图片到: {output_path}")
```
**实现原理说明:**
1. 使用Pillow库处理各种图像格式的读取和转换
2. 通过随机组合多种变换(裁剪、旋转、翻转等)确保生成的图片多样性
3. 自动处理不同格式的转换,统一保存为JPG格式
4. 包含异常处理机制,跳过损坏的图片文件
5. 双重生成机制:首先处理原始图片,如果数量不足则继续增强已生成的图片
**注意事项:**
1. 需要安装Pillow库:`pip install pillow`
2. 原始图片至少需要1张才能运行
3. 生成的图片质量设置为85(可调整quality参数)
4. 所有生成的图片都会转换为RGB模式
阅读全文
相关推荐


















