图像随机裁剪代码实现

原理

在计算机视觉领域,深度学习模型通常需要大量的训练数据才能获得良好的性能。然而,在实际应用中,我们可能面临训练数据不足的问题。为了解决这一问题,可以使用数据增强技术来扩充数据集。随机图像裁剪是其中一种简单而有效的方法。

随机图像裁剪的原理很简单:从原始图像中随机选取一部分区域,然后将其裁剪出来作为新的图像样本。通过多次随机裁剪,我们可以得到多个不同的子图像,从而增加数据集的多样性。这种方法可以帮助模型学习到更多的局部特征和空间关系,提高模型的泛化能力。

Python实现解析

定义random_crop函数:
参数:
image_path: 要裁剪的图像的路径。
crop_height和crop_width: 裁剪后子图像的高度和宽度。
num_crops: 从一个图像中裁剪的子图像数量。
save_dir: 保存裁剪后子图像的目录。

函数内容:
从路径中读取图像并获取其尺寸。
确保图像的尺寸大于或等于要裁剪的尺寸。
如果保存目录不存在,则创建它。
对于每次裁剪,随机选择裁剪的起始点,并从原始图像中裁剪子图像。
将裁剪后的子图像保存到指定的目录中。
def random_crop(image_path, crop_height, crop_width, num_crops, save_dir):  
    # 读取图像  
    image = cv2.imread(image_path)  
    image_height, image_width, _ = image.shape  
    # 确保图像的尺寸大于要截取的尺寸  
    assert image_height >= crop_height and image_width >= crop_width, "Image size is smaller than the desired crop size."  
    # 如果保存目录不存在,则创建它  
    if not os.path.exists(save_dir):  
        os.makedirs(save_dir)  
        
    # 图像名称(不带扩展名)  
    base_name = os.path.splitext(os.path.basename(image_path))[0]  
        
    for i in range(num_crops):  
        # 随机选择截取的左上角点  
        x = random.randint(0, image_width - crop_width)  
        y = random.randint(0, image_height - crop_height)  
            
        # 进行截取  
        crop = image[y:y+crop_height, x:x+crop_width].copy()  
            
        # 保存截取的图像  
        save_path = os.path.join(save_dir, f"{base_name}_{i}.jpg")  # 你可以根据需要更改保存的文件格式  
        cv2.imwrite(save_path, crop)  
        print(f"Saved crop to {save_path}")  
        
    print(f"Finished cropping {num_crops} crops from {image_path}")  
  

以上为图像进行裁剪的核心代码,对大量的图像进行了裁剪,只需遍历图像所在的文件夹即可;

水平有限,有问题随时交流~

彩蛋

在这里插入图片描述
一个以AI算法与工程技术为核心的公众号,欢迎关注交流~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系列十四、SpringBoot + JVM参数配置实战调优

一、SpringBoot JVM参数配置实战调优 1.1、概述 前面的系列文章大篇幅的讲述了JVM的内存结构以及各种参数,今天就使用SpringBoot项目实战演示一下,如何进行JVM参数调优,如果没有阅读过前面系列文章的朋友,建议先阅读后再看本篇文…

Windows系统安装 ffmpeg

下载及解压 ffmpeg官方下载地址:https://ffmpeg.org/download.html 下载好后将其解压至你想保存的位置中。 环境变量设置 打开Windows设置,在搜索框输入:系统高级设置。 新建环境变量,并输入bin目录具体位置。 安装检查 按住 w…

人工智能:从基础到前沿

人工智能:从基础到前沿 引言 当我们谈论“人工智能”(AI)时,我们其实是在谈论一个涵盖了众多学科、技术和应用的广阔领域。从计算机视觉到自然语言处理,从机器人学到深度学习,AI已经成为我们生活中不可或…

电脑上添加不了网络打印机的所有可能的原因,在这里差不多都能找到

在电脑上添加网络打印机通常很容易,但如果Windows无法很好识别或根本找不到它们呢?以下是一些快速解决方案。 无论你是升级到Windows 11还是仍在使用Windows 10,连接无线打印机都应该很容易。Windows应该能够自动连接到与你的电脑位于同一网络上的任何打印机。但有时,Windo…

大数据Doris(四十):聚合模型的局限性和ROLLUP的说明

文章目录 聚合模型的局限性和ROLLUP的说明 一、聚合模型的局限性

linux内存寻址原来那么简单

