OpenCV按指定大小分割图像并保存详细讲解

news2024/12/23 3:52:24

这几天在忙着整理自己的数据集,使用工业级相机拍了好多高清照片,但是模型训练的时候需要使用512*512像素点大小的图像,而且我的模型设计的时候就已经规定好了训练样本大小。
那就分割呗,把拍的照片按512*512分割一小块一小块的,然后打标签,喂模型进行训练。

一、单张图像按指定需求进行分割

思路:首先给定图片的位置picture_path,然后指定要保存的位置picture_save_pathpicture_name为了后续保存分割图像命名方便,就按原名称_数字进行命名,例如原名称a1.TIF,分割之后存放的名称为a1_1_1.jpga1_1_2.jpg以此类推

target_width、target_high、target_channel 设定需要分割的宽高通道数,我这边数据集是彩色的需要512*512像素的数据集,故设置成target_width = 512 target_high = 512 target_channel = 3

然后读取图片picture = cv2.imread(picture_path)
看下图片的宽高通道数信息print(picture.shape),我这里是(4024, 6048, 3) ,这是OpenCV的imread()方法,返回的结果类型为[H,W,C],跟Pytorch还不一样,家人们需要注意下
然后把图片的H、W、C信息给取出来

因为需要一块一块的分割,其实就是一点一点的移动而已
H_number = int(H/target_high) W_number = int(W/target_width)看下能分割几个,H是图片实际的高度,target_high为
需要分割的小块高度,比如我这个原图H是4024,我需要分割成512高度的图像target_high=512,然后H_number = 4024/512 = 7.859375,然后取整H_number=7;同理W也是一样的操作

然后就是循环呗,每行每行进行分割
mask = picture[i*target_width:(i+1)*target_width, j*target_high:(j+1)*target_high, :],这里的picture[W,H,C],使用切片操作就行,宽度从[i*target_width:(i+1)*target_width],其实就是一小块一小块的进行移动而已,同理高度也是 j*target_high:(j+1)*target_high:颜色通道就不动了,多少还是多少;最终mask就是一块所需要的大小图片,然后就是保存

save_picture = picture_save_path + picture_name + "_{}_{}.jpg".format(i+1,j+1),指定要保存的位置路径和命名,最后想保存什么格式把.jpg改一下就行

cv2.imwrite(save_picture,mask),最后保存一下即可

完整代码

import cv2

picture_name = "a1"
picture_path = "E:/sample/a1.TIF"
picture_save_path = "E:/result/"

target_width = 512
target_high = 512
target_channel = 3

picture = cv2.imread(picture_path)
print(picture.shape)# (4024, 6048, 3) [H,W,C]

H = picture.shape[0]
W = picture.shape[1]
C = picture.shape[2]

H_number = int(H/target_high)
W_number = int(W/target_width)
C_number = C
print("H_number is:",H_number)
print("W_number is:",W_number)

for i in range(0, H_number):
    for j in range(0, W_number):
        mask = picture[i*target_width:(i+1)*target_width, j*target_high:(j+1)*target_high, :]
        save_picture = picture_save_path + picture_name + "_{}_{}.jpg".format(i+1,j+1)
        cv2.imwrite(save_picture,mask)

print("okk")

在这里插入图片描述
可分为7*11=77张小图

效果展示

图片位置
在这里插入图片描述

分割位置
在这里插入图片描述

二、批量分割图像

我拍了差不多一百来张照片,然后对这些样本进行批处理分割
首先我先对这些照片进行了重命名,可参考博文:对批量文件重命名

拿到这34个样本
在这里插入图片描述

然后开始对这些图像进行批处理分割
和上面的操作差不多,只不过多了个os读取批量获取文件名称和路径而已

picture_path图像的路径
picture_save_path批处理之后要保存的路径

for filename in os.listdir(picture_path):通过os.listdir(),获得每个照片的名称filename
picture_absolute_path = picture_path + filename路径+名称,得到每张图片的绝对路径picture_absolute_path
picture_name,picture_suffix = os.path.splitext(picture_allname),将照片的名称picture_name和后缀picture_suffix 分离
后续的操作就和处理单张图像一样了

完整代码

import cv2
import os

picture_path = r"E:/sample/"
picture_save_path = "E:/result/"
target_width = 512
target_high = 512
target_channel = 3

