Pytorch視覺化(顯示圖片)及格式轉換

Pi pixia.發表於2020-12-20

讀取RGB檔案:

  • matplotlib
import matplotlib.image as mpimg  # mpimg 用於讀取圖片
lena = mpimg.imread('lena.png')
  • cv2
import cv2
# cv2.imread()介面讀影像,讀進來直接是BGR 格式資料格式在 0~255,通道格式為(W,H,C)
img_BGR = cv2.imread('D:/Desktop/lena.jpg')
rgb = cv2.cvtColor(rgb, cv2.COLOR_BGR2RGB) #轉成RGB
rgb = np.transpose(rgb, [2, 0, 1]) # 進行tensor操作時需要將維度放到前面

讀取HSI檔案:

  • scipy
from scipy.io import loadmat
filenames_hyper = glob.glob(os.path.join(opt.data_path, 'NTIRE2020_Train_Spectral', '*.mat'))
for k in range(len(filenames_hyper)):
	mat = loadmat(filenames_hyper[k])
	hyper = np.float32(np.array(mat['cube']))
  • h5py(有時候會出問題)
import h5py
filenames_hyper = glob.glob(os.path.join(opt.data_path, 'NTIRE2020_Train_Spectral', '*.mat'))
for k in range(len(filenames_hyper)):
	mat = h5py.File(filenames_hyper[k], 'r')

在顯示圖片之前需要注意的幾個問題:

  1. 矩陣的shape:
    一般情況下是[ 行數, 列數, 維數 ](如[ 482, 512, 3 ]),這樣顯示出來會感覺不自然,但確實就是這樣,RGB檔案讀入時一般也是這樣。使用ToPILImage函式時要注意,詳見Pytorch顯示一個Tensor型別的圖片資料
  2. 資料型別是0-1的float型,還是0-255的int型或者uint8型:
    只要是浮點數,就會預設是0-1範圍內。
    只要是整形,就會預設取值範圍是2-255。
    下面會介紹Tensor和numpy如何進行資料型別的轉換;
  3. 注意要操作的矩陣是Tensor型別還是numpy型別。

顯示Tensor/numpy的資料型別:

a = torch.Tensor(1,2,3)
print(a.dtype)
print(a.numpy().dtype)

結果:

  • torch.float32
  • float32

Tensor進行資料型別的轉換:

a = torch.randn(10, 20, 3)

a = a.long()/half()/int()...
# torch.long() 將tensor投射為long型別
# torch.half()將tensor投射為半精度浮點型別
# torch.int()將該tensor投射為int型別
# torch.double()將該tensor投射為double型別
# torch.float()將該tensor投射為float型別
# torch.char()將該tensor投射為char型別
# torch.byte()將該tensor投射為byte型別
# torch.short()將該tensor投射為short型別

# 好像沒有uint8

Numpy進行資料型別的轉換:
astype()函式

a = np.random.randint(0, 255, 300)
# 在0-255(包括0,不包括255)範圍內產生300個隨機整形,是一個行向量哦!
a = a.reshape(10,10,3)
a = a.astype(np.uint8)
# .float/.int/...

NumPy 支援比 Python 更多種類的數值型別。 下表顯示了 NumPy 中定義的不同標量資料型別。

序號資料型別及描述
1.bool儲存為一個位元組的布林值(真或假)
2.int預設整數,相當於 C 的long,通常為int32或int64
3.int1616 位整數(-32768 ~ 32767)
4.int3232位整數(-32768 ~ 32767)
5.uint88 位無符號整數(0 ~ 255)
6.float16半精度浮點:符號位,5 位指數,10 位尾數
6.float32單精度浮點:符號位,8 位指數,23 位尾數
7.float64雙精度浮點:符號位,11 位指數,52 位尾數

顯示圖片:

import numpy as np
a = abs(torch.randn(10,20,3))*100
plt.imshow(a) # 顯示圖片
plt.axis('off') # 不顯示座標軸
plt.show()
# 顯示單通道,也就是熱力圖,也就是說可以用它來顯示HSI.mat檔案
plt.imshow(a[:,:,0]) 
plt.imshow(a[:,:,0], cmap='Greys_r') #顯示單通道黑白圖

相關文章