内存寻址 内存寻址听起来高大上,其实真实处理起来很简单,以常见的80x86架构为例,有三种不同的地址: 逻辑地址线性地址物理地址 内存控制单元(MMU)通过分段单元的硬件电路把一个逻辑地址转化为线性地址,通过分页单元的…

单例模式(C++实现)

RAII运用 只能在栈上创建对象 只能在堆上创建的对象 单例模式 设计模式 懒汉模式 解决线程安全 优化 饿汉模式 饿汉和懒汉的区别

Vue3学习(后端开发)

目录 一、安装Node.js 二、创建Vue3工程 三、用VSCode打开 四、源代码目录src 五、入门案例——手写src 六、测试案例 七、ref和reactive的区别 一、安装Node.js 下载20.10.0 LTS版本 https://nodejs.org/en 使用node命令检验安装是否成功 node 二、创建Vue3工程 在…

C语言--if...else语句【语法讲解】

一.if...else语句的介绍 if…else 语句是编程中常用的一种分支语句,用于根据条件执行不同的操作。 它的基本语法如下: if (条件表达式) {// 当条件表达式为真时执行的代码块 } else {// 当条件表达式为假时执行的代码块 } 当条件表达式为真时&#xff…

互联网上门洗衣洗鞋小程序优势有哪些?

互联网洗鞋店小程序相较于传统洗鞋方式,具有以下优势; 1. 便捷性:用户只需通过手机即可随时随地下单并查询,省去了许多不必要的时间和精力。学生们无需走出宿舍或校园,就能轻松预约洗鞋并取件。 2. 精准定位&#xff1…

前菜---二叉树+堆的小练习

目录 前言🏜️ 1. 二叉树性质总结⛱️ 1.2 性质3⏰ 2. 二叉树性质小练习🏕️ 3. 答案解析💡 4. 堆概念结构小练习🪔 5. 答案解析🧿 6. 前/中/后/层序遍历小练习🔫 7. 答案解析🧺 后语…

祝大家圣诞节快乐

同时庆祝 JWFD 20周年

c++代码寻找USB00端口并添加打印机

USB00*端口的背景 插入USB端口的打印机,安装打印机驱动,在控制面板设备与打印机处的打印机对象上右击,可以看到打印机端口。对于不少型号,这个端口是USB001或USB002之类的。 经观察,这些USB00*端口并不是打印机驱动所…

Seata 序列化问题

异常: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Type id handling not implemented for type java.lang.Object (by serializer of type com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer) (through reference chain: i…

新建项目EasyUiAutotest,安装Appium-Python-Client

一、前置说明 Appium-Python-Client 是 Appium 的 Python 客户端库,它提供了一系列的类和方法,用于与 Appium 服务器进行通信,并执行各种移动应用测试操作,包括启动应用、模拟用户输入、点击等操作。 二、操作步骤 1. 启动Pych…

Exynos4412 移植Linux-6.1(九)移植tiny4412_backlight驱动的过程及问题解决

系列文章目录 Exynos4412 移植Linux-6.1(一)下载、配置、编译Linux-6.1 Exynos4412 移植Linux-6.1(二)SD卡驱动——解决无法挂载SD卡的根文件系统 Exynos4412 移植Linux-6.1(三)SD卡驱动——解决mmc0: Ti…

写了这么多年DateUtils,殊不知你还有这么多弯弯绕!

目录 在日常开发中,Date工具类使用频率相对较高,大家通常都会这样写:这很简单啊,有什么争议吗?格式化后出现的时间错乱。看看Java 8是如何解决时区问题的:在处理带时区的国际化时间问题,推荐使用…

LSTM和GRU vs 循环神经网络RNN

1、考虑下列三种情况下,对比一下普通RNN的表现和LSTM和GRU表现: (1)早期观测值对预测未来观测者具有非常重要的意义。 考虑一个极端情况,其中第一个观测值包含一个校验和, 目标是在序列的末尾辨别校验和是…

第十四章 集合(List)

一、集合框架体系 集合: (1)可以动态保存任意多个对象。 (2)提供了一系列方便的操作对象的方法:add、remove、set、get等。 二、Collection 1. Collection 接口常用方法 (1)add&a…

BP网络识别26个英文字母matlab

wx供重浩:创享日记 对话框发送:字母识别 获取完整源码源工程文件 一、 设计思想 字符识别在现代日常生活的应用越来越广泛,比如车辆牌照自动识别系统,手写识别系统,办公自动化等等。本文采用BP网络对26个英文字母进行…