深度学习_13_YOLO_图片切片及维度复原

需求:

在对获取的图片进行识别的时候,如果想减少不必要因素的干扰,将图片切割只对有更多特征信息的部分带入模型识别,而剩余有较多干扰因素的部分舍弃,这就是图片切割的目的,但是又由于模型对图片的维度有较高的要求,切割后的图片在维度上已经不满足模型所需要的维度,而将被切割图片的维度恢复,进而能带入模型识别,是本次重点

对于图片处理有两种手段:

1、填充式还原

即保留的图片部分不变,剩余的被切割部分用白色填充 (当然也可以用其他的颜色填充)

函数代码:

def picture_Fill(img, boundary): # 填充函数
    # 创建与原始图像相同大小的全白图像
    white_frame = np.ones_like(img) * 255  # 255 白色,床创建全白图片
    white_frame[0:boundary, :] = img[0:boundary, :] # 水平方向全部取出,垂直方向取0~boundary
    return white_frame

即创建一个与原图片一样大小的白色图片,将需要被保留的部分填入白色图片中

2、扩大还原式

对切割后的图片进行放大,恢复到原来的维度值

函数代码:

def picture_BrowUp(img, boundary):
    img_copy = img.copy() # 备份
    img = img[0:boundary, :] # 截取
    img = cv2.resize(img, (img_copy.shape[1], img_copy.shape[0]), interpolation=cv2.INTER_LINEAR) # 放大
    return img

获取原本图片的所有维度大小,在扩大的过程中指定扩大的大小值

测试:

切割目标:

在这里插入图片描述

1、填充式测试
代码:

import matplotlib.pyplot as plt
import cv2
import numpy as np

def picture_BrowUp(img, boundary):
    img_copy = img.copy() # 备份
    img = img[0:boundary, :] # 截取
    img = cv2.resize(img, (img_copy.shape[1], img_copy.shape[0]), interpolation=cv2.INTER_LINEAR) # 放大
    return img

def picture_Fill(img, boundary): # 填充函数
    # 创建与原始图像相同大小的全白图像
    white_frame = np.ones_like(img) * 255  # 255 白色,床创建全白图片
    white_frame[0:boundary, :] = img[0:boundary, :] # 水平方向全部取出,垂直方向取0~boundary
    return white_frame

# 读取原始图像
frame = cv2.imread('C:\\Users\\86153\\Pictures\\Camera Roll\\1.png')  # 请将 'your_image_path.jpg' 替换为你的图像路径

frame = picture_Fill(frame, 300) # 填充函数


plt.imshow(frame)
plt.axis('off')  # 关闭坐标轴
plt.show()

效果:

在这里插入图片描述
2、扩大式测试

代码:

import matplotlib.pyplot as plt
import cv2
import numpy as np

def picture_BrowUp(img, boundary):
    img_copy = img.copy() # 备份
    img = img[0:boundary, :] # 截取
    img = cv2.resize(img, (img_copy.shape[1], img_copy.shape[0]), interpolation=cv2.INTER_LINEAR) # 放大
    return img

def picture_Fill(img, boundary): # 填充函数
    # 创建与原始图像相同大小的全白图像
    white_frame = np.ones_like(img) * 255  # 255 白色,床创建全白图片
    white_frame[0:boundary, :] = img[0:boundary, :] # 水平方向全部取出,垂直方向取0~boundary
    return white_frame

# 读取原始图像
frame = cv2.imread('C:\\Users\\86153\\Pictures\\Camera Roll\\1.png')  # 请将 'your_image_path.jpg' 替换为你的图像路径

frame = picture_BrowUp(frame, 300) # 填充函数


plt.imshow(frame)
plt.axis('off')  # 关闭坐标轴
plt.show()

效果:

在这里插入图片描述
实践效果评价:

从机器识别上述处理过的图片来看,填充式的效果更加好,其原因在于将不必要的部分用白色代替,减少了不必要的干扰,而扩大式的识别较差,可能是图片的放大损坏了图片的空间结构,也不难排除扩大操作耗费的时间较多导致识别过慢,当然也和所用的识别图片模型的不同有关。

补充:

