Python各種影象庫的影象的基本讀寫方式
目前主流的影象庫有幾下幾種:
- OpenCV 2. PIL(Pillow) 3. matplotlib.image 4. skimage 5. scipy.misc
結論:以上圖片庫中當屬OpenCV最為強大,成熟。
1.1 OpenCV 影象的讀取與儲存
import cv2 #讀取影象 直接是numpy矩陣格式 img = cv2.imread('horse.jpg',1) # 0表示讀入灰色圖片,1表示讀入彩色圖片 cv2.imshow('image',img) # 顯示影象 print(img.shape) # (height,width,channel) print(img.size) # 畫素數量 print(img.dtype) # 資料型別 print(img) # 列印影象的numpy陣列,3緯陣列 #儲存影象 # 當前目錄儲存 cv2.write(‘horse1.jpg',img) # 自定義儲存 cv2.write(‘/path_name/’ + str(image_name) + '.jpg',img) cv2.waitKey()
1.2OpenCV 影象灰化處理
import cv2 #方法一 img = cv2.imread('horse.jpg',0) # 0表示讀入灰色圖片,或者使用cv2.IMREAD_GRATSCALE 替代0 cv2.imshow('gray image',img) #方法二 img = cv2.imread('horse.jpg') gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) cv2.imshow('gray image',gray_img) print(gray_img.shape) # (height, width) print(gray_img.size) # 畫素數量 print(gray_img) # 列印影象的numpy陣列,2維 cv2.waitKey()
1.3 OpenCV 矩陣格式變換
Why?:OpenCV的矩陣格式 (height, width, channels) -->> 深度學習矩陣型別可能是 (channels,height,width) import cv2 import numpy as np img = cv2.imread('horse.jpg',1) cv2.imshow('image',img) # 矩陣格式的變換 print(img.shape) img = img.transpose(2,0,1) #變換函式 print(img.shape) # 矩陣擴充套件 (batch_size, channels, height, width) 預測單張圖片的操作 # 加一列作為圖片的個數 img = np.expand_dims(img, axis=0) #使用numpy函式 print(img.shape) # 訓練階段構建batch data_lst = [] loop: img = cv2.imread('xxx.jpg') data_lst.append(img) data_arr = np.array(data_lst)
1.4 OpenCV 圖片歸一化 (Data Normalization)
import cv2 # 為了減少計算量,需要把畫素值0-255轉換到0-1之間 img = cv2.imread('horse.jpg') img = img.astype('float') / 255.0 # 先轉化資料型別為float print(img.dtype) print(img)
1.5 OpenCV BRG轉換為RGB
import cv2 img = cv2.imread('horse.jpg') img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) # 轉為RGB format print(img)
1.6 OpenCV 訪問畫素點
import cv2 img = cv2.imread('horse.jpg') gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 轉為Gray image print(img[4,4]) # 3 channels print(gray_img[4,4]) # 1 channel
1.7 OpenCV 感興趣區域剪下(ROI)
import cv2 img = cv2.imread('horse.jpg') print(img.shape) roi = img[0:437,0:400] # [y:height,x:width] cv2.imshow('roi',roi) cv2.waitKey()
2.1 PIL 影象讀取與儲存
from PIL import Image import numpy as np #影象讀取 img = Image.open('horse.jpg') print(img.format) # 圖片格式 print(img.size) # (width,height) print(img.mode) # 圖片通道型別 #將影象轉化為矩陣格式 arr = np.array(img) print(arr.shape) print(arr.dtype) #影象儲存 new_img = Image.fromarray(arr) new_img.save('test.jpg') img.show()
2.2 PIL 影象灰化處理
#影象灰化處理 gray = Image.open('horse.jpg').convert('L') gray_arr = np.array(gray) print(gray_arr.shape) # (height,width) print(gray_arr.dtype) print(gray_arr) gray.show()
2.3 PIL 感興趣區域剪下
# 感興趣區域剪下 img = Image.open('horse.jpg') roi = img.crop((0,0,200,200)) # (左上x,左上y,右下x,右下y) roi.show()
2.4 通道操作
# 通道處理 r,g,b = img.split() #分離 img = Image.merge("RGB",(b,g,r)) #合併 img = img.copy() #複製
3.1 Matplotlib 讀取和儲存圖片
import matplotlib.pyplot as plt import numpy as np # 影象讀取為numpy陣列格式 img = plt.imread('horse.jpg') plt.axis('off') # 關閉刻度顯示 print(img.shape) # (height, width, channel) print(img.size) # 畫素數量 print(img.dtype) #儲存圖片 plt.savefig('./name.jpg') figure = plt.figure(figsize=(20,10)) # 調整顯示圖片的大小 plt.imshow(img) plt.show()
3.2 Matplotlib 圖片灰化處理
#圖片灰化處理 # 平均值發 img_mean = img.mean(axis=2) plt.imshow(img_mean,cmap='gray') plt.show() #最大值法 img_max = img.max(axis=-1) plt.imshow(img_max,cmap='gray') plt.show() #RGB三原色法 gravity = np.array([0.299,0.587,0.114]) img_gravity = np.dot(img,gravity) plt.imshow(img_gravity,cmap="gray") plt.show()
4.1 skimage 讀取和儲存影象
from skimage import io #讀取影象numpy陣列格式 img = io.imread('horse.jpg') print(img.shape) print(img.dtype) print(img.size) #print(img) io.imshow(img) #儲存影象 io.imsave('test.jpg',img)
4.2 skimage 灰化處理
#影象灰化處理並歸一化 img = io.imread('horse.jpg',as_gray=True) print(img.shape) print(img.dtype) # 資料型別位float print(img.size) print(img) io.imshow(img) io.show()
5.1 scipy.misc 讀取和儲存影象
#在1.2.0 之後統一用imageio模組 import imageio import matplotlib.pyplot as plt #讀取圖片為numpy陣列 img = imageio.imread('horse.jpg') print(img.dtype) print(img.size) # 畫素數量 print(img.shape) #(height, width, channels) plt.imshow(img) plt.show() print(img) #儲存圖片 imageio.imsave('test.jpg',img)