彩色图像(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.mzph.cn/web/42734.shtml

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

相关文章

CompletableFuture工具类使用

CompletableFuture工具类可以帮助实现Java并发编程中的任务编排 以上除了join用于阻塞调用该方法的线程并且接受CompletableFuture的返回值以外其它方法皆有Async异步和Executor指定线程池选项 对于supply,run,apply,accept的区别在于函数式编程的接口类型不同: supply: Sup…

tk 文本生成器

import random import tkinter as tk import ttkbootstrap as ttk from tkinter import messagebox import pyperclipdef wenben_run():def generate_text(original_text, length):# 去掉原始文本中的换行符和空格original_text original_text.replace(\n, )original_text or…

Windows11配置WSL2支持代理上网

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、安装WSL2分发版二、配置步骤三、测试总结 前言 说起来本来这个功能我也不需要的,只是最近突然有个需求就顺便研究了下,WSL2默认的网…

北京大学长安汽车发布毫米波与相机融合模型RCBEVDet:最快能达到每秒28帧

Abstract 三维目标检测是自动驾驶中的关键任务之一。为了在实际应用中降低成本,提出了利用低成本的多视角相机进行3D目标检测,以取代昂贵的LiDAR传感器。然而,仅依靠相机很难实现高精度和鲁棒性的3D目标检测。解决这一问题的有效方法是将多视…

C++入门基础(2)

目录 一、引用: 1、定义: 2、特性: 3、引用的使用: 4、const引用:控制权限 const引用定义: const引用可以接收3种对象: 1、正常对象: 2、临时对象: 3、const对象: 总结&…

C++笔试强训3

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、选择题1-5题6-10题 二、编程题题目一题目二 一、选择题 1-5题 如图所示,如图所示p-3指向的元素是6,printf里面的是%s,从6开…

华为机试HJ108求最小公倍数

华为机试HJ108求最小公倍数 题目: 想法: 要找到输入的两个数的最小公倍数,这个最小公倍数要大于等于其中最大的那个数值,遍历最大的那个数值的倍数,最大的最小公倍数就是输入的两个数值的乘积 input_number_list i…

OpenFWI代码

重点关注文章第4部分 一、代码模块概览 这一部分了解代码主要实现的功能有哪些。 二、运行 这一部分关注如何跑通。 三、数据集 12个数据集(11个2D1个3D) 对计算机而言,上述输入、输出维度大小是按次数定义的。 以“Vel,F…

线程池【开发实践】

文章目录 一、为什么要用线程池1.1 单线程的问题1.2 手动创建多线程的问题1.3 线程池的作用(优点)1.4 线程池的使用场景 二、线程池的基础知识2.1 线程池的核心组件2.2 JUC中的线程池架构2.3 线程池的配置参数2.4 线程池常见的拒绝策略(可自定…

昇思25天学习打卡营第21天|LSTM+CRF序列标注

1. 学习内容复盘 概述 序列标注指给定输入序列,给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取,包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。以命名…

汇川伺服 (4)FFT、机械特性、闭环、惯量、刚性、抑制振动

一、参数解释 二、FFT 三、机械特性分析 四、多级配方与对象字典 对机组网配方 对象字典 五、InoServoShop 主要是用于调试620P620N将压缩报解压后不需要安装就可以直接使用 六、InoDriveWorkShop 主要是调试660 670 810 520 等系列 惯量识别 Etune Stune 惯量比调试 大惯…

Error:sql: expected 1 arguments, got 2

一 背景 在测试一个API接口时,看到日志里面突然抛出一个错误:Error:sql: expected 1 arguments, got 2 看了下,对应的表里面是有相关数据的,sql语句放在mysql里面执行也是没问题!那奇了怪了,为啥会产生这样…

git只列出本地分支

git只列出本地分支 git branch --list git强制删除本地分支 git branch -D_error: the branch dlx-test is not fully merged. -CSDN博客文章浏览阅读648次。git branch -d 可以通过: git branch 查看所有本地分支及其名字,然后删除特定分支。git删除远程remote分支…

算法之工程化内容(2)—— Git常用命令

目录 1. git初始化配置 2. 新建仓库 3. 工作区——>暂存区——>本地仓库 4. git reset回退版本 5. 查看差异 git diff 6. 删除文件git rm 7. .gitignore 8. vscode操作git 9. git分支、合并和删除 10. 解决合并冲突 11. 回退和rebase 12. 添加远程仓库 参考链接&#xff…

Linux 网络--TCP协议收包流程(NAPI机制)

Linux 网络--TCP协议收包流程(NAPI机制) 平台环境简介:宿主机: ubuntu18.04Linux内核源码版本: Linux-4.15网卡驱动: Intel e1000 (ubuntu 虚拟机默认网卡驱动)协议:TCP协议,本文分析收包过程 本…

【线程状态-2】

1、线程礼让 (1)礼让线程,让当前正在执行的线程暂停,但不阻塞 (2)将线程从运行状态转为就绪状态 (3)让cpu重新调度,礼让不一定成功!看cpu心情 package st…

单对以太网:工业4.0时代的通信革命

单对以太网连接器概述 单对以太网(Single Pair Ethernet,简称SPE)是一种新兴的以太网技术,它通过一对双绞线实现数据传输,支持PoDL(Power over Data Line)技术,为终端设备提供电力供…

windows JDK11 与JDK1.8自动切换,以及切换后失效的问题

1.windows安装不同环境的jdk 2.切换jdk 3.切换失败 原因:这是因为当我们安装并配置好JDK11之后它会自动生成一个环境变量(此变量我们看不到),此环境变量优先级较高,导致我们在切换回JDK8后系统会先读取到JDK11生成的…

Java项目:基于SSM框架实现的中小型企业财务管理系统【ssm+B/S架构+源码+数据库+答辩PPT+开题报告+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的中小型企业财务管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单…

Spark实现电商消费者画像案例

作者/朱季谦 故事得从这一张图开始说起—— 可怜的打工人准备下班时,突然收到领导发来的一份电商消费者样本数据,数据内容是这样的—— 消费者姓名|年龄|性别|薪资|消费偏好|消费领域&#x…