图像增强
约 683 字大约 2 分钟
2025-10-27
图像增强是 在训练神经网络时常用的技术,通过对训练图像进行随机变换来增加数据的多样性,从而提高模型的泛化能力。以下是一些常见的图像增强方法:
- 随机裁剪(Random Crop):从图像中随机裁剪出一个子区域,通常用于模拟不同的拍摄距离和视角。
- 随机水平翻转(Random Horizontal Flip):以一定概率将图像水平
- 翻转,增加图像的多样性。
- 随机旋转(Random Rotation):随机旋转图像一定角度范围
from matplotlib.pyplot import imshow
from PIL import Image
import torch
from torchvision import transforms
path = './data/PetImages/Cat/6039.jpg'
transform = transforms.RandomRotation(60)
imshow(transform(Image.open(path)))
# 垂直翻转
transform = transforms.RandomVerticalFlip(p=1) # 概率值
imshow(transform(Image.open(path)))
transform = transforms.RandomCrop((100, 100))
imshow(transform(Image.open(path)))
transform = transforms.RandomPerspective(
p = 1,
distortion_scale=0.5,
interpolation=transforms.InterpolationMode.BILINEAR
)
imshow(transform(Image.open(path)))
# 颜色变化
transform = transforms.ColorJitter(
brightness=0.5, # 亮度 亮度因子从[1-x=0.5, 1+x=1.5]之间选择
contrast=0.5, # 对比度 对比度因子从[1-x=0.5, 1+x=1.5]之间选择
saturation=0.5, # 饱和度(鲜艳度) 饱和度因子从[1-x=0.5, 1+x=1.5]之间选择
hue=0.1 # 色调(在色环上的旋转) 色调因子从[-x=-0.1, x=0.1]之间选择
)
imshow(transform(Image.open(path)))
# 模糊
transform = transforms.GaussianBlur(
kernel_size=5, # 奇数(模糊窗口效果)
sigma=(0.1, 2.0) # 标准差范围(模糊程度)
)
imshow(transform(Image.open(path)))
# 局部遮罩(类似于Dropout)
from PIL import Image
import numpy as np
import random
def cutout_pil_multi(image, mask_size=50, num_masks=3):
"""
对图像应用多个 Cutout 遮挡块
参数:
- image: PIL.Image 对象
- mask_size: 每个遮挡块的大小(正方形边长)
- num_masks: 遮挡块的数量
"""
image_np = np.array(image).copy()
h, w = image_np.shape[0], image_np.shape[1]
for _ in range(num_masks):
y = random.randint(0, h - 1)
x = random.randint(0, w - 1)
y1 = max(0, y - mask_size // 2)
y2 = min(h, y + mask_size // 2)
x1 = max(0, x - mask_size // 2)
x2 = min(w, x + mask_size // 2)
# 遮挡区域设置为黑色
image_np[y1:y2, x1:x2, :] = 0
return Image.fromarray(image_np)
cutout_pil_multi(Image.open(path), mask_size=50, num_masks=5)