for filename in os.listdir(picture_path):
    
    picture_absolute_path = picture_path + filename # E:/sample/14-04-2023-16-37-45.TIF
    picture_allname = os.path.basename(picture_absolute_path) # 14-04-2023-16-37-45.TIF
    picture_name,picture_suffix = os.path.splitext(picture_allname)
    # picture_name   14-04-2023-16-37-45
    # picture_suffix  .TIF
    #print(picture_name) # 14-04-2023-16-37-45
    
    
    picture = cv2.imread(file_path)
    #print(picture.shape)
    H = picture.shape[0]
    W = picture.shape[1]
    C = picture.shape[2]
    H_number = int(H/target_high)
    W_number = int(W/target_width)
    C_number = C
    
    for i in range(0, H_number):
        for j in range(0, W_number):
            mask = picture[i*target_width:(i+1)*target_width, j*target_high:(j+1)*target_high, :]
            save_picture = picture_save_path + picture_name + "_{}_{}.jpg".format(i+1,j+1)
            cv2.imwrite(save_picture,mask)    

    print(filename + "is okk")    

print("finished!!!")     

效果展示

单张图片可分割成7 * 11 = 77
一共34张,故总共可以分为77 * 34 = 2618
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

easyx

普通的画线图什么的 首先我们需要安装一个easyx的图形库&#xff0c;然后把头文件搞出来 #include <stdio.h> #include <easyx.h>//easyx画线啥啥的图形库 #include <graphics.h> #include <math.h> #include <conio.h>//键盘操作的头文件 设…

2023年mathorcupD题航空安全风险分析和飞行技术评估思路分析

2023年mathorcupD题航空安全风险分析和飞行技术评估思路分析 飞行安全是民航运输业赖以生存和发展的基础。随着我国民航业的快 速发展&#xff0c;针对飞行安全问题的研究显得越来越重要。2022 年 3 月 21 日&#xff0c;“3.21” 空难的发生终结了中国民航安全飞行 1 亿零 59…

Android中级——性能优化

性能优化布局优化UI渲染机制避免Overdraw优化布局层级利用<include\>重用Layout使用<ViewStub\>实现View的延迟加载Hierarchy View内存优化获取内存信息ProfilerTraceViewMAT&#xff08;Memory Analyzer Tool&#xff09;dumpsys布局优化 UI渲染机制 画面流畅需…

透过Gartner最新报告,认识“超级边缘”

当下&#xff0c;酝酿能量的超级边缘。最近&#xff0c;我们在谈视频化狂飙、谈AIGC颠覆、谈算力动能不足&#xff0c;很少谈及边缘。但“边缘”恰恰与这一切相关&#xff0c;且越发密不可分&#xff0c;它是未来技术发展的极大影响因子。 “到2025年&#xff0c;超过70%的组织…

Segment Anything Model

论文翻译&#xff1a; 图1&#xff1a;我们旨在通过引入三个相互关联的组件来构建分割的基础模型&#xff1a;即时分割任务、支持数据注释并通过即时工程将零样本传输到一系列任务的分割模型&#xff08;SAM&#xff09;&#xff0c;以及用于收集SA-1B的数据引擎&#xff0c;SA…

MappingGenerator PRO 2023.3 Visual Studio 2019-2022

您的私人编码助手 MappingGenerator 最初是作为 AutoMapper 的设计时替代品创建的。现在它正在演变为编码助手&#xff0c;您可以将最平凡的编码任务委派给它&#xff1a; 生成映射生成显式转换实施克隆生成投影表达式脚手架方法调用脚手架对象创建清理方法调用方便ILogger的使…

探讨Hive是否转为MapReduce程序

目录 前提条件 数据准备 探讨HQL是否转为MapReduce程序执行 1.设置hive.fetch.task.conversionnone 2.设置hive.fetch.task.conversionminimal 3.设置hive.fetch.task.conversionmore 前提条件 Linux环境下安装好Hive&#xff0c;这里测试使用版本为&#xff1a;Hive2.3.…

【结构型模式】适配者模式

文章目录优秀借鉴1、简介2、结构3、实现方式3.1、案例引入3.2、类适配器3.3、对象适配器3.4、接口适配器4、区别对比5、适配者模式优缺点6、应用场景优秀借鉴 黑马程序员Java设计模式详解-适配器模式概述适配器设计模式&#xff08;封装器模式&#xff09;一文彻底弄懂适配器模…

页眉怎么添加【节】,设置不同章节不同页眉

