CV数据增强

ops/2025/2/11 8:53:39/

使用python写一个对一个文件夹中的图像进行批量可以自定义数据增强程度的翻转、旋转、缩放、裁剪、亮度调整、对比度调整、噪声添加、噪声添加、颜色变换、弹性变形这些方法的代码

python">import os
import cv2
import numpy as np
import random# 定义数据增强方法
def flip(image, flip_code):return cv2.flip(image, flip_code)def rotate(image, angle):rows, cols = image.shape[:2]matrix = cv2.getRotationMatrix2D((cols/2, rows/2), angle, 1)return cv2.warpAffine(image, matrix, (cols, rows))def scale(image, scale_factor):return cv2.resize(image, None, fx=scale_factor, fy=scale_factor, interpolation=cv2.INTER_LINEAR)def crop(image, crop_size):rows, cols = image.shape[:2]x = random.randint(0, cols - crop_size[0])y = random.randint(0, rows - crop_size[1])return image[y:y+crop_size[1], x:x+crop_size[0]]def adjust_brightness(image, brightness_factor):return cv2.convertScaleAbs(image, alpha=brightness_factor, beta=0)def adjust_contrast(image, contrast_factor):return cv2.convertScaleAbs(image, alpha=contrast_factor, beta=128 * (1 - contrast_factor))def add_noise(image):noise = np.random.normal(loc=0, scale=25, size=image.shape).astype(np.uint8)return cv2.add(image, noise)def color_shift(image):# 这里可以自定义颜色变换方法,例如转换为灰度图像或调整颜色通道# 以示例简单,这里只返回原图像return imagedef elastic_deformation(image):# 这里可以自定义弹性变形方法# 以示例简单,这里只返回原图像return image# 数据增强函数
def data_augmentation(image, augmentation_params):augmented_image = image.copy()for param, value in augmentation_params.items():if value:  # 只对设置为 True 的参数执行数据增强if param == 'flip':flip_code = random.choice([-1, 0, 1])augmented_image = flip(augmented_image, flip_code)elif param == 'rotate':angle = random.uniform(-value, value)augmented_image = rotate(augmented_image, angle)elif param == 'scale':scale_factor = random.uniform(1 - value, 1 + value)augmented_image = scale(augmented_image, scale_factor)elif param == 'crop':crop_size = (int(image.shape[1] * (1 - value)), int(image.shape[0] * (1 - value)))augmented_image = crop(augmented_image, crop_size)elif param == 'brightness':brightness_factor = random.uniform(1 - value, 1 + value)augmented_image = adjust_brightness(augmented_image, brightness_factor)elif param == 'contrast':contrast_factor = random.uniform(1 - value, 1 + value)augmented_image = adjust_contrast(augmented_image, contrast_factor)elif param == 'noise':augmented_image = add_noise(augmented_image)elif param == 'color_shift':augmented_image = color_shift(augmented_image)elif param == 'elastic_deformation':augmented_image = elastic_deformation(augmented_image)return augmented_image# 遍历文件夹中的图像文件并进行数据增强
def augment_images_in_folder(folder_path, output_folder, augmentation_params):os.makedirs(output_folder, exist_ok=True)for filename in os.listdir(folder_path):if filename.endswith(('.jpg', '.png', '.jpeg')):  # 只处理图像文件image_path = os.path.join(folder_path, filename)image = cv2.imread(image_path)augmented_image = data_augmentation(image, augmentation_params)output_path = os.path.join(output_folder, filename)cv2.imwrite(output_path, augmented_image)# 示例参数
augmentation_params = {'flip': True,'rotate': 15,  # 角度范围为正负15度'scale': 0.1,  # 尺度范围为原尺寸的正负10%'crop': 0.1,   # 裁剪比例为原始图像的正负10%'brightness': 0.2,  # 亮度调整范围为正负20%'contrast': 0.2,    # 对比度调整范围为正负20%'noise': True,'color_shift': False,'elastic_deformation': False
}# 指定输入和输出文件夹,并执行数据增强
input_folder = 'input_images_folder'
output_folder = 'output_images_folder'
augment_images_in_folder(input_folder, output_folder, augmentation_params)

