pythons工具——图像的随机增强变换(只是变换了图像,可用于分类训练数据的增强)

news2024/11/14 6:53:32

从文件夹中随机选择一定数量的图像,然后对每个选定的图像进行一次随机的数据增强变换。

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 rotated

def 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 translated

def random_flip(image):
    flip_code = random.choice([-1, 0, 1])
    flipped = cv2.flip(image, flip_code)
    return flipped

def 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 scaled

def 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 cropped

def 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 jittered

def random_add_noise(image):
    row, col, ch = image.shape
    mean = 0
    var = 0.1
    sigma = var ** 0.5
    gauss = np.random.normal(mean, sigma, (row, col, ch))
    gauss = gauss.reshape(row, col, ch)
    noisy = image + gauss
    return 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}")

说明

  1. 随机选择图像:从源文件夹中随机选择num_images_to_select数量的图像。
  2. 随机选择一种增强方法:对于每张选定的图像,随机选择一种数据增强方法。
  3. 应用增强方法:对每张选定的图像应用所选的增强方法。
  4. 保存增强后的图像:将增强后的图像保存到目标文件夹中。
    参数
    •src_folder:源文件夹路径。
    •dst_folder:目标文件夹路径。
    •num_images_to_select:从源文件夹中随机选择的图像数量。
    •num_augmentations_per_image:每张选定的图像生成的增强图像数量。
    请确保将src_folder和dst_folder变量设置为您实际使用的文件夹路径,并根据需要调整num_images_to_select和num_augmentations_per_image的值。运行这段代码后,将得到从源文件夹中随机选择的图像,并对这些图像进行了随机的数据增强变换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238772.html

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

相关文章

大数据技术在金融风控中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 大数据技术在金融风控中的应用 大数据技术在金融风控中的应用 大数据技术在金融风控中的应用 引言 大数据技术概述 定义与原理 发…

小程序中引入下载到本地的iconfont字体图标加载不出来问题解决

我这个是uniapp项目,字体图标都是一样的,在vue项目中web端、uniapp运行到h5都没问题,但是运行到小程序加载不出来,报错如下: 不让用本地路径,所以我们要转为base64编码,这里给大家提供一个工具,它可以把本地字体文件转为base64:transfonter 进入官网后,第一步: …

MYSQL隔离性原理——MVCC

表的隐藏字段 表的列包含用户自定义的列和由系统自动创建的隐藏字段。我们介绍3个隐藏字段,不理解也没有关系,理解后面的undo log就懂了: DB_TRX_ID :6 byte,最近修改( 修改/插入 )事务ID,记录创建这条记…

vue3 + element-plus 的 upload + axios + django 文件上传并保存

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

【C++课程学习】:二叉搜索树

🎁个人主页:我们的五年 🔍系列专栏:C课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 二叉树搜索树的概念: 节点的结构: ⚽️结构: ⚽️ 构造函数&…

Axure是什么软件?全方位解读助力设计入门

在产品设计和开发领域,Axure是一款大名鼎鼎且功能强大的软件,它为专业人士和团队提供了卓越的设计支持,帮助他们将创意转化为实际可操作的产品原型。 一、Axure 的基本介绍 Axure是一款专业的原型设计工具,主要用于创建交互式的…

java里面使用groovy案例+详解

场景: 最近有一个计算商品运费的,如果商品的数量大于快递公司设置的数量 10 那么超出部分也需要计算额外运费,那么这些计算过程代码我能不能不在java里面写呢,用一种可配置化的方式来根据不同的传参计算出运费? 页面传…

单体架构 IM 系统之核心业务功能实现

在上一篇技术短文(单体架构的 IM 系统设计)中,我们讨论了在 “用户规模小、开发人员少、开发时间短” 的业务背景下,采取 “怎么简单怎么做,怎么快怎么来” 的研发策略,于是设计了 单体架构的IM系统&#x…

Linux部署nginx访问文件403