OpenCV(cv2库)是一个开源计算机视觉库,它提供了许多用于图像处理、计算机视觉和机器学习的功能。这个库被广泛应用于各种各样的领域,包括图像处理、视频分析、对象识别、人脸识别、机器视觉等领域。

它提供了丰富的函数和工具,用于加载、保存、处理图像和视频。OpenCV
能够执行图像的基本操作(如裁剪、调整大小、旋转等),还能进行更高级的图像处理(如图像滤波、边缘检测、特征提取等)。此外,它还提供了许多机器学习算法的实现,用于对象检测、人脸识别、姿态估计等任务。

这个库支持多种编程语言,包括 C++、Python、Java 等,让开发者能够在不同的平台上使用相同的功能。OpenCV
在计算机视觉和图像处理领域是一个非常强大和受欢迎的工具。

图片的维度和pytorch的维度排布有所差别例如图片的shape为(500, 720, 3)那么其高度、宽度、通道数分别为500、720、3而对将图片转化成pytorch张量之后就变成了(3, 500, 720)即通道数,高度宽度

转换代码如下:

# 转换为 PyTorch Tensor,并调整维度
image_tensor = torch.from_numpy(np.transpose(image, (2, 0, 1)))  # 调整维度为 (通道数, 高度, 宽度)

至于为什么要把图片转换为 pytorch (张量),因为一般训练出来的模型都是用张量数据的图片训练出来的,直接用图片的话,维度不一样,会报错

而且张量的优势在于其能添加一个批量大小维度,这样能一次性识别多个图片,这一样问题就转化成上节的多类分类问题

添加维度代码:

# 如果你有多张图片,可以添加批量维度
# image_tensor = image_tensor.unsqueeze(0)  # 添加批量维度,变成 (1, 3, 500, 720) 形状的 Tensor

一般模型都是有批量维度,也就是说有四维,如果仅仅用三维图片张量是无法带入模型识别的,所以必须添加批量维度

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

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

相关文章

使用boost库

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、boost实例代码二、vs配置boost库 1.linux环境2.windows环境 2.1.源码编译2.2vs配置3.3程序运行3.4将程序编译成静态库 3.4.1静态库和动态库知识点3.4.2编写…

单相过压继电器DVR-G-100-1 0~500V AC/DC220V 导轨安装

系列型号 DVR-G-100-1X3数字式过压继电器; DVR-G-100-3三相过压继电器; DVR(H)-G-100-1单相过压继电器; DVR-Q-100-3三相欠压继电器; DVR(H)-Q-100-3三相欠压继电器 一、用途 主要应用于电机、变压器等主设备以及输配电系统的继…

excel在函数中插入函数

例如,要计算RAND()1的值,其中RAND()表示取0~1之间的随机数。 插入-》函数: 选SUM函数: 点击“继续”: 将光标先放在数字1中的输入框中,然后在左边过滤出RAND函数,并且点击继续&#xff1…

jQuery Ajax前后端数据交互

ajax是用来做前后端交互的,前端使用ajax去去发送一个请求,后端给其响应拿到数据,前端做些展示。 浏览器访问网站一个页面时, Web 服务器处理完后会以消息体方式返回浏览器,浏览器自动解析 HTML 内容。如果局部有新数…

Python环境搭建与配置指南

Python 是一门优雅且健壮的面向对象解释型计算机程序编程语言,具有面向对象、可升级、可扩展、可移植、 语法简洁清晰易学、易读写、易维护、健壮性、通用性、跨平台等特点。目前广泛应用于人工智能、机器学习、 科学计算、大数据分析、图像处理、爬虫、区块链、自动…

【Android 】android13 新权限获取 读写文件权限

android13 新权限获取 参考:Android 13(API 33)读写SD卡权限的调整适配 - Mr,Han - 博客园 android在 获取文件读写权限(尤其是音视频、图片等等资源)的权限获取逻辑更换了。 必须申请如下权限: public static final String READ…

景联文科技入选量子位智库《中国AIGC数据标注产业全景报告》数据标注行业代表机构TOP20

量子位智库《中国AIGC数据标注产业全景报告》中指出,数据标注处于重新洗牌时期,更高质量、专业化的数据标注成为刚需。未来五年,国内AI基础数据服务将达到百亿规模,年复合增长率在27%左右。 基于数据基础设施建设、大模型/AI技术理…

