💪 專業從事且熱愛圖像處理,圖像處理專欄更新如下👇:
📝《圖像去噪》
📝《超分辨率重建》
📝《語義分割》
📝《風格遷移》
📝《目標檢測》
📝《暗光增強》
📝《模型優化》
📝《模型實戰部署》
目錄
- 一、報錯: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數據的詳細過程及代碼,希望能幫到你。
感謝您閱讀到最后!😊總結不易,多多支持呀🌹 點贊👍收藏?評論??,您的三連是我持續更新的動力💖
關注公眾號「視覺研坊」,獲取干貨教程、實戰案例、技術解答、行業資訊!