彩色图像(RGB)或灰度图像(Gray)转tensor数据(附img2tensor代码)

在这里插入图片描述

💪 专业从事且热爱图像处理,图像处理专栏更新如下👇:
📝《图像去噪》
📝《超分辨率重建》
📝《语义分割》
📝《风格迁移》
📝《目标检测》
📝《暗光增强》
📝《模型优化》
📝《模型实战部署》


在这里插入图片描述

目录

  • 一、报错:IndexError: tuple index out of range
    • 1.1 问题分析
  • 二、三通道或单通道图像转tensor
    • 2.1 代码
    • 2.2 输出
  • 三、总结

一、报错:IndexError: tuple index out of range

在处理灰度图像转tensor数据时,我遇到了下面问题:

在这里插入图片描述

1.1 问题分析

报错 IndexError: tuple index out of range 通常是由于试图访问数组不存在的索引引起的。我输入的灰度图像没有第三维度(通道数),导致在访问 img.shape[2] 时出现索引错误。第三维度为通道数,在传入img2tensor时,灰度图像的形状得和彩色图像的形状一致,即高,宽,通道数(h,w,c)。对于灰度图像,通道数为1;对于彩色图像,通道数通常为3(RGB或BGR)。

我使用img2tensor函数调用的是basicsr库里的,下面是basicsr库里原始定义的img2tensor函数代码:

from basicsr.utils import img2tensor, tensor2img
def img2tensor(imgs, bgr2rgb=True, float32=True):"""Numpy array to tensor.Args:imgs (list[ndarray] | ndarray): Input images.bgr2rgb (bool): Whether to change bgr to rgb.float32 (bool): Whether to change to float32.Returns:list[tensor] | tensor: Tensor images. If returned results only haveone element, just return tensor."""def _totensor(img, bgr2rgb, float32):if img.shape[2] == 3 and bgr2rgb:if img.dtype == 'float64':img = img.astype('float32')img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)img = torch.from_numpy(img.transpose(2, 0, 1))if float32:img = img.float()return imgif isinstance(imgs, list):return [_totensor(img, bgr2rgb, float32) for img in imgs]else:return _totensor(imgs, bgr2rgb, float32)

从上面代码可以看出,仅针对彩色图像处理,没有考虑当通道灰度图像,下面我进行了改进,可以处理彩色图像也可以灰度图像。

二、三通道或单通道图像转tensor

在上面代码基础上,我新增了代码用于判断输入的数据是否为单通道图像,如果是单通道图像则增加一个维度。

2.1 代码

import numpy as np
import torchdef _totensor(imgs, bgr2rgb=True, float32=True):               # 辅助函数,用于将单个图像或图像列表从numpy数组转换为PyTorch张量。def _convert(img):if img.ndim == 2:                                      # 如果图像是二维的(即灰度图像,只有高度和宽度两个维度),那么它会在第三个维度(通道维度)上添加一个额外的维度。img = np.expand_dims(img, axis=2)                  # 在指定的轴上为输入数组引入新的维度if bgr2rgb and img.shape[2] == 3:                      # 如果图像是彩色的(即第三个维度为3),并且bgr2rgb参数为True,则会将图像从BGR格式转换为RGB格式img = img[..., [2, 1, 0]]img = torch.from_numpy(np.ascontiguousarray(img))if float32:img = img.float()                                  # 根据float32参数的值,将图像转换为float或byte类型的张量else:img = img.byte()return img.permute(2, 0, 1).contiguous()               # 将通道维度移到前面if isinstance(imgs, list):return [_convert(img) for img in imgs]else:return _convert(imgs)def img2tensor(imgs, bgr2rgb=True, float32=True):                  # 主函数,用于将单个图像或图像列表从numpy数组转换为PyTorch张量if isinstance(imgs, np.ndarray):                               # 如果输入是numpy数组if imgs.ndim == 2:                                         # 检查图像是否是灰度图,如果是,则会在第三个维度上添加一个额外的维度imgs = np.expand_dims(imgs, axis=2)return _totensor(imgs, bgr2rgb, float32)                   # 调用_totensor函数进行实际的转换elif isinstance(imgs, list):                                   # 输入是图像列表,它会遍历列表中的每个图像,并对每个图像执行相同的操作for i in range(len(imgs)):if imgs[i].ndim == 2:imgs[i] = np.expand_dims(imgs[i], axis=2)return _totensor(imgs, bgr2rgb, float32)else:raise TypeError("Input should be a numpy array or list of numpy arrays")# 示例调用
img_gt = np.random.rand(256, 256)  # 灰度图像
print(f"Shape of img_gt: {img_gt.shape}")
img_gt_tensor = img2tensor(img_gt)
print(f"Shape of img_gt_tensor: {img_gt_tensor.shape}")             # 由于原始图像是灰度图,所以转换后的张量的形状应为(1, 256, 256)
print("img_gt_tensor:",img_gt_tensor)

