彩色圖像(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.pswp.cn/web/42734.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42734.shtml
英文地址,請注明出處:http://en.pswp.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;為啥會產生這樣…