文章目录前言添加【节】&#xff0c;设置不同内容总结前言 大家写文档或者论文的时候可能会需要&#xff1a;不同章节页眉展示不同的内容 然而&#xff0c;在双击页眉进行编辑的时候却发现几个章节的页眉一起被修改了&#xff1a; 会出现文章与页眉不同步的情况&#xff0c…

idea使用Junit

文章目录 idea使用JunitJunit配置常用注解常用于测试的断言方法后续idea使用Junit 对项目使用Junit主要有两个步骤: 添加Junit依赖,即添加Junit jar包使用JunitJunit配置 方法一:idea自带的快捷方法 对要测试的类的方法,在该类中,右键鼠标呼出菜单,选择Generate,快捷…

简单的回顾Linux

linux命令ls会显示出文件的颜色, 系统约定的默认颜色含义如下: 白色&#xff1a;表示普通文件 蓝色&#xff1a;表示目录 绿色&#xff1a;表示可执行文件 红色&#xff1a;表示压缩文件 浅蓝色&#xff1a;链接文件 主要是使用ln命令建立的文件 红色闪烁&#xff1a;表示链接的…

Java实现打印杨辉三角形,向左、右偏的平行四边形这三个图形代码程序

目录 前言 一、打印杨辉三角形 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 二、向左偏的平行四边形 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 三、向右偏的平行四边形 1.1运行流程&#xff08;思想&#xff09; 1.2代…

inplace-operation-error 【已解决】

最近在搞CT医学图像分割模型的领域泛化优化&#xff0c;结果就出现了报错&#xff1a; 关于这个问题stackoverflow上有非常多的讨论&#xff0c;可以过去围观&#xff1a; 指路&#xff1a;中文版stackoverflow - 堆栈内存溢出 (stackoom.com) Stack Overflow - Where Develo…

UNET-RKNN分割眼底血管

前言 最近找到一个比较好玩的Unet分割项目&#xff0c;Unet的出现就是为了在医学上进行分割(比如细胞或者血管)&#xff0c;这里进行眼底血管的分割&#xff0c;用的backbone是VGG16&#xff0c;结构如下如所示(项目里面的图片&#xff0c;借用的&#xff01;借用标记出处&…

C语言函数大全--h开头的函数

C语言函数大全 本篇介绍C语言函数大全–h开头的函数或宏 1. hypot&#xff0c;hypotf&#xff0c;hypotl 1.1 函数说明 函数声明函数功能double hypot(double x, double y);计算直角三角形的斜边长&#xff08;double&#xff09;float hypotf (float x, float y);计算直角…

UPA/URA双极化天线的协方差矩阵结构

文章目录UPA的阵列响应向量&#xff08;暂不考虑双极化天线&#xff09;UPA阵列响应&#xff1a;从单极化天线到双极化天线UPA双极化天线的协方差矩阵结构参考文献UPA的阵列响应向量&#xff08;暂不考虑双极化天线&#xff09; 下图形象描述了UPA阵列的接收信号 UPA阵列的水平…

【springcloud 微服务】Spring Cloud 微服务网关Gateway使用详解

目录 一、微服务网关简介 1.1 网关的作用 1.2 常用网关 1.2.1 传统网关 1.2.2 云原生网关 二、gateway网关介绍 2.1 问题起源 2.2 引发的问题 2.2.1 重复造轮子 2.2.2 调用低效 2.2.3 重构复杂 2.3 gateway改进 三、Spring Cloud Gateway 介绍 3.1 Gateway 概述 …

【JSON学习笔记】3.JSON.parse()及JSON.stringify()

前言 本章介绍JSON.parse()及JSON.stringify()。 JSON.parse() JSON 通常用于与服务端交换数据。 在接收服务器数据时一般是字符串。 我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象。 语法 JSON.parse(text[, reviver])参数说明&#xff1a; text:必需&…

Angular可视化指南 - 用Kendo UI图表组件创建数据可视化

Kendo UI for Angular是专业级的Angular UI组件库&#xff0c;不仅是将其他供应商提供的现有组件封装起来&#xff0c;telerik致力于提供纯粹高性能的Angular UI组件&#xff0c;而无需任何jQuery依赖关系。无论您是使用TypeScript还是JavaScript开发Angular应用程序&#xff0…

【机器学习(二)】线性回归之梯度下降法

文章目录专栏导读1、梯度下降法原理2、梯度下降法原理代码实现3、sklearn内置模块实现专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN Python领域新星创作者&#xff0c;专注于分享python领域知识。 ✍ 本文录入于《数据分析之术》&#xff0c;本专栏精选了经典的机器…