CV数据增强

使用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)

翻转:

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(同时在水平和垂直方向翻转)。你可以根据需要自定义翻转的方式来使用这个函数。

旋转、缩放和平移

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()

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

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 用于调整图像的对比度。你可以根据需要自定义裁剪区域、亮度调整因子和对比度调整因子来使用这些函数。

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

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。你可以根据需要自定义这些参数来对图像进行旋转、缩放和平移。

创建字典调用方法

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.mzph.cn/news/829973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode刷题记录】简单篇-70-爬楼梯

【题目描述】 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 【测试用例】 示例1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1.1阶 1阶…

C语言-------实现贪吃蛇小游戏

目录 一、预备知识 1.1 Win32 API介绍 Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外, 它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程…

PyVista 3D数据可视化 Python 库 简介

Pyvista是一个用于科学可视化和分析的Python库 ;我认为它适合做一些网格数据的处理; 它封装了VTK(Visualization Toolkit)之上,提供了一些高级接口, 3D数据可视化变得更加简单和易用。 1.安装 pyvista&…

SpringMVC进阶(自定义拦截器以及异常处理)

文章目录 1.自定义拦截器1.基本介绍1.说明2.自定义拦截器的三个方法3.流程图 2.快速入门1.Myinterceptor01.java2.FurnHandler.java3.springDispatcherServlet-servlet.xml配置拦截器4.单元测试 3.拦截特定路径1.拦截指定路径2.通配符配置路径 4.细节说明5.多个拦截器1.执行流程…

LeetCode 150. 逆波兰表达式求值

LeetCode 150. 逆波兰表达式求值 1、题目 题目链接:150. 逆波兰表达式求值 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: 有效的算符为 ‘’、‘-’、…

如何基于Zookeeper实现注册中心模型?

在分布式系统中,通常会存在几十个甚至上百个服务,开发人员可能甚至都无法明确系统中到底有哪些服务正在运行。另一方面,我们很难同时确保所有服务都不出现问题,也很难保证当前的服务部署方式不做调整和优化。由于自动扩容、服务重…

tableau如何传参数到MySQL数据库

1、打开tableau连接本地MySQL-》新建自定义sql-》创建参数 2、新建一个简单的工作表-》把维度拖拽到行显示结果-》右键显示参数 3、参数传递到数据库sql写法 select * from yonghu where yonghu.姓名 like concat(%,<参数.姓名>,%)select * FROMabadata4WHERE abadata4…

基于STM32单片机的汽车胎压、速度及状态监测系统设计与实现

基于STM32单片机的汽车胎压、速度及状态监测系统设计与实现 摘要&#xff1a; 随着汽车电子技术的快速发展&#xff0c;车辆状态实时监控系统的需求日益增长。本文设计并实现了一种基于STM32单片机的汽车胎压、速度及状态监测系统。该系统能够实时监测汽车的胎压、速度以及其他…

MCU自动测量单元:自动化数据采集的未来

随着科技的飞速发展&#xff0c;自动化技术在各个领域中的应用日益广泛。其中&#xff0c;MCU(微控制器)自动测量单元以其高效、精准的特性&#xff0c;成为自动化数据采集领域的佼佼者&#xff0c;引领着未来数据采集技术的革新。本文将深入探讨MCU自动测量单元的原理、优势以…

实习面试算法准备之图论

这里写目录标题 1 基础内容1.1 图的表示1.2图的遍历 2 例题2.1 所有可能的路径 1 基础内容 图没啥高深的&#xff0c;本质上就是个高级点的多叉树而已&#xff0c;适用于树的 DFS/BFS 遍历算法&#xff0c;全部适用于图。 1.1 图的表示 图的存储在算法题中常用邻接表和邻接矩…

84.柱形图中最大的矩阵

二刷终于能过了. 思路解析: 不愧是hard,第一步就很难想, 对于每一个矩阵,我们要想清楚怎么拿到最大矩阵, 对于每个height[i],我们需要找到left和right,left是i左边第一个小于height[i]的,right是右边第一个小于height[i]的,那么他的最大矩阵就是height[i] * (right-left-…

linux下安装deepspeed

安装步骤 一开始安装deepspeed不可以使用pip直接进行安装。 这时我们需要利用git进行clone下载到本地&#xff1a; git clone https://github.com/microsoft/DeepSpeed.git 进入到deepspeed的安装目录下 cd /home/bingxing2/ailab/group/ai4agr/wzf/Tools/DeepSpeed 激活…

LeetCode-旋转链表

每日一题&#xff0c;很久没做链表的题了&#xff0c;今天做l一道相对简单的力扣中等难度题。 题目要求 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&…

智慧浪潮下的产业园区:洞察智慧化转型如何打造高效、绿色、安全的新园区

目录 一、引言 二、智慧化转型的内涵与价值 三、打造高效园区的智慧化策略 1、建设智能化基础设施 2、推广智能化应用 3、构建智慧化服务平台 四、实现绿色园区的智慧化途径 1、推动绿色能源应用 2、实施绿色建筑设计 3、加强环境监测与治理 五、保障园区安全的智慧…

大白菜启动U盘想格式化但格式化不了

部分区域被修改分区表保护起来了。直接格式化的话&#xff0c;里面的文件夹都还在。根本格式化不了。特别是可用容量并未还原出来。 进入计算机管理》磁盘管理&#xff0c;看到U盘盘符。别搞错了。删除掉里面的已经分的区域和未分区区域&#xff0c;让它还原成一个整体。退出。…

Webpack-入门

定义 静态模块&#xff1a;指的是编写代码过程中的html&#xff0c;css&#xff0c;js&#xff0c;图片等固定内容的文件 打包&#xff1a;把静态模块内容压缩、整合、翻译等&#xff08;前端工程化&#xff09; 1&#xff09;把less/sass转成css代码 2&#xff09;把ES6降级…

webpack 入口和出口的最佳实践

入口和出口的最佳实践 {ignore} 具体情况具体分析 下面是一些经典场景 一个页面一个JS 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 源码结构 |—— src|—— pageA 页面A的代码目录|—— index.js 页面A的启动模块|—— ...|—— pageB 页面…

matlab学习007-已知离散时间系统的系统函数并使用matlab绘制该系统的零极点图;判断系统的稳定性;幅频和相频特性曲线

目录 题目 离散时间系统的系统函数&#xff1a;H(z)(3*z^3-5*z^210z)/(z^3-3*z^27*z-5) 1&#xff0c;绘制该系统的零极点图 1&#xff09;零极点图 2&#xff09;代码 2&#xff0c;判断系统的稳定性 1&#xff09;判断结果 2&#xff09;代码 3&#xff0c;试用MATL…

闲话 ASP.NET Core 数据校验(一):内置数据校验

前言 所谓输入的是垃圾&#xff0c;输出也必然是垃圾&#xff0c;有多少安全问题隐藏在请求的数据中&#xff0c;所以永远不能相信来自用户端的输入。 对请求数据的合法性进行校验&#xff0c;不仅有助于提升用户界面的友好性&#xff0c;而且有助于提高后台程序的安全性和稳…

【车载开发系列】UDS诊断时间参数说明

【车载开发系列】UDS诊断时间参数说明 一. 应用层诊断时间参数 1&#xff09;P2 CAN_Client 诊断仪成功发送诊断报文请求之后到收到 ECU回复诊断响应的超时时间间隔 2&#xff09;P2 CAN_Server ECU 接收到诊断请求之后到开始发送诊断报文的时间间隔&#xff0c;一般默认最…