翻转:

python">import cv2def flip_image(image_path, flip_code):"""对图像进行翻转。参数:- image_path:图像文件的路径。- flip_code:翻转方式,可以是以下值之一:* 1:水平翻转(沿 y 轴翻转)。* 0:垂直翻转(沿 x 轴翻转)。* -1:同时在水平和垂直方向翻转。返回值:- flipped_image:翻转后的图像。"""# 读取图像image = cv2.imread(image_path)# 检查图像是否成功读取if image is None:print("无法读取图像:", image_path)return None# 进行翻转flipped_image = cv2.flip(image, flip_code)return flipped_image# 示例使用
image_path = "example.jpg"
flip_code = 1  # 水平翻转
flipped_image = flip_image(image_path, flip_code)# 显示翻转后的图像
cv2.imshow("Flipped Image", flipped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

这个函数接受两个参数:图像文件的路径 image_path 和翻转方式 flip_codeflip_code 的值可以是 1(水平翻转)、0(垂直翻转)或 -1(同时在水平和垂直方向翻转)。你可以根据需要自定义翻转的方式来使用这个函数。

旋转、缩放和平移

python">import cv2
import numpy as npdef transform_image(image_path, rotation_angle=0, scale_factor=1.0, translation=(0, 0)):"""对图像进行旋转、缩放和平移。参数:- image_path:图像文件的路径。- rotation_angle:旋转角度(单位:度),默认为 0。- scale_factor:缩放因子,默认为 1.0。- translation:平移距离,格式为 (dx, dy),默认为 (0, 0)。返回值:- transformed_image:旋转、缩放和平移后的图像。"""# 读取图像image = cv2.imread(image_path)# 检查图像是否成功读取if image is None:print("无法读取图像:", image_path)return None# 获取图像尺寸height, width = image.shape[:2]# 构建旋转矩阵rotation_matrix = cv2.getRotationMatrix2D((width/2, height/2), rotation_angle, scale_factor)# 进行旋转、缩放和平移transformed_image = cv2.warpAffine(image, rotation_matrix, (width, height))transformed_image = cv2.warpAffine(transformed_image, np.float32([[1, 0, translation[0]], [0, 1, translation[1]]]), (width, height))return transformed_image# 示例使用
image_path = "example.jpg"
rotation_angle = 45  # 旋转角度为45度
scale_factor = 1.5  # 缩放因子为1.5
translation = (50, 50)  # 平移距离为(50, 50)
transformed_image = transform_image(image_path, rotation_angle, scale_factor, translation)# 显示处理后的图像
cv2.imshow("Transformed Image", transformed_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

裁剪、亮度调整、对比度调整

python">import cv2def crop_image(image_path, crop_area):"""对图像进行裁剪。参数:- image_path:图像文件的路径。- crop_area:裁剪区域,格式为 (x, y, width, height)。返回值:- cropped_image:裁剪后的图像。"""# 读取图像image = cv2.imread(image_path)# 检查图像是否成功读取if image is None:print("无法读取图像:", image_path)return None# 进行裁剪x, y, width, height = crop_areacropped_image = image[y:y+height, x:x+width]return cropped_imagedef adjust_brightness(image_path, brightness_factor):"""调整图像的亮度。参数:- image_path:图像文件的路径。- brightness_factor:亮度调整因子,大于1表示增加亮度,小于1表示降低亮度。返回值:- adjusted_image:调整亮度后的图像。"""# 读取图像image = cv2.imread(image_path)# 检查图像是否成功读取if image is None:print("无法读取图像:", image_path)return None# 进行亮度调整adjusted_image = cv2.convertScaleAbs(image, alpha=brightness_factor, beta=0)return adjusted_imagedef adjust_contrast(image_path, contrast_factor):"""调整图像的对比度。参数:- image_path:图像文件的路径。- contrast_factor:对比度调整因子,大于1表示增加对比度,小于1表示降低对比度。返回值:- adjusted_image:调整对比度后的图像。"""# 读取图像image = cv2.imread(image_path)# 检查图像是否成功读取if image is None:print("无法读取图像:", image_path)return None# 进行对比度调整adjusted_image = cv2.convertScaleAbs(image, alpha=contrast_factor, beta=128 * (1 - contrast_factor))return adjusted_image# 示例使用
image_path = "example.jpg"# 裁剪参数,格式为 (x, y, width, height)
crop_area = (100, 100, 300, 300)# 亮度调整因子
brightness_factor = 1.5# 对比度调整因子
contrast_factor = 1.5# 对图像进行裁剪
cropped_image = crop_image(image_path, crop_area)# 对图像进行亮度调整
adjusted_brightness_image = adjust_brightness(image_path, brightness_factor)# 对图像进行对比度调整
adjusted_contrast_image = adjust_contrast(image_path, contrast_factor)# 显示处理后的图像
cv2.imshow("Cropped Image", cropped_image)
cv2.imshow("Adjusted Brightness Image", adjusted_brightness_image)
cv2.imshow("Adjusted Contrast Image", adjusted_contrast_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

这个示例代码中包含了三个函数:crop_image 用于裁剪图像,adjust_brightness 用于调整图像的亮度,adjust_contrast 用于调整图像的对比度。你可以根据需要自定义裁剪区域、亮度调整因子和对比度调整因子来使用这些函数。

噪声添加、颜色变换、弹性变形

python">import cv2
import numpy as npdef add_noise(image_path, noise_type='gaussian', noise_strength=0.1):"""向图像添加噪声。参数:- image_path:图像文件的路径。- noise_type:噪声类型,可以是 'gaussian'(高斯噪声)或 'salt_and_pepper'(椒盐噪声),默认为 'gaussian'。- noise_strength:噪声强度,范围为 [0, 1],默认为 0.1。返回值:- noisy_image:添加噪声后的图像。"""# 读取图像image = cv2.imread(image_path)# 检查图像是否成功读取if image is None:print("无法读取图像:", image_path)return None# 生成噪声if noise_type == 'gaussian':noise = np.random.normal(loc=0, scale=1, size=image.shape).astype(np.uint8)noisy_image = cv2.addWeighted(image, 1 - noise_strength, noise, noise_strength, 0)elif noise_type == 'salt_and_pepper':salt_and_pepper = np.random.choice([0, 1], size=image.shape[:2] + (1,), p=[1 - noise_strength, noise_strength])noisy_image = image.copy()noisy_image[salt_and_pepper == 1] = [255, 255, 255]  # 白噪声noisy_image[salt_and_pepper == 0] = [0, 0, 0]        # 黑噪声else:print("不支持的噪声类型:", noise_type)return Nonereturn noisy_imagedef color_shift(image_path, shift_factor=0.1):"""对图像进行颜色变换。参数:- image_path:图像文件的路径。- shift_factor:颜色变换因子,范围为 [0, 1],默认为 0.1。返回值:- shifted_image:颜色变换后的图像。"""# 读取图像image = cv2.imread(image_path)# 检查图像是否成功读取if image is None:print("无法读取图像:", image_path)return None# 进行颜色变换hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)hsv_image[:, :, 1] = np.clip(hsv_image[:, :, 1] * (1 + shift_factor), 0, 255).astype(np.uint8)shifted_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR)return shifted_imagedef elastic_deformation(image_path, alpha=10, sigma=5):"""对图像进行弹性变形。参数:- image_path:图像文件的路径。- alpha:弹性变形参数,控制变形的程度,默认为 10。- sigma:高斯滤波器的标准差,影响变形的平滑程度,默认为 5。返回值:- deformed_image:弹性变形后的图像。"""# 读取图像image = cv2.imread(image_path)# 检查图像是否成功读取if image is None:print("无法读取图像:", image_path)return None# 生成随机位移场rows, cols = image.shape[:2]random_field_x = np.random.uniform(low=-1, high=1, size=(rows, cols)).astype(np.float32)random_field_y = np.random.uniform(low=-1, high=1, size=(rows, cols)).astype(np.float32)# 对位移场进行高斯滤波random_field_x_smoothed = cv2.GaussianBlur(random_field_x, (0, 0), sigma)random_field_y_smoothed = cv2.GaussianBlur(random_field_y, (0, 0), sigma)# 计算每个像素的新坐标map_x = np.arange(cols) + random_field_x_smoothed * alphamap_y = np.arange(rows) + random_field_y_smoothed * alpha# 对图像进行弹性变形deformed_image = cv2.remap(image, map_x, map_y, interpolation=cv2.INTER_LINEAR)return deformed_image# 示例使用
image_path = "example.jpg"# 噪声添加参数
noise_type = 'gaussian'  # 高斯噪声
noise_strength = 0.1     # 强度为 0.1# 颜色变换参数
shift_factor = 0.1  # 颜色变换因子为 0.1# 弹性变形参数
alpha = 10  # 弹性变形参数为 10
sigma = 5   # 高斯滤波器的标准差为 5# 对图像添加噪声
noisy_image = add_noise(image_path, noise_type, noise_strength)# 对图像进行颜色变换
shifted_image = color_shift(image_path, shift_factor)# 对图像进行弹性变形
deformed_image = elastic_deformation(image_path, alpha, sigma)# 显示处理后的图像
cv2.imshow("Noisy Image", noisy_image)
cv2.imshow("Shifted Image", shifted_image)
cv2.imshow("Deformed Image", deformed_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

这个函数接受四个参数:图像文件的路径 image_path、旋转角度 rotation_angle、缩放因子 scale_factor 和平移距离 translation。你可以根据需要自定义这些参数来对图像进行旋转、缩放和平移。

创建字典调用方法

python">import cv2
import numpy as np
import randomdef data_augmentation(image, augmentation_params):"""对图像进行数据增强。参数:- image:要增强的图像。- augmentation_params:数据增强参数,格式为 {'flip': True, 'rotate': 15, 'scale': 0.1, 'crop': 0.1, 'brightness': 0.2, 'contrast': 0.2, 'noise': True, 'color_shift': False, 'elastic_deformation': False}。返回值:- augmented_image:增强后的图像。"""augmented_image = image.copy()for param, value in augmentation_params.items():if value:  # 只对设置为 True 的参数执行数据增强if param == 'flip':flip_code = random.choice([-1, 0, 1])augmented_image = cv2.flip(augmented_image, flip_code)elif param == 'rotate':angle = random.uniform(-value, value)rows, cols = augmented_image.shape[:2]matrix = cv2.getRotationMatrix2D((cols/2, rows/2), angle, 1)augmented_image = cv2.warpAffine(augmented_image, matrix, (cols, rows))elif param == 'scale':scale_factor = random.uniform(1 - value, 1 + value)augmented_image = cv2.resize(augmented_image, None, fx=scale_factor, fy=scale_factor, interpolation=cv2.INTER_LINEAR)elif param == 'crop':rows, cols = augmented_image.shape[:2]crop_size = (int(cols * (1 - value)), int(rows * (1 - value)))x = random.randint(0, cols - crop_size[0])y = random.randint(0, rows - crop_size[1])augmented_image = augmented_image[y:y+crop_size[1], x:x+crop_size[0]]elif param == 'brightness':brightness_factor = random.uniform(1 - value, 1 + value)augmented_image = cv2.convertScaleAbs(augmented_image, alpha=brightness_factor, beta=0)elif param == 'contrast':contrast_factor = random.uniform(1 - value, 1 + value)augmented_image = cv2.convertScaleAbs(augmented_image, alpha=contrast_factor, beta=128 * (1 - contrast_factor))elif param == 'noise':augmented_image = add_noise(augmented_image)elif param == 'color_shift':augmented_image = color_shift(augmented_image)elif param == 'elastic_deformation':augmented_image = elastic_deformation(augmented_image)return augmented_image# 示例参数
augmentation_params = {'flip': True,'rotate': 15,  # 角度范围为正负15度'scale': 0.1,  # 尺度范围为原尺寸的正负10%'crop': 0.1,   # 裁剪比例为原始图像的正负10%'brightness': 0.2,  # 亮度调整范围为正负20%'contrast': 0.2,    # 对比度调整范围为正负20%'noise': True,'color_shift': False,'elastic_deformation': False
}# 调用数据增强函数
augmented_image = data_augmentation(image, augmentation_params)


http://www.ppmy.cn/ops/28797.html

相关文章

力扣刷题第0天:只出现一次的数字

目录 第一部分:题目描述 ​第二部分:题目分析 第三部分:解决方法 3.1思路1: 双指针暴力求解 3.2 思路2:异或运算 第四部分:总结收获 第一部分:题目描述 第二部分:题目分析 由图片分析可得,该题目对算法时间复杂度有一定的要求时间复杂度为O(N)&a…

【Java基础】6.泛型

《Java基础》目录 例如:第一章 Python 机器学习入门之pandas的使用 文章目录 《Java基础》目录6. 泛型6.1 泛型类6.2 泛型方法6.3 类型变量的限定6.4 泛型代码和虚拟机6.4.1 类型擦除6.4.2 转换泛型表达式6.4.3 转换泛型方法6.4.4 总结 6.5 限制与局限性6.5.1 不能…

Arcgis Pro 制图基础操作流程

为什么推荐用Arcgis Pro 出图? 1、相比Arcmap 10.X,Pro的制图功能更强大,制图更便捷 2、相比PS,Arcgis Pro中的数据自带坐标,无需校正,表达更准确 3、自带底图,方便又美观 01 — 与Arcmap …

npm许可证检查

node开发做项目,很少有人去纯手工打造,大多是采用一些开源框架,还会使用前人做好的轮子,所以咱们的项目文件里,除了自己编写的js文件,还会带有一些拿来主义的npm模块,从其他开源发布网站上下载的…

护航智慧交通安全 | 聚铭精彩亮相2024交通科技创新及信创产品推广交流会

4月26日,石家庄希尔顿酒店内,河北省智能交通协会盛大举办2024年度交通科技创新及信创产品推广交流会。聚铭网络受邀参与,携旗下安全产品及解决方案精彩亮相,为智慧交通安全保驾护航。 为深化高速公路创新驱动发展战略&#xff0…

网络性能测试工具iperf3 和iperf

目录 1. iperf工具介绍 2. 下载安装 3. 使用方法 1. iperf工具介绍 iperf 是一个网络性能测试工具,用于测量网络带宽和性能。它可以在客户端和服务器之间进行数据传输,并提供了丰富的选项来配置测试参数和输出格式。 iperf 和 iperf3 都是用于测量网…

游戏新手村22:游戏营销推广实例

本章的前面几篇重点讲了广告,本篇将通过实例的方式来讲述一款游戏产品(以端游为例,假定为《盗墓笔记》)是如何来进行营销推广的。 一般来讲,游戏上市营销计划需要先确定以下几方面的内容: 目标用户&#x…

容器Docker:轻量级虚拟化技术解析

引言 随着云计算和虚拟化技术的飞速发展,容器技术以其轻量级、高效、可移植的特性,逐渐成为了软件开发和部署的新宠。在众多容器技术中,Docker以其简单易用、功能强大的特点,赢得了广泛的关注和应用。本文将全面介绍Docker的基本概…