asp.net考研加油站系统VS开发sqlserver数据库web结构c#编程web网页设计

一、源码特点 asp.net 考研加油站系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语言 开发。 asp.net考研加油站系统 应用技术…

threejs太阳系(源码加相关素材)

目录 前言 效果预览图 完整代码 html部分 js部分 模块aa 前言 Three.js 是一款基于原生 WebGL 封装通用 Web 3D 引擎,在小游戏、产品展示、物联网、数字孪生、智慧城市园区、机械、建筑、全景看房、GIS 等各个领域基本上都有 three.js 的身影。本篇文章简单的使…

Vue 简单的语法

1.插值表达式 1.插值表达式的作用是什么? 利用表达式进行插值,将数据渲染到页面中; 2.语法结构? {{表达式}} 3.插值表达式的注意点是什么? (1)使用的数据要存在,在data中&…

贪吃蛇小游戏代码

框架区 package 结果;import java.awt.Color; import java.awt.EventQueue; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.util.ArrayList; import java.util.List; import java.util.Random;import javax.s…

每日一题----昂贵的婚礼

#include <iostream> #include <algorithm> #include <cstring> #include <queue> #include <vector> using namespace std; //本题酋长的允诺也算一个物品,最后一定要交给酋长&#xff0c;那么等级不能超过酋长的等级范围const int N 150 * 15…

高效使用 PyMongo 进行 MongoDB 查询和插入操作

插入到集合中&#xff1a; 要将记录&#xff08;在MongoDB中称为文档&#xff09;插入到集合中&#xff0c;使用insert_one()方法。insert_one()方法的第一个参数是一个包含文档中每个字段的名称和值的字典。 import pymongomyclient pymongo.MongoClient("mongodb://l…

使用pixy计算群体遗传学统计量

1 数据过滤 过滤参数&#xff1a;过滤掉次等位基因频率&#xff08;minor allele frequency&#xff0c;MAF&#xff09;低于0.05、哈达-温伯格平衡&#xff08;Hardy– Weinberg equilibrium&#xff0c;HWE&#xff09;对应的P值低于1e-10或杂合率&#xff08;heterozygosit…

两万字图文详解!InnoDB锁专题!

前言 本文将跟大家聊聊 InnoDB 的锁。本文比较长&#xff0c;包括一条 SQL 是如何加锁的&#xff0c;一些加锁规则、如何分析和解决死锁问题等内容&#xff0c;建议耐心读完&#xff0c;肯定对大家有帮助的。 为什么需要加锁呢&#xff1f; InnoDB 的七种锁介绍 一条 SQL 是…

2023.11.16-hive sql高阶函数lateral view,与行转列,列转行

目录 0.lateral view简介 1.行转列 需求1: 需求2: 2.列转行 解题思路: 0.lateral view简介 hive函数 lateral view 主要功能是将原本汇总在一条&#xff08;行&#xff09;的数据拆分成多条&#xff08;行&#xff09;成虚拟表&#xff0c;再与原表进行笛卡尔积&#xff0c…

那些让我苦笑不得的 Bug:编码之路的坎坷经历

文章目录 1. CSS 中的样式“消失”问题2. JavaScript 的变量命名引发的混乱3. 时间格式的困扰4. 数据库查询条件引发的错误结语 &#x1f389;欢迎来到Java学习路线专栏~那些让我苦笑不得的 Bug&#xff1a;编码之路的坎坷经历 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨…

了解一下知识付费系统的开发流程和关键技术点

知识付费系统的开发既涉及到前端用户体验&#xff0c;又需要强大的后端支持和复杂的付费逻辑。在这篇文章中&#xff0c;我们将深入探讨知识付费系统的开发流程和关键技术点&#xff0c;并提供一些相关的技术代码示例。 1. 需求分析和规划&#xff1a; 在着手开发知识付费系…

小学生加减乘除闯关运算练习流量主微信小程序开发

小学生加减乘除闯关运算练习流量主微信小程序开发 经过本次更新&#xff0c;我们增加了新的功能和特性&#xff0c;以提升用户体验和运算练习的趣味性&#xff1a; 能量石与激励视频&#xff1a;用户可以通过观看激励视频来获取能量石&#xff0c;这些能量石可以用于解锁收费…