读取图像
import cv2
from PIL import Image
import numpy as np
img_path = r'path/to/img.jpg'
#PIL读取图片,数据类型:<PIL.PngImagePlugin.PngImageFile>
pil_img = Image.open(img_path)
#opencv读取图片,数据类型:<ndarray>
cv_img = cv2.imread(img_path) #非中文路径读取
cv_img = cv2.imdecode(np.fromfile(img_path,dtype=np.uint8),-1)#可包含中文路径读取
需要注意:PIL读取图像通道顺序为RGB,opencv读取的图像通道顺序为BGR。
获取图像大小
#PIL获取图像大小
w,h = pil_img.size
#或
h,w = np.array(pil_img).shape[:2]
#opencv获取图像大小
h,w = cv_img.shape[:2]
需要注意:PIL获取尺寸的顺序为宽w、高h,而opencv获取尺寸的顺序为高h、宽w。
转换通道顺序
#PIL转换通道为RGB
pil_img = pil_img.convert('RGB')
#opencv转换通道为RGB
cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
缩放图像
new_size = 224
#PIL使用双线性插值缩放图像
pil_img = pil_img.resize((new_size,new_size), Image.BILINEAR)
#opencv使用双线性插值缩放图像
cv_img = cv2.resize(cv_img,(new_size,new_size),interpolation = cv2.INTER_LINEAR)
需要注意:即使是同一输入图像,都选用双线性插值方式,PIL与opencv结果的图像像素也会有些微差别,如果是用于深度学习等模型训练预测,要特别注意。另外transforms.Resize就是PIL.Image.resize。