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

news2024/9/22 5:37:16

在这里插入图片描述

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


在这里插入图片描述

目录

  • 一、报错: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 have
            one 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 img

    if 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 torch

def _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.coloradmin.cn/o/1911246.html

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

相关文章

【fscan】Windows环境下的fscan安装与使用指南

Fscan是一款专为网络安全专业人士设计的多功能扫描工具,它能够帮助用户在Windows环境中执行高效的网络扫描任务。以下是关于Fscan的详细使用指南: 获取Fscan 要开始使用Fscan,首先需要从其GitHub仓库下载最新版本的预编译二进制可执行文件。…

AI数字人直播系统搭建开发

目录 前言: 一、数字人直播系统 在技术层面: 二、商业层面: 三、用户体验层面: 总结: 前言: 直播渠道是目前比较热门的售货方式,数字人直播作为一种新兴的直播形式,具有其独特…

提升爬虫OCR识别率:解决嘈杂验证码问题

引言 在数据抓取和网络爬虫技术中,验证码是常见的防爬措施,特别是嘈杂文本验证码。处理嘈杂验证码是一个复杂的问题,因为这些验证码故意设计成难以自动识别。本文将介绍如何使用OCR技术提高爬虫识别嘈杂验证码的准确率,并结合实际…

【线程同步-2】

同步方法及同步块 接上期三大不安全案例,本期将介绍同步方法和同步块,以期达到安全的目的。 车站买票:加入了synchronized 同步方法 package syn; ​ //不安全的买票 //线程不安全,有负数 public class UnsafeBuyTicket {publi…

【线程同步-1】

三大不安全案例 1、车站买票 package syn; ​ //不安全的买票 //线程不安全,有负数 public class UnsafeBuyTicket {public static void main(String[] args) {BuyTicket buyTicket new BuyTicket();new Thread(buyTicket,"xiaoming").start();new Thr…

一些关于C++的基础知识

引言&#xff1a;C兼容C的大部分内容&#xff0c;但其中仍有许多小细节的东西需要大家注意 一.C的第一个程序 #include <iostream> using namespace std;int main() {cout << "hello world!" << endl;return 0; } 第一次看这个是否感觉一头雾水…

如何用Vue3和Plotly.js创建交互式平行坐标图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue.js 中使用 Plotly.js 创建平行坐标图 应用场景介绍 平行坐标图是一种可视化高维数据集的强大技术。它可以帮助我们探索不同维度之间的关系&#xff0c;并识别模式和异常值。在 Vue.js 应用程序中&#xf…

Scissor算法-从含有表型的bulkRNA数据中提取信息进而鉴别单细胞亚群

在做基础实验的时候&#xff0c;研究者都希望能够改变各种条件来进行对比分析&#xff0c;从而探索自己所感兴趣的方向。 在做数据分析的时候也是一样的&#xff0c;我们希望有一个数据集能够附加了很多临床信息/表型&#xff0c;然后二次分析者们就可以进一步挖掘。 然而现实…

yolov8 人体姿态识别

引言 在计算机视觉的各种应用中&#xff0c;人体姿态检测是一项极具挑战性的任务&#xff0c;它能够帮助我们理解人体各部位的空间位置。本文将详细介绍如何使用 YOLOv8 和 Python 实现一个人体姿态检测系统&#xff0c;涵盖模型加载、图像预处理、姿态预测到结果可视化的全流…

探索 Qt 的 `QSqlDatabase`:数据库访问的桥梁

&#x1f60e; 作者介绍&#xff1a;欢迎来到我的主页&#x1f448;&#xff0c;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff08;领取大厂面经等资料&#xff09;&#xff0c;欢迎加我的…

快速将一个网址打包成一个exe可执行文件

一、电脑需要node环境 如果没有下面有安装教程&#xff1a; node.js安装及环境配置超详细教程【Windows系统安装包方式】 https://blog.csdn.net/weixin_44893902/article/details/121788104 我的版本是v16.13.1 二、安装nativefier 这是一个GitHub上的开源项目&#xff1a…

自动驾驶算法———车道检测(一)

“ 在本章中&#xff0c;我将指导您构建一个简单但有效的车道检测管道&#xff0c;并将其应用于Carla 模拟器中捕获的图像。管道将图像作为输入&#xff0c;并产生车道边界的数学模型作为输出。图像由行车记录仪&#xff08;固定在车辆挡风玻璃后面的摄像头&#xff09;捕获。…

前端JS特效第26波:jQuery日期时间选择器插件

jQuery日期时间选择器插件&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html> <html> <head lang"zh-CN"> <meta charset"UTF-8"> <title>jQuery日期时间选择器插件 - PHP中文网</t…

学生管理系统 | python

1. 题目描述 ****************************** 欢迎使用学生管理系统 ****************************** 1. 添加学生 2. 查看学生列表 3. 查看学生信息 4. 删除学生 5. 退出系统 1 请输入学生姓名: zhangsan 请输入学生学号: 10010 请输入学生班级: 3 请输入学生成…

PolarisMesh源码系列——服务如何注册

前话 PolarisMesh&#xff08;北极星&#xff09;是腾讯开源的服务治理平台&#xff0c;致力于解决分布式和微服务架构中的服务管理、流量管理、配置管理、故障容错和可观测性问题&#xff0c;针对不同的技术栈和环境提供服务治理的标准方案和最佳实践。 PolarisMesh 官网&am…

前端面试题34(在移动应用中,通用的实时传输协议)

在移动应用中&#xff0c;选择实时传输协议时通常会考虑几个关键因素&#xff1a;网络效率、功耗、实时性、跨平台兼容性以及数据类型&#xff08;如文本、图像、视频&#xff09;。以下是几种常用的实时传输协议及其在移动应用中的适用性&#xff1a; 1. WebSocket WebSocke…

WIN32核心编程 - 动态链接库

公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 动态链接库 创建动态链接库 相关函数 遍历模块 导出未文档化 动态链接库 动态链接库&#xff08;DLL&#xff09; 动态链接库&#xff08;Dynamic-Link Library&#xff0c;简称DLL&#x…

SpringBoot:SpringBoot中如何实现对Http接口进行监控

一、前言 Spring Boot Actuator是Spring Boot提供的一个模块&#xff0c;用于监控和管理Spring Boot应用程序的运行时信息。它提供了一组监控端点&#xff08;endpoints&#xff09;&#xff0c;用于获取应用程序的健康状态、性能指标、配置信息等&#xff0c;并支持通过 HTTP …

JWT(Json Web Token)在.NET Core中的使用

登录成功时生成JWT字符串目录 JWT是什么&#xff1f; JWT的优点&#xff1a; JWT在.NET Core 中的使用 JWT是什么&#xff1f; JWT把登录信息&#xff08;也称作令牌&#xff09;保存在客户端为了防止客户端的数据造假&#xff0c;保存在客户端的令牌经过了签名处理&#xf…

python3 ftplib乱码怎么解决

其实很简单。ftplib.FTP里面有个参数叫encoding。 如上图最后一行。所以在使用FTP时&#xff0c;主动指定编码格式即可。 ftp ftplib.FTP() ftp.encoding "utf-8" 再使用就可以了。