常用15种数据增强方法汇总(好厚米版)

数据增强是深度学习中常用的tricks,笔者这里总结出了15种常用的数据增强方式,可直接运行,且均带有备注,大家有需要的可以截取其中想要的部分进行学习,最终如果想要显示的话记得带上最后两行代码~

from PIL import Image, ImageEnhance, ImageFilter, ImageOps, ImageDraw
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 打开图像
image_path = r"E:\xyjdashabi.jpg"
original_image = Image.open(image_path)

# 显示原始图像
plt.figure(figsize=(15, 15))
plt.subplot(4, 4, 1)
plt.title('Original Image')
plt.imshow(original_image)
plt.axis('off')

# 数据增强方法1:旋转
rotated_image = original_image.rotate(45)

# 显示旋转后的图像
plt.subplot(4, 4, 2)
plt.title('Rotated Image')
plt.imshow(rotated_image)
plt.axis('off')

# 数据增强方法2:水平翻转
flipped_image = original_image.transpose(Image.Transpose.FLIP_LEFT_RIGHT)

# 显示水平翻转后的图像
plt.subplot(4, 4, 3)
plt.title('Flipped Image')
plt.imshow(flipped_image)
plt.axis('off')

# 数据增强方法3:亮度调整
brightness_factor = 1.5  # 增加亮度的因子
enhancer = ImageEnhance.Brightness(original_image)
brightened_image = enhancer.enhance(brightness_factor)

# 显示亮度调整后的图像
plt.subplot(4, 4, 4)
plt.title('Brightened Image')
plt.imshow(brightened_image)
plt.axis('off')

# 数据增强方法4:裁剪
crop_x, crop_y, crop_width, crop_height = 100, 100, 300, 300  # 裁剪坐标和尺寸
cropped_image = original_image.crop((crop_x, crop_y, crop_x + crop_width, crop_y + crop_height))

# 显示裁剪后的图像
plt.subplot(4, 4, 5)
plt.title('Cropped Image')
plt.imshow(cropped_image)
plt.axis('off')

# 数据增强方法5:色彩增强
color_enhancer = ImageEnhance.Color(original_image)
enhanced_color_image = color_enhancer.enhance(2.0)  # 增强色彩

# 显示色彩增强后的图像
plt.subplot(4, 4, 6)
plt.title('Enhanced Color Image')
plt.imshow(enhanced_color_image)
plt.axis('off')

# 数据增强方法6:添加噪声
original_array = np.array(original_image)
noise = np.random.normal(0, 25, original_array.shape).astype(np.uint8)  # 添加高斯噪声
noisy_array = cv2.add(original_array, noise)
noisy_image = Image.fromarray(noisy_array)

# 显示添加噪声后的图像
plt.subplot(4, 4, 7)
plt.title('Noisy Image')
plt.imshow(noisy_image)
plt.axis('off')

# 数据增强方法7:饱和度调整
saturation_factor = 1.5  # 增加饱和度的因子
enhancer = ImageEnhance.Color(original_image)
saturated_image = enhancer.enhance(saturation_factor)

# 显示饱和度调整后的图像
plt.subplot(4, 4, 8)
plt.title('Saturated Image')
plt.imshow(saturated_image)
plt.axis('off')

# 数据增强方法8:高斯模糊
blurred_image = original_image.filter(ImageFilter.GaussianBlur(radius=7))

# 显示高斯模糊后的图像
plt.subplot(4, 4, 9)
plt.title('Blurred Image')
plt.imshow(blurred_image)
plt.axis('off')

# 数据增强方法9:反色
inverted_image = ImageOps.invert(original_image)

# 显示反色后的图像
plt.subplot(4, 4, 10)
plt.title('Inverted Image')
plt.imshow(inverted_image)
plt.axis('off')

# 数据增强方法10:锐化
sharpness_factor = 2.0  # 增强锐化的因子
enhancer = ImageEnhance.Sharpness(original_image)
sharpened_image = enhancer.enhance(sharpness_factor)

# 显示锐化后的图像
plt.subplot(4, 4, 11)
plt.title('Sharpened Image')
plt.imshow(sharpened_image)
plt.axis('off')

# 数据增强方法11:遮挡
mask = Image.new('L', original_image.size, 0)
draw = ImageDraw.Draw(mask)
draw.rectangle([150, 150, 350, 350], fill=255)
masked_image = Image.composite(original_image, inverted_image, mask)

# 显示遮挡后的图像
plt.subplot(4, 4, 12)
plt.title('Masked Image')
plt.imshow(masked_image)
plt.axis('off')

# 数据增强方法12:马赛克
def mosaic(image, block_size=10):
    image = image.copy()
    width, height = image.size
    for i in range(0, width, block_size):
        for j in range(0, height, block_size):
            box = (i, j, i + block_size, j + block_size)
            region = image.crop(box)
            average_color = region.resize((1, 1), Image.ANTIALIAS).getpixel((0, 0))
            for x in range(i, i + block_size):
                for y in range(j, j + block_size):
                    image.putpixel((x, y), average_color)
            return image

