【机器学习】图片分类中增强常用方式详解以及效果展示

图片增强常用方式详解

引言

图片数据的质量和多样性对模型的训练效果起着至关重要的作用。然而,实际获取的图片数据往往存在数量不足、分布不均衡等问题。图片增强技术应运而生,它通过对原始图片进行一系列变换,生成更多具有多样性的图片,从而提升模型的泛化能力。本文将详细介绍几种常见的图片增强方式及其实现方法。

随机旋转(Random Rotation)

在这里插入图片描述

原理
随机旋转是指在一定角度范围内对图片进行随机旋转操作。这种方式可以模拟图片在不同角度下的拍摄情况,增加模型对不同角度物体的识别能力。

** 实现 **
在 Python 中,我们可以使用 Keras 库的 ImageDataGenerator 来实现随机旋转。以下是示例代码:

from keras.preprocessing.image import ImageDataGenerator
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

# 读取原始图片
image_path = "your_image.jpg"
original_image = Image.open(image_path)
original_image = np.array(original_image)

# 定义 ImageDataGenerator,设置旋转范围为 -30° 到 30°
datagen_rotation = ImageDataGenerator(rotation_range=30)

# 生成旋转后的图片
rotated_image = datagen_rotation.flow(np.array([original_image]), batch_size=1).next()[0].astype('uint8')

# 显示原始图片和旋转后的图片
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
axes[0].imshow(original_image)
axes[0].axis('off')
axes[0].set_title('原始图片')

axes[1].imshow(rotated_image)
axes[1].axis('off')
axes[1].set_title('旋转后的图片')
plt.show()

随机平移(Random Shift)

在这里插入图片描述

原理
随机平移是在水平和垂直方向上对图片进行随机移动。通过这种方式,可以让模型学习到物体在不同位置的特征,增强模型对物体位置变化的鲁棒性。

实现
同样使用 ImageDataGenerator 来实现随机平移,示例代码如下:


# 定义 ImageDataGenerator,设置水平方向平移范围为 ±20% 宽度,垂直方向平移范围为 ±15% 高度
datagen_shift = ImageDataGenerator(
    width_shift_range=0.2,
    height_shift_range=0.15
)

# 生成平移后的图片
shifted_image = datagen_shift.flow(np.array([original_image]), batch_size=1).next()[0].astype('uint8')

# 显示原始图片和平移后的图片
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
axes[0].imshow(original_image)
axes[0].axis('off')
axes[0].set_title('原始图片')

axes[1].imshow(shifted_image)
axes[1].axis('off')
axes[1].set_title('平移后的图片')
plt.show()

随机缩放(Random Zoom)

在这里插入图片描述

原理
随机缩放是对图片进行随机的放大或缩小操作。这有助于模型学习到物体在不同尺寸下的特征,提高模型对物体大小变化的适应性。

实现
使用 ImageDataGenerator 实现随机缩放,示例代码如下:


# 定义 ImageDataGenerator,设置缩放范围为 0.8 - 1.2 倍
datagen_zoom = ImageDataGenerator(zoom_range=0.2)

# 生成缩放后的图片
zoomed_image = datagen_zoom.flow(np.array([original_image]), batch_size=1).next()[0].astype('uint8')

# 显示原始图片和缩放后的图片
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
axes[0].imshow(original_image)
axes[0].axis('off')
axes[0].set_title('原始图片')

axes[1].imshow(zoomed_image)
axes[1].axis('off')
axes[1].set_title('缩放后的图片')
plt.show()

随机翻转(Random Flip)

在这里插入图片描述

原理
随机翻转包括水平翻转和垂直翻转。通过对图片进行翻转操作,可以增加数据的多样性,让模型学习到物体在不同镜像状态下的特征。

实现
使用 ImageDataGenerator 实现随机翻转,示例代码如下:


# 定义 ImageDataGenerator,仅启用水平翻转
datagen_flip = ImageDataGenerator(horizontal_flip=True)

# 生成翻转后的图片
flipped_image = datagen_flip.flow(np.array([original_image]), batch_size=1).next()[0].astype('uint8')

# 显示原始图片和翻转后的图片
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
axes[0].imshow(original_image)
axes[0].axis('off')
axes[0].set_title('原始图片')

axes[1].imshow(flipped_image)
axes[1].axis('off')
axes[1].set_title('翻转后的图片')
plt.show()

随机剪切(Random Shear)

在这里插入图片描述

原理
随机剪切是对图片进行一定角度的倾斜操作,模拟物体在不同视角下的变形情况,增强模型对物体形变的识别能力。

实现
使用 ImageDataGenerator 实现随机剪切,示例代码如下:


# 定义 ImageDataGenerator,设置剪切范围为 0 - 0.3 弧度
datagen_shear = ImageDataGenerator(shear_range=0.3)

# 生成剪切后的图片
sheared_image = datagen_shear.flow(np.array([original_image]), batch_size=1).next()[0].astype('uint8')

# 显示原始图片和剪切后的图片
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
axes[0].imshow(original_image)
axes[0].axis('off')
axes[0].set_title('原始图片')

axes[1].imshow(sheared_image)
axes[1].axis('off')
axes[1].set_title('剪切后的图片')
plt.show()

亮度调整(Brightness Adjustment)

在这里插入图片描述

原理
亮度调整是对图片的亮度进行随机调整,模拟不同光照条件下的拍摄情况,提高模型对光照变化的鲁棒性。

实现
使用 ImageDataGenerator 实现亮度调整,示例代码如下:


# 定义 ImageDataGenerator,设置亮度调整范围为 0.5 - 1.5 倍
datagen_brightness = ImageDataGenerator(brightness_range=[0.5, 1.5])

# 生成亮度调整后的图片
brightened_image = datagen_brightness.flow(np.array([original_image]), batch_size=1).next()[0].astype('uint8')

# 显示原始图片和亮度调整后的图片
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
axes[0].imshow(original_image)
axes[0].axis('off')
axes[0].set_title('原始图片')

axes[1].imshow(brightened_image)
axes[1].axis('off')
axes[1].set_title('亮度调整后的图片')
plt.show()

对比度调整(Contrast Adjustment)

在这里插入图片描述

原理
对比度调整是改变图片中不同像素之间的差异程度,增强图片的视觉效果,让模型能够学习到更丰富的图像特征。

实现
使用 OpenCV 库实现对比度调整,示例代码如下:


import cv2
import numpy as np

def adjust_contrast(img):
    # 转换为灰度图(如需保留彩色可调整)
    img_gray = cv2.cvtColor(img.astype('uint8'), cv2.COLOR_RGB2GRAY)
    # 对比度拉伸
    min_val = np.min(img_gray)
    max_val = np.max(img_gray)
    stretched = (img - min_val) * (255.0 / (max_val - min_val + 1e-8))
    return stretched.astype('float32')

# 应用自定义对比度调整
contrasted_image = adjust_contrast(original_image).astype('uint8')

# 显示原始图片和对比度调整后的图片
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
axes[0].imshow(original_image)
axes[0].axis('off')
axes[0].set_title('原始图片')

axes[1].imshow(contrasted_image)
axes[1].axis('off')
axes[1].set_title('对比度调整后的图片')
plt.show()

总结

图片增强是计算机视觉任务中非常重要的一环,通过上述几种常见的图片增强方式,可以有效地扩充数据集,提高模型的泛化能力。在实际应用中,可以根据具体任务和数据特点选择合适的增强方式,也可以将多种增强方式组合使用,以获得更好的效果。希望本文能帮助你更好地理解和应用图片增强技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值