2.2 输出

在这里插入图片描述

三、总结

以上就是彩色图像(RGB)或灰度图像(Gray)转tensor数据的详细过程及代码,希望能帮到你。

感谢您阅读到最后!😊总结不易,多多支持呀🌹 点赞👍收藏⭐评论✍️,您的三连是我持续更新的动力💖

关注公众号「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Android应用】生成证书和打包

安卓生成证书和打包 📖1. 生成自有证书📖2. 安卓打包✅步骤一:导入签名文件✅步骤二:设置打包版本✅步骤三:生成签名包或APK 📖1. 生成自有证书 地址:https://www.yunedit.com/createcert 说明…

【wordpress教程】wordpress博客网站添加非法关键词拦截

有的网站经常被恶意搜索,站长们不胜其烦。那我们如何屏蔽恶意搜索关键词呢?下面就随小编一起来解决这个问题吧。 后台设置预览图: 设置教程: 1、把以下代码添加至当前主题的 functions.php 文件中: add_action(admi…

最全windows提权总结(建议收藏)

当以低权用户进去一个陌生的windows机器后,无论是提权还是后续做什么,第一步肯定要尽可能的搜集信息。知己知彼,才百战不殆。 常规信息搜集 systeminfo 查询系统信息hostname 主机名net user 查看用户信息netstat -ano|find "3389&quo…

SECS/GEM快速完成半导体设备通讯

金南瓜帮助国内大量从事半导体前道设备开发研制、生产的设备厂商,通过快速提供稳定可靠的SECS/GEM、GEM300产品,为客户在激光退火、湿法设备(清洗、镀膜等)、离子注入、MOCVD、PVD等客户专注于核心工艺提升,提升企业的…

自动群发消息插件常用源代码科普!

随着网络技术的快速发展,自动群发消息插件成为了众多企业和个人提高效率、加强沟通的重要工具。 然而,开发一个高效且稳定的自动群发消息插件并非易事,需要深入理解并熟练掌握相关的源代码。 本文将从五个方面,通过具体的源代码…

基于SpringBoot的网上书城管理系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:Java技术,基于SpringBoot框架 工具:Eclipse,MySQL 系统展示 首…

Ubuntu20.04配置TurtleBot3 Waffle Pi远程控制

这里写目录标题 0. 机器人配置1. Ubuntu20.04配置TurtleBot3 Waffle Pi远程控制1.1 TurtleBot3 Waffle Pi端配置1.2 PC端配置1.2.1 安装turtlebot3的环境配置1.2.2 创建项目并安装Turtlebot31.2.3 配置环境变量 1.3 PC端与TurtleBot3进行通信1.3.1 PC端与机器人端互PING和SSH连…

每日一练 - RSTP响应端口故障后的处理流程

01 真题题目 在如图所示的网络中, 所有的交换机运行 RSTP 协议, 假如 SWB 的 E 1 接口故障后, RSTP 的处理过程是:(多选) A.SWB 删除 MAC 地址表中以 E 1 为目的端口的端口表项。 B.重新计算生成树,选举 E2 为新的根…

ghost恢复?电脑文件恢复如何操作?电脑数据恢复工具!5款!

在数字化时代,电脑数据的价值日益凸显。然而,数据丢失、误删、系统崩溃等问题时有发生,给个人和企业带来巨大损失。本文将为您详细介绍Ghost恢复方法,同时推荐五款高效的电脑数据恢复工具,助您轻松应对数据丢失的困扰。…

Mysql-常用函数及其用法总结

1、字符串函数 测试用例如下: 1.1 CONCAT() 将多个字符串连接成一个字符串。 SELECT CONCAT(first_name, , last_name) AS full_name FROM users; -- 期望结果:John Doe, Jane Smith, Michael Johnson 1.2 SUBSTRING() 提取子字符串 SELECT SUBSTR…

57、基于概率神经网络(PNN)的分类(matlab)

1、基于概率神经网络(PNN)的分类简介 PNN(Probabilistic Neural Network,概率神经网络)是一种基于概率论的神经网络模型,主要用于解决分类问题。PNN最早由马科夫斯基和马西金在1993年提出,是一种非常有效的分类算法。…

C语言编译报错error: expected specifier-qualifier-list before

C语言编译报错 error: storage class specified for parameter error: expected specifier-qualifier-list before 原因: 报错信息 "expected specifier-qualifier-list" 通常表示编译器期望在某个地方出现类型指定列表,但却没有找到。这通常…

STM32智能仓库管理系统教程

目录 引言环境准备智能仓库管理系统基础代码实现:实现智能仓库管理系统 4.1 数据采集模块 4.2 数据处理与控制算法 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:仓库管理与优化问题解决方案与优化收尾与总结 1. 引言 智能仓库管理系统通…

【matlab】周期性信号分析

目录 信号预处理 周期性特征提取方法 频谱分析 傅里叶变换 快速傅里叶变换(FFT) 周期图法 Welch法 自相关分析 时频分析 基于模型的方法 时间序列分解 应用实例 提取信号的周期性特征是一个在信号处理领域广泛应用的技术,特别是在…

源码解读 - 微软GraphRAG框架

1. 引言 这几天微软开源了一个新的基于知识图谱构建的检索增强生成(RAG)系统, GraphRAG, 该框架旨在利用大型语言模型(LLMs)从非结构化文本中提取结构化数据, 构建具有标签的知识图谱,以支持数据集问题生成、摘要问答…

鸿翼FEX文件安全交换系统,打造安全高效的文件摆渡“绿色通道”

随着数字经济时代的到来,数据已成为最有价值的生产要素,是企业的重要资产之一。随着数据流动性的增强,数据安全问题也随之突显。尤其是政务、金融、医疗和制造业等关键领域组织和中大型企业,面临着如何在保障数据安全的同时&#…

【删库跑路】一次删除pip下载的所有第三方库方法

进入命令行,先list看下库存 pip list导出所有的第三方库至一文件列表 pip freeze >requirements.txt按照列表卸载所有库 pip uninstall -r requirements.txt -y再list看下,可见库存已清空

世优科技获新锐商业价值奖,数字人阿央入选北京市元宇宙“名人”

2024全球经济大会元宇宙创新发展论坛暨2024第九届“创客中国”元宇宙中小企业创新创业大赛,由工业和信息化部网络安全产业发展中心、北京市经济和信息化局、石景山区人民政府、首钢集团有限公司主办,围绕元宇宙底层技术端和产业应用端两个方向&#xff0…

Zynq系列FPGA实现SDI视频编解码+UDP以太网传输,基于GTX高速接口,提供3套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的以太网方案本博已有的FPGA图像缩放方案1G/2.5G Ethernet PCS/PMA or SGMII架构以太网通信方案AXI 1G/2.5G Ethernet Subsystem架构以太网通信方案本方案的缩放应用本方案在Xilinx--Kintex系列…

【高阶数据结构】跳表

文章目录 跳表 skiplist跳表的结构特点 跳表的具体实现 跳表 skiplist 跳表本质也是一个用于快速查找的概率型数据结构,通过在有序链表上增加多级索引来实现。有了这些索引,快表查询的效率接近于二分,在一些场景上可以代替平衡二叉树如AVL树…