mosaiced_image = mosaic(original_image)

# 显示马赛克后的图像
plt.subplot(4, 4, 13)
plt.title('Mosaiced Image')
plt.imshow(mosaiced_image)
plt.axis('off')

# 数据增强方法13:仿射变换
def random_affine_transform(image):
    rows, cols = image.shape[:2]

    # 随机生成仿射变换的参数
    random_scale_x = random.uniform(0.8, 1.2)
    random_scale_y = random.uniform(0.8, 1.2)
    random_rotation = random.uniform(-30, 30)
    random_translation_x = random.randint(-30, 30)
    random_translation_y = random.randint(-30, 30)

    # 构建仿射变换矩阵
    matrix = cv2.getRotationMatrix2D((cols / 2, rows / 2), random_rotation, random_scale_x)
    matrix[:, 2] += [random_translation_x, random_translation_y]

    # 执行仿射变换
    transformed_image = cv2.warpAffine(image, matrix, (cols, rows))

    return transformed_image

# 将Pillow图像转换回NumPy数组以进行仿射变换
original_image_array = np.array(original_image)
transformed_image = random_affine_transform(original_image_array)

# 将NumPy数组转换回Pillow图像
transformed_image = Image.fromarray(transformed_image)

# 显示仿射变换后的图像
plt.subplot(4, 4, 14)
plt.title('Random Affine Transform')
plt.imshow(transformed_image)
plt.axis('off')

import random
import numpy as np
import cv2

# 数据增强方法14:透视变换
def random_perspective_transform(image):
    height, width, _ = image.shape

    # 随机生成透视变换的四个点
    perspective_points = np.array([
        [random.randint(0, width // 4), random.randint(0, height // 4)],
        [random.randint(3 * width // 4, width), random.randint(0, height // 4)],
        [random.randint(0, width // 4), random.randint(3 * height // 4, height)],
        [random.randint(3 * width // 4, width), random.randint(3 * height // 4, height)]
    ], dtype=np.float32)

    # 随机生成透视变换后的四个目标点
    target_points = np.array([
        [0, 0],
        [width, 0],
        [0, height],
        [width, height]
    ], dtype=np.float32)

    # 计算透视变换矩阵
    perspective_matrix = cv2.getPerspectiveTransform(perspective_points, target_points)

    # 执行透视变换
    transformed_image = cv2.warpPerspective(image, perspective_matrix, (width, height))

    return transformed_image

# 显示透视变换后的图像
plt.subplot(4, 4, 15)
plt.title('Perspective Transformed Image')
transformed_image = random_perspective_transform(original_image_array)
plt.imshow(transformed_image)
plt.axis('off')


from PIL import ImageOps

# 数据增强方法15:边缘检测
edged_image = ImageOps.grayscale(original_image)
edged_image = edged_image.filter(ImageFilter.FIND_EDGES)

# 显示边缘检测后的图像
plt.subplot(4, 4, 16)
plt.title('Edged Image')
plt.imshow(edged_image, cmap='gray')
plt.axis('off')

# 显示所有图像
plt.savefig('change_image.pdf', format='pdf', bbox_inches='tight')  #将最终结果保存成pdf
plt.tight_layout()
plt.show()



原图如下:



进行数据增强之后:

 

  • 27
    点赞
  • 157
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
"未解析引用model"是一个比较常见的错误信息。这个错误通常出现在以下两情况下: 1. 模型文件未被正确加载:这情况通常出现在你正在尝试加载一个不存在的文件或者文件路径不正确的情况下。在这情况下,你需要确保模型文件存在,并且文件路径是正确的。 2. 模型名称未被正确指定:这情况通常出现在你正在尝试使用已经定义但未加载的模型的情况下。在这情况下,你需要确保你已经正确地定义了模型,并且在调用模型时指定了正确的名称。 下面是一个使用TensorFlow加载模型时出现“未解析引用model”的示例代码: ```python import tensorflow as tf # 加载模型 model = tf.keras.models.load_model('path/to/model') # 对模型进行推理 output = model(input_data) ``` 在这个示例代码中,如果出现“未解析引用model”的错误,可能是因为模型文件路径不正确,或者在加载模型时没有指定正确的模型名称。你需要检查模型文件路径是否正确,并且确保在加载模型时指定了正确的名称。例如: ```python import tensorflow as tf # 加载模型 model = tf.keras.models.load_model('path/to/model', compile=False, custom_objects={'model': model}) # 对模型进行推理 output = model(input_data) ``` 在这个示例代码中,我们使用了`custom_objects`参数指定了模型的名称,从而避免了“未解析引用model”的错误。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值