问题描述:在linux服务器上通过nginx部署,访问文件403 新配置了一个用户来部署服务,将部署文件更新到原有目录下,结果nginx访问403 原因:没有配置文件的读写权限,默认不可读写,nginx无法访问到文…

解决 C/C++ 中 “invalid use of incomplete type” 编译错误

解决 C/C++ 中 “invalid use of incomplete type” 编译错误 一、错误原因二、常见场景三、解决方法四、最佳实践五、总结在 C 和 C++ 编程中,invalid use of incomplete type 错误通常发生在尝试使用一个未完全定义的类型时。这个错误表明编译器在当前上下文中没有足够的信息…

使用 Python 实现高效网页爬虫——从获取链接到数据保存

前言 在这个时代,网络爬虫已成为数据分析与信息收集不可或缺的技术之一。本文将通过一个具体的Python项目来介绍如何构建一个简单的网络爬虫,它能够自动抓取指定网站的文章链接、标题、正文内容以及图片链接,并将这些信息保存为CSV文件。 目标网站 一、准备工作 在开始编…

C# 有趣的小程序—桌面精灵详细讲解

C# 桌面精灵详细讲解 最近写了一个简化版桌面精灵,效果如图所示,可以实现切换动画,说话、鼠标拖动,等功能。具体如何做,我发布了一个资源里面包含ppt详解、源代码以及动画素材。放心吧,免费的,…

微软日志丢失事件敲响安全警钟

NEWS | 事件回顾 最近,全球最大的软件公司之一——微软,遭遇了一场罕见的日志丢失危机。据报告,从9月2日至9月19日,持续长达两周的时间里,微软的多项核心云服务,包括身份验证平台Microsoft Entra、安全信息…

Mysql ERROR 1451 (23000) 外键处理异常

通过临时设置外键失效,来规避报错 第一步 # 临时设置外键失效 SET FOREIGN_KEY_CHECKS 0; 第二步:执行更新或者删除操作 第三步: # 操作结束后恢复外键 SET FOREIGN_KEY_CHECKS 1;

智慧社区可视化解决方案:科技引领社区服务与管理新篇章

随着社会的发展,智慧社区作为新型城镇化发展目标和社区服务体系建设的重要举措,正逐步改变着我们的生活方式。智慧社区通过综合运用现代科学技术,整合区域资源,提升社区治理和服务水平,为居民提供更为便捷、高效、安全…

基于redis实现API接口访问次数限制

一,概述 日常开发中会有一个常见的需求,需要限制接口在单位时间内的访问次数,比如说某个免费的接口限制单个IP一分钟内只能访问5次。该怎么实现呢,通常大家都会想到用redis,确实通过redis可以实现这个功能&#xff0c…

【go从零单排】Ticker

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 在 Go 语言中,Ticker 是一个用于定期执行某些操作的工具。它属于 tim…

C++《stack与queue》

在之前的章节我们学习了C当中string、vector和list三种容器并且试着模拟实现这三种容器,那么接下来在本篇当中我们将STL当中的stack和queue,并且在学习stack和queue的使用之后和之前一样还会试着模拟实现stck和queue。由于stck和queue的模拟实现较为简单…

网页web无插件播放器EasyPlayer.js点播播放器遇到视频地址播放不了的现象及措施

在数字媒体时代,视频点播已成为用户获取信息和娱乐的重要方式。EasyPlayer.js作为一款流行的点播播放器,以其强大的功能和易用性受到广泛欢迎。然而,在使用过程中,用户可能会遇到视频地址无法播放的问题,这不仅影响用户…

【前端】HTML标签汇总

目录 展示用户信息的标签 1.文本标签 span 2.标题标签 h1~h6 3.竖着布局的标签 div 4.段落标签 p 5.超链接标签 a 5.1跳转至网上的资源 5.2锚点 6.列表标签 6.1有序列表 ol 6.2无序列表 ul 7.图片标签 img 7.1相对路径 7.1.1兄弟关系 7.1.2叔侄关系 7.1.3表兄弟…