pythons工具——图像的随机增强变换(只是变换了图像,可用于分类训练数据的增强)
从文件夹中随机选择一定数量的图像,然后对每个选定的图像进行一次随机的数据增强变换。
import os
import random
import cv2
import numpy as np
from PIL import Image, ImageEnhance, ImageOps# 定义各种数据增强方法
def random_rotate(image, angle_range=(-30, 30)):angle = random.uniform(angle_range[0], angle_range[1])(h, w) = image.shape[:2]center = (w // 2, h // 2)M = cv2.getRotationMatrix2D(center, angle, 1.0)rotated = cv2.warpAffine(image, M, (w, h), borderMode=cv2.BORDER_REFLECT)return rotateddef random_translate(image, translate_range=(-50, 50)):tx = random.randint(translate_range[0], translate_range[1])ty = random.randint(translate_range[0], translate_range[1])(h, w) = image.shape[:2]M = np.float32([[1, 0, tx], [0, 1, ty]])translated = cv2.warpAffine(image, M, (w, h), borderMode=cv2.BORDER_REFLECT)return translateddef random_flip(image):flip_code = random.choice([-1, 0, 1])flipped = cv2.flip(image, flip_code)return flippeddef random_scale(image, scale_range=(0.8, 1.2)):scale = random.uniform(scale_range[0], scale_range[1])(h, w) = image.shape[:2]new_dim = (int(w * scale), int(h * scale))scaled = cv2.resize(image, new_dim, interpolation=cv2.INTER_LINEAR)return scaleddef random_crop(image, crop_size=(224, 224)):(h, w) = image.shape[:2]if crop_size[0] > h or crop_size[1] > w:# 当裁剪尺寸大于图像尺寸时,抛出异常或调整裁剪尺寸raise ValueError("Crop size is larger than image size.")top = random.randint(0, h - crop_size[0])left = random.randint(0, w - crop_size[1])cropped = image[top:top+crop_size[0], left:left+crop_size[1]]return croppeddef random_color_jitter(image):pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))color_jitter = ImageEnhance.Color(pil_image).enhance(random.uniform(0.6, 1.4))contrast_jitter = ImageEnhance.Contrast(color_jitter).enhance(random.uniform(0.5, 1.5))brightness_jitter = ImageEnhance.Brightness(contrast_jitter).enhance(random.uniform(0.6, 1.4))sharpness_jitter = ImageEnhance.Sharpness(brightness_jitter).enhance(random.uniform(0.6, 1.4))jittered = cv2.cvtColor(np.array(sharpness_jitter), cv2.COLOR_RGB2BGR)return jittereddef random_add_noise(image):row, col, ch = image.shapemean = 0var = 0.1sigma = var ** 0.5gauss = np.random.normal(mean, sigma, (row, col, ch))gauss = gauss.reshape(row, col, ch)noisy = image + gaussreturn np.clip(noisy, 0, 255).astype(np.uint8)# 数据增强主函数
def augment_random_images(src_folder, dst_folder, num_images_to_select, num_augmentations_per_image):if not os.path.exists(dst_folder):os.makedirs(dst_folder)# 获取所有图像文件名all_filenames = [f for f in os.listdir(src_folder) if f.lower().endswith(('.png', '.jpg', '.jpeg'))]# 如果选择的图像数量大于总图像数量,则只处理全部图像num_images_to_process = min(num_images_to_select, len(all_filenames))# 随机选择图像selected_filenames = random.sample(all_filenames, num_images_to_process)# 创建一个增强方法列表augmentation_methods = [random_rotate,#random_translate,random_flip,random_scale,#random_crop,random_color_jitter,random_add_noise]for filename in selected_filenames:img_path = os.path.join(src_folder, filename)image = cv2.imread(img_path)for i in range(num_augmentations_per_image):# 随机选择一种增强方法augmentation_method = random.choice(augmentation_methods)# 应用选中的增强方法augmented_img = augmentation_method(image)# 保存增强后的图像base_name, ext = os.path.splitext(filename)save_path = os.path.join(dst_folder, f"{base_name}_aug_{i}{ext}")cv2.imwrite(save_path, augmented_img)if __name__ == "__main__":src_folder = 'path/to/source/folder' # 替换为你的源文件夹路径dst_folder = 'path/to/destination/folder' # 替换为你要保存增强图像的文件夹路径num_images_to_select = 10 # 从源文件夹中随机选择的图像数量num_augmentations_per_image = 5 # 每张图像生成的增强图像数量augment_random_images(src_folder, dst_folder, num_images_to_select, num_augmentations_per_image)print(f"图像增强完成,增强后的图像已保存到 {dst_folder}")
说明
- 随机选择图像:从源文件夹中随机选择num_images_to_select数量的图像。
- 随机选择一种增强方法:对于每张选定的图像,随机选择一种数据增强方法。
- 应用增强方法:对每张选定的图像应用所选的增强方法。
- 保存增强后的图像:将增强后的图像保存到目标文件夹中。
参数
•src_folder:源文件夹路径。
•dst_folder:目标文件夹路径。
•num_images_to_select:从源文件夹中随机选择的图像数量。
•num_augmentations_per_image:每张选定的图像生成的增强图像数量。
请确保将src_folder和dst_folder变量设置为您实际使用的文件夹路径,并根据需要调整num_images_to_select和num_augmentations_per_image的值。运行这段代码后,将得到从源文件夹中随机选择的图像,并对这些图像进行了随机的数据增强变换。
相关文章:
pythons工具——图像的随机增强变换(只是变换了图像,可用于分类训练数据的增强)
从文件夹中随机选择一定数量的图像,然后对每个选定的图像进行一次随机的数据增强变换。 import os import random import cv2 import numpy as np from PIL import Image, ImageEnhance, ImageOps# 定义各种数据增强方法 def random_rotate(image, angle_range(-30…...
C++中volatile限定符详解
volatile是 C 和 C 中的一个类型限定符,它用于告诉编译器被修饰的变量具有特殊的属性,编译器在对该变量进行优化时需要特殊对待。以下是volatile限定符的主要作用: 1. 防止优化 内存访问顺序:在多线程环境或者与硬件交互的程序中…...

如何关闭Python解释器
方法1:采用sys.exit(0)正常终止程序,从图中可以看到,程序终止后shell运行不受影响。 方法2:采用os._exit(0)关闭整个shell,从图中看到,调用sys._exit(0)后整个shell都重启了(RESTART Shell&…...

《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项
《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项 《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项套接字可选项和 I/O 缓冲大小套接字多种可选项getsockopt & setsockoptSO_SNDBUF & SO_RCVBUF SO_REUSEADDR发生地址绑定…...
渗透测试---网络基础之HTTP协议与内外网划分
声明:学习素材来自b站up【泷羽Sec】,侵删,若阅读过程中有相关方面的不足,还请指正,本文只做相关技术分享,切莫从事违法等相关行为,本人一律不承担一切后果 目录 一、HTTP协议各版本介绍 二、HTTP请求的方…...
15分钟学 Go 第 45 天 : 使用Docker容器
第45天:使用Docker容器 目标 在本节中,我们将深入了解Docker及其基本用法,掌握如何使用Docker容器来简化开发和部署流程。 背景知识 Docker是一个开源平台,用于开发、运输和运行应用程序。它使我们能够使用容器技术将应用程序…...

DriveLM 论文学习
论文链接:https://arxiv.org/pdf/2312.14150 代码链接:https://github.com/OpenDriveLab/DriveLM 解决了什么问题? 当前,自动驾驶方案的性能仍然不足。一个必要条件就是泛化能力,需要模型能处理未经训练的场景或不熟…...

YoloV10改进策略:上采样改进|CARAFE,轻量级上采样|即插即用|附改进方法+代码
论文介绍 CARAFE模块概述:本文介绍了一种名为CARAFE(Content-Aware ReAssembly of FEatures)的模块,它是一种用于特征上采样的新方法。应用场景:CARAFE模块旨在改进图像处理和计算机视觉任务中的上采样过程࿰…...

光模块基础知识
1. 光模块的封装 光模块是光收发模块的简称,主要根据不同的外型来区分,而在同一外型中,又有着多种规格;在数据通信领域,最常见的光模块(根据外型区分)分别是SFF、GBIC、SFP、和XFP、QSFP 、XEN…...

【go从零单排】Closing Channels通道关闭、Range over Channels
🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 在 Go 语言中,通道(channel)的关闭是一个重要…...

初始JavaEE篇 —— 文件操作与IO
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 目录 文件介绍 Java标准库中提供操作文件的类 文件系统操作 File类的介绍 File类的使用 文件内容操作 二进制文件的读写操作…...
GitLab实现 HTTP 访问和 SMTP 邮件发送
GitLab实现 HTTP 访问和 SMTP 邮件发送 本教程详细记录了如何配置 SMTP 邮件通知、实现外网 HTTP 访问,并分享在配置过程中遇到的问题及解决方法。 一、准备工作 安装 Docker:确保在 Synology NAS 上安装 Docker 应用。下载 GitLab 镜像:在…...

HarmonyOS ArkTS 下拉列表组件
Entry Component struct Index {defaultValue: string 下拉列表;// 定义选项数组,包含 value 和可选的 labeloptions: Array<SelectOption> [{ value: aaa },{ value: bbb },{ value: ccc },{ value: ddd },{ value: eee },{ value: fff },{ value: ggg },{…...

zabbix监控Linux系统
1. zabbix agent安装 #sudo rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-4.el8.noarch.rpm #sudo dnf clean all #yum install zabbix-agent -y Running transaction test Transaction test succeeded. Running transactionPreparing …...
线性表-数组描述补充 迭代器(C++)
补充线性表数组实现的迭代器部分 知识点: typedef是C语言中的一个关键字,它的主要作用是为一种数据类型定义一个新的名字(别名)。 在 C 的 STL(Standard Template Library)中,迭代器是连接容…...

vue3 + element-plus 的 upload + axios + django 文件上传并保存
之前在网上搜了好多教程,一直没有找到合适自己的,要么只有前端部分没有后端,要么就是写的不是很明白。所以还得靠自己摸索出来后,来此记录一下整个过程。 其实就是不要用默认的 action,要手动实现上传方式 http-reque…...

dm 创建数据库实例【window】
参考链接:配置实例 1)打开 DM 数据库配置助手 2)按照默认的进行 字符串大小写敏感:譬如 mysql 默认是大小写不敏感,如果在迁移中还选择了 保持对象大小写,那么就会出现一种情况就是每次查询等带有表名的都…...
Docker实践与应用举例:从入门到进阶
Docker实践与应用举例:从入门到进阶 在云计算和微服务架构日益盛行的今天,Docker作为一种轻量级的容器化技术,凭借其高效、灵活、可移植的特点,迅速成为了开发和运维团队的首选工具。本文将通过深入浅出的方式,探讨Do…...
【LeetCode】【算法】560. 和为 K 的子数组
LeetCode 560. 和为 K 的子数组 题目描述 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 思路 思路:前缀和 定义数组preSum[nums.length1],在里面计算nums…...

Webots控制器编程
本文主要内容是如何编写Webots控制器,使用语言为Python。 文章目录 1. 新增控制器2. Hello World Example3. 读取传感器4. 使用执行器5. 理解step和robot.step函数6. 同时使用传感器和执行器7. 控制器参数 1. 新增控制器 对机器人Robot新增控制器的方式࿱…...

暴雨新专利解决服务器噪音与性能悖论
6月1日,我国首部数据中心绿色化评价方面国家标准《绿色数据中心评价》正式实施,为我国数据中心的绿色低碳建设提供了明确指引。《评价》首次将噪音控制纳入国家级绿色评价体系,要求从设计隔声结构到运维定期监测实现闭环管控,加速…...
Java线程池核心原理与最佳实践
Java 线程池详解 线程池是Java并发编程的核心组件,它能高效管理线程生命周期,避免频繁创建销毁线程的开销,提升系统性能和资源利用率。 一、线程池核心优势 降低资源消耗:复用已创建的线程,减少线程创建销毁开销提高…...

Redis知识体系
1. 概述 本文总结了Redis基本的核心知识体系,在学习Redis的过程中,可以将其作为学习框架,以此更好的从整体的角度去理解和学习Redis的内容和设计思想。同时知识框架带来的好处是可以帮助我们更好的进行记忆,在大脑中形成相应的知识…...

基于FPGA的超声波显示水位距离,通过蓝牙传输水位数据到手机,同时支持RAM存储水位数据,读取数据。
基于FPGA的超声波显示水位距离 前言一、整体框架二、代码架构1.超声波测距模块2.蓝牙数据发送模块3.数码管数据切换模块4.数码管驱动模块6.串口驱动7.顶层模块8.RAM ip核 仿真相关截图 前言 随着工业化进程的加速和环境保护意识的提升,对水资源管理和水位监测的需求…...

Vue-Leaflet地图组件开发(三)地图控件与高级样式设计
第三篇:Vue-Leaflet地图控件与高级样式设计 1. 专业级比例尺组件实现 1.1 比例尺控件集成 import { LControl } from "vue-leaflet/vue-leaflet";// 在模板中添加比例尺控件 <l-control-scaleposition"bottomleft":imperial"false&qu…...
android 之 MediaExtractor
MediaExtractor 是Android多媒体处理的基础组件,解封装是其核心价值。 一、功能与定位 MediaExtractor 是Android多媒体框架中的媒体解封装工具,主要作用是从媒体文件(如MP4、MKV、MP3)中分离音视频轨道数据,为后续解…...

智能生成完整 Java 后端架构,告别手动编写 ControllerServiceDao
在 Java 后端开发的漫长征途上,开发者们常常深陷繁琐的基础代码编写泥潭。尤其是 Controller、Service、Dao 这三层代码的手动编写,堪称开发效率的 “拦路虎”。从搭建项目骨架到填充业务逻辑,每一个环节都需要开发者投入大量精力,…...

附加模块--Qt Shader Tools功能及架构解析
Qt 6.0 引入了全新的 Shader Tools 模块,为着色器管理提供了现代化、跨平台的解决方案。 一、主要功能 核心功能 跨平台着色器编译 支持 GLSL、HLSL 和 MetalSL 着色器语言 可在运行时或构建时进行着色器编译 自动处理不同图形API的着色器变体 SPIR-V 支持 能…...

PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的区别
python容易编辑,因此用pyrx代替rxjava3做演示会比较快捷。 pyrx安装命令: pip install rx 一、Subject(相当于 RxJava 的 PublishSubject) PublishSubject PublishSubject 将对观察者发送订阅后产生的元素,而在订阅前…...

实验四:图像灰度处理
实验四 图像处理实验报告 目录 实验目的实验内容 原理描述Verilog HDL设计源代码Testbench仿真代码及仿真结果XDC文件配置下板测试 实验体会实验照片 实验目的 在实验三的基础上,将图片显示在显示器上,并进行灰度处理。 实验内容 原理描述 1. 图片的…...