python基礎——讀取圖片
用於機器學習也好,深度學習也好,都需要讀取圖片的操作。
瞭解影象的mode
影象的模式定義了影象的型別和畫素的位寬。當前支援如下模式:
1:1位畫素,表示黑和白,但是儲存的時候每個畫素儲存為8bit。非黑即白
L:8位畫素,表示黑和白。在PIL中從模式轉換為L按照線面公式轉換 L = R * 299/1000 + G * 587/1000+ B * 114/1000
P:8位畫素,使用調色盤對映到其他模式。
RGB:3x8位畫素,為真彩色。
RGBA:4x8位畫素,有透明通道的真彩色。
CMYK:4x8位畫素,顏色分離。
YCbCr:3x8位畫素,彩色視訊格式。
I:32位整型畫素。灰色影象。(0,255)之間的數字表示不同的灰度。從模式轉為i模式的公式 I = R * 299/1000 + G * 587/1000 + B * 114/1000。結果與L結果完全一樣,只是L畫素是8bit,i畫素是32bit
F:32位浮點型畫素。與L轉換公式是一樣的,都是RGB轉為灰色值的公式,但模式F會保留小數部分
影象字尾名的轉換:
要注意的是:對於彩色影象,不管其格式是png,還是bmp,或者jpg,在PIL中,使用Image模組的open()函式開啟後,返回的影象物件的模式都是RGB,對於灰度影象,不管其影象格式是PNG,還是BMP,JPG,開啟後,其模式為L。
PNG BMP JPG彩色影象格式之間的轉換:可以通過Image模組的open函式和save函式,具體來說,在開啟這些影象時,PIL會將他們解碼成三通道的RGB影象。使用者可以基於RGB進行處理。處理完畢後可以將其處理結果儲存成PNG BMP JPG中任何格式。
PNG BMP JPG灰度影象格式之間的轉換,同理也可以通過類似途徑,只是解碼後時模式為L的影象。
python庫可以用來讀取圖片的庫
1. PIL.Image.open (首選)
from PIL import Image
import numpy as np
img_obj = Image.open(file_path)
img_array = np.array(img_obj, dtype=np.uint8)
無論是jpg還是png都能準確讀取,但不直接返回ndarray,open()函式開啟影象,但並不讀入,直到有操作發生
PIL.Image.open 不直接返回numpy物件,可以用numpy提供的函式進行轉換,參考
其他模組都直接返回numpy.ndarray物件,通道順序為RGB,通道值得預設範圍為0-255。
使用opencv讀取影象,直接返回numpy.ndarray 物件,通道順序為BGR ,注意是BGR,通道值預設範圍0-255
2. scipy.ndimage.imread
3. scipy.misc.imread
from scipy.misc import imread
data = imread(image_root)
#data是 ndarray物件
4. skimage.io.imread
from skimage.io import imread
img = imread(file_path)
5. cv2.imread
6. matplotlib.image.imread
import matplotlib.image import imread
data = imread(image_root)
#data是 ndarray物件