Pytorch讀取,載入影象資料(一)
在學習Pytorch的時候,先學會如何正確建立或者載入資料,至關重要。
有了資料,很多函式,操作的效果就變得很直觀。
本文主要用其他庫讀取影象檔案(學會這個,你就可以在之後的學習中,將一些效果直觀化)
更好的文章組織結構:
- Github
- 關注公眾號:tuduisuinian(土堆碎念),選單底部可以獲取pytorch教程PDF文件
零:準備
載入資料前,需要掌握正確的讀取路徑方法。很多教程中的例子,在講解的時候,沒有提供圖片,或者讀者不知道修改教程中的讀取路徑,打擊了熱情。
**建議:為了保證大家可以跟著教程一步一步練習,教程中會出現示例圖片,建議大家右鍵-另存為圖片,將圖片儲存到 你執行程式的資料夾 中。**如下圖:

壹:資料集的準備
任務:我們用不同的方式讀取這兩張圖片(記得右鍵-另存為圖片,儲存到程式所在位置,記得檔案重新命名為你喜歡的方式,我的重新命名為 002.jpg
和 003.jpg


將檔案另存為後,同時新建一個python檔案,我的效果如下:

接下來,我們就可以在 load_images.py
中,進行相關操作了。
貳:用其他庫讀取影象檔案
- 使用
matplotlib
庫進行影象的讀取
matplotlib
中的函式跟Matlab很像。
我們需要使用 matplotlib.pyplot
中的函式:
imread(檔案地址)
:進行讀取影象的操作(引數為讀取影象檔案的路徑)
imshow(陣列)
:進行影象的顯示操作(顯示影象的陣列)
show()
:顯示一個視窗,用於顯示影象(很多時候,不顯示影象的話,是忘記使用這個函式)
我們嘗試探討,影象被讀取後的資料型別,大小形狀
import matplotlib.pyplot as plt img = plt.imread('002.jpg') #圖片的高H為460,寬W為346,顏色通道C為3 print(img.shape) print(img.dtype) print(type(img)) plt.imshow(img) plt.show() 複製程式碼
輸出為:
(460, 346, 3) uint8 <class 'numpy.ndarray'> 複製程式碼
結論: imread
讀取的圖片為 numpy.ndarry
的陣列,陣列的大小排列為:高×寬×通道數,陣列的資料型別是 uint8
,即每個資料的大小為[0,255]
如果不想手動進行多影象的讀取,需要使用到Python的檔案,路徑操作等。暫不介紹
手動新增的話,就是用 [array1,array2]
這種形式,將陣列進行連線
import matplotlib.pyplot as plt img1 = plt.imread('002.jpg') img2 = plt.imread('003.jpg') img = [img1, img2] for i in img: plt.imshow(i) plt.show() 複製程式碼
- 使用
cv2
進行影象的讀取
在 cv2
庫中,需要用到的函式有:
imread(檔案地址)
:讀取地址處的檔案影象
imshow('視窗名稱', 影象陣列)
:將影象陣列顯示出來,但必須結合 waitKey()
使用,否則無法顯示影象
waitKey(延遲時間)
:需要設定延遲時間,當延遲時間≤0時,視窗將會一直延遲,延遲無窮長時間,按下任一按鍵,可以繼續執行下面程式。當延遲時間>0,即視窗影象會顯示對應毫秒後,自動消失。
import cv2 img1 = cv2.imread('002.jpg') print(img1.shape) print(img1.dtype) print(type(img1)) cv2.imshow('img', img1) cv2.waitKey(0) 複製程式碼
輸出為:
(460, 346, 3) uint8 <class 'numpy.ndarray'> 複製程式碼
結論:imread 讀取的圖片為
numpy.ndarry 的陣列,陣列的大小排列為:高×寬×通道數,陣列的資料型別是
uint8`,即每個資料的大小為[0,255]
Matplotlib與cv2對影象的資料格式的處理是相似的,但是也是有區別的:
對於通道的讀取,cv2是按BGR的順序讀入,而matplotlib按RGB的順序讀入
- 使用
PIL
庫進行影象處理
PIL
全稱為 Python Image Library
。是給Python提供影象處理相關的庫。
需要使用到的函式:
open(檔案地址)
:開啟檔案,注意是開啟,並沒有讀取。主要作用是保持檢查檔案地址,同時保證檔案是開啟的狀態。當對影象處理的時候,會自動載入。
show()
:使用系統自帶的影象檢視器,檢視影象
from PIL import Image img1 = Image.open('002.jpg') # 因為PIL有自己的資料結構,所以沒有shape,dtype屬性 # print(img1.shape) # print(img1.dtype) print(type(img1)) img1.show() 複製程式碼
輸出為:
<class 'PIL.JpegImagePlugin.JpegImageFile'> 複製程式碼
我們可以使用 numpy.array()
函式,將 PIL
結構的資料轉換成 numpy
陣列。
import matplotlib.pyplot as plt from PIL import Image import numpy as np img1 = Image.open('002.jpg') img1 = np.array(img1) print(img1.shape) print(img1.dtype) plt.imshow(img1) plt.show() 複製程式碼
輸出:
(460, 346, 3) uint8 複製程式碼
可以看到,PIL轉換成numpy後,資料型別是uint8的。
叄:總結
主要介紹了使用 matplotlib
, cv2
, PIL
庫進行影象檔案的讀取
-
matplotlib
中的imread
,imshow
,show
函式 -
cv2
中的imread
,imshow
,waitKey
函式 -
PIL
中的open
,show
函式