彩色图像(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,一经查实,立即删除!

相关文章

homebrew常用命令

Homebrew 提供了许多命令和选项来管理软件包。以下是一些常用的 Homebrew 命令&#xff1a; ### 常用 Homebrew 命令 1. **安装软件包**&#xff1a; brew install <软件包名称> 2. **卸载软件包**&#xff1a; brew uninstall <软件包名称> 3. **更…

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…

LLM生成的CUDA CUPTI Metrics for Capability 7.0解释

LLM生成的CUDA CUPTI Metrics for Capability 7.0解释 1.原文 2.6.1.3. Metrics for Capability 7.0 2.system_prompt 你是一位GPU专家,请详细解释用户输入GPU Metric的功能以及如何结合这个指标来优化Kernel的性能,要求专业术语用英文,其它用中文3.输出 achieved_occupanc…

提升网络包容性:探索Webkit的访问性特性

在数字化时代&#xff0c;网络的无障碍访问性&#xff08;Accessibility&#xff09;对于确保每个人都能平等地访问和使用网络内容至关重要。Webkit&#xff0c;作为多个流行浏览器的核心渲染引擎&#xff0c;提供了一系列的访问性特性&#xff0c;以支持残障用户更好地浏览网页…

Windows11配置WSL2支持代理上网

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

大模型/NLP/算法面试题总结1——大语言模型有哪些//泛化能力

1、了解哪些大语言模型&#xff1f; 1. GPT系列 GPT-3&#xff1a;由OpenAI开发&#xff0c;具有1750亿个参数&#xff0c;是迄今为止最强大的自然语言处理模型之一。GPT-3能够生成连贯的文本&#xff0c;涵盖多种文体&#xff0c;如诗歌、小说、新闻报道、代码等。然而&#…

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

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

C++入门基础(2)

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

C++笔试强训3

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

Java爬虫翻页

编写一个Java爬虫以进行翻页通常涉及到使用HTTP客户端&#xff08;如Apache HttpClient或OkHttp&#xff09;来发送请求&#xff0c;解析HTML页面&#xff08;如使用Jsoup库&#xff09;&#xff0c;以及处理分页逻辑&#xff08;如通过URL参数或页面内的链接进行翻页&#xff…

华为机试HJ108求最小公倍数

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

C++休眠的方法

Windows的API函数 Sleep(INFINITE); 休眠时间为永久 Linux的API函数sleep 没有直接表示无限时间的参数&#xff0c;根据POSIX标准&#xff0c;sleep() 函数的参数应该是 unsigned int 类型&#xff0c;因此最大可以接受的参数值是 UINT_MAX&#xff0c;即 4294967295 秒。sleep…

OpenFWI代码

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

线程池【开发实践】

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

appium 实战问题 播放视频时无法定位到元素

背景 在做UI自动化时&#xff0c;有播放详情页的用例&#xff0c;但是发现视频在播放的时候无法定位到元素或者很慢&#xff0c;了解到appium在动态的页面实时获取布局元素导致定位变慢。所以只能将视频暂停在操作元素&#xff0c;点击到暂停按钮又是个问题&#xff0c;通过ad…

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

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

Spring Boot项目中JPA操作视图会改变原表吗?

一直有一种认识就是:使用JPA对视图操作,不会影响到原表。 直观的原因就是视图是一种数据库中的虚拟表,它由一个或多个表中的数据通过SQL查询组成。视图不包含数据本身,而是保存了一条SQL查询,这条查询是用来展示数据的。 但是在实际项目种的一个场景颠覆和纠正了这个认识…

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

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

Error:sql: expected 1 arguments, got 2

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