python图像数据增强——imgaug (三)

本文详细介绍如何使用imgaug库进行图像分割数据增强,包括确定性增强方法的应用,以及图像和分割标签同步处理的实现过程。通过具体示例,展示了从创建分割图到增强结果可视化的完整流程。

(一)imgaug基础用法
(二)imgaug进阶示例
(三)imgaug图像分割数据增强

之前两章展示了最基本的imgaug的基础用法,以及一个较为全面的各种增强方法的展示,这里我们介绍在分割问题中的数据增强方法。

在分类问题中,输入为一张图像,输出为一个类别,在这种问题中,我们只需要对图像进行增强,并不需要对标签做出改动。而在分割问题中,当训练使用的图像被翻转或者扭曲之后,标签也要对应的做出相同的翻转或者扭曲,因此在增强的过程中不能仅仅对图像进行处理,同时也要对分割的标签进行相同的处理。

为了对图像和标签做出相同的处理,我们需要确定对一张图的增强方法,然后先后应用在图像和标签上面,这里我们就需要使用该函数seq.to_deterministic()得到一个确定的增强函数。要想知道如何使用,首先我们就要有两个分别记录原图和分割标签的变量,分别叫做image,和segmap。

实现的方法如下,我们这里使用系统自带的一张图片进行增强,这里是在原网站教程的基础上进行改进的,因为在手册中并没有一个中间步骤的输出可以用来训练网络,缺少一步把 SegmentationMapOnImage类型的数据转换成numpy类型数据的步骤,这里我们增加了这一步。我们最后得到的结果就如下图所示。最后再补充一句就是这里对分割增强的方法在这个imgaug库中还在开发中,有些测试还没有做完全,不过目前可以正常使用的。
在这里插入图片描述

import imgaug as ia
from imgaug import augmenters as iaa
import imageio
import numpy as np

ia.seed(1)
image = ia.quokka(size=(128, 128), extract="square") #加载示例图像进来,大小为(128,128,3)

#创建一个分割的图
segmap = np.zeros((128, 128), dtype=np.int32)
segmap[28:71, 35:85] = 1
segmap[10:25, 30:45] = 2
segmap[10:25, 70:85] = 3
segmap[10:110, 5:10] = 4
segmap[118:123, 10:110] = 5

#将图片转换为SegmentationMapOnImage类型
segmap = ia.SegmentationMapOnImage(segmap, shape=image.shape, nb_classes=1+5)


# 定义数据增强方法
seq = iaa.Sequential([
    iaa.Dropout([0.05, 0.2]),      # drop 5% or 20% of all pixels
    iaa.Sharpen((0.0, 1.0)),       # sharpen the image
    iaa.Affine(rotate=(-45, 45)),  # rotate by -45 to 45 degrees (affects heatmaps)
    iaa.ElasticTransformation(alpha=50, sigma=5)  # apply water effect (affects heatmaps)
], random_order=True)

images_aug = []
segmaps_aug = []

#这里可以通过加入循环的方式,对多张图进行数据增强。
seq_det = seq.to_deterministic() #确定一个数据增强的序列
images_aug = seq_det.augment_image(image) #将方法应用在原图像上
segmaps_aug = seq_det.augment_segmentation_maps([segmap])[0].get_arr_int().astype(np.uint8)
# 将方法应用在分割标签上,并且转换成np类型

segmaps_aug = ia.SegmentationMapOnImage(segmaps_aug, shape=image.shape, nb_classes=1+5)
# 将分割结果转换为SegmentationMapOnImage类型,方便后面可视化

#可视化
cells = []
cells.append(image)
cells.append(segmap.draw_on_image(image))
cells.append(images_aug)
cells.append(segmaps_aug.draw_on_image(images_aug))
cells.append(segmaps_aug.draw(size=images_aug.shape[:2]))  
grid_image = ia.draw_grid(cells, cols=5)
imageio.imwrite("example_segmaps.jpg", grid_image)
### Python 图像数据增强代码示例 #### 使用 OpenCV 进行图像增强 通过 `cv2` 库可以轻松实现多种基本的图像增强功能。下面是一个简单的例子,展示了如何调整亮度和对比度: ```python import cv2 import numpy as np def adjust_brightness_contrast(image, brightness=0., contrast=0.): """ 调整给定图片的亮度和对比度 参数: image (numpy.ndarray): 输入图像. brightness (float): 亮度调节参数 (-1 to 1). contrast (float): 对比度调节参数 (-1 to 1). 返回: numpy.ndarray: 处理后的图像. """ if brightness != 0: if brightness > 0: shadow = brightness highlight = 255 else: shadow = 0 highlight = 255 + brightness alpha_b = (highlight - shadow)/255 gamma_b = shadow buf = cv2.addWeighted(image, alpha_b, image, 0, gamma_b) else: buf = image.copy() if contrast != 0: f = 131*(contrast + 127)/(127*(131-contrast)) alpha_c = f gamma_c = 127*(1-f) buf = cv2.addWeighted(buf, alpha_c, buf, 0, gamma_c) return buf image_path = 'path_to_image.jpg' original_img = cv2.imread(image_path) adjusted_img = adjust_brightness_contrast(original_img, brightness=-50, contrast=64) # 显示原图与处理过的图像 cv2.imshow('Original Image', original_img) cv2.imshow('Adjusted Image', adjusted_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 此段代码实现了对输入图像的亮度和对比度调整[^1]。 #### 利用 ImgAug 实现复杂的数据增强 对于更加复杂的变换需求,则推荐使用专门设计用于机器学习任务中的图像预处理工具——ImgAug。这里给出一段利用 ImgAug 执行一系列随机化转换的例子: ```python from imgaug import augmenters as iaa import matplotlib.pyplot as plt # 定义序列化的增强操作列表 seq = iaa.Sequential([ iaa.Crop(px=(0, 16)), # 随机裁剪 iaa.Fliplr(0.5), # 水平翻转的概率设为50% iaa.GaussianBlur(sigma=(0, 3.0)) # 添加不同程度的高斯噪声 ]) images = [...] # 加载一批待增强的图像数组 images_augmented = seq(images=images) # 应用上述定义的操作集 fig, axs = plt.subplots(nrows=2, ncols=len(images)//2, figsize=(12, 6)) for idx, ax in enumerate(axs.flat): ax.imshow(cv2.cvtColor(images[idx], cv2.COLOR_BGR2RGB)) plt.show() fig, axs = plt.subplots(nrows=2, ncols=len(images)//2, figsize=(12, 6)) for idx, ax in enumerate(axs.flat): ax.imshow(cv2.cvtColor(images_augmented[idx], cv2.COLOR_BGR2RGB)) plt.show() ``` 这段脚本不仅完成了常见的几何变形(如裁切、镜像),还加入了模糊效应来模拟现实世界条件下的变化[^3]。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值