数据增强是深度学习中常用的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()
原图如下:
进行